最近、私たちは .NET クラス ライブラリの WebHttpRequest クラスと共通オブジェクト Microsoft.XMLHTTP を主に使用して、C# を介して Web をシミュレートするプログラムを作成しました。 ASP および Javascript クライアントは他の Web ページにアクセスします。しかし今日はPHPを使って同様の機能を実装したいと思ったのですが、なかなか方向性が見つからず、自分で「衣食足りる」しかありませんでした。
現在のところ、PHP には HttpRequest に似たクラスはありません。しかし、公式オンライン ドキュメントで HttpRequest クラスのページを見つけましたが、残念なことに、この関数は CVS バージョンにのみ存在する可能性があるとのみ記載されていました
。 HTTP アクセスは、Socket を使用してリクエストを送信し、返された情報を読み取ることに他なりません。そこで、Socket を使用して HttpRequest クラスを作成しました。もちろん、fsockopen() 関数を使用して実装することもできます。ただし、この 2 つの違いはそれほど大きくありません。詳細は添付ファイルを参照してください。
<?php
/**
* ネットワーク: HTTP リクエスト オブジェクト
* 著者: Li HouYu (Karajan Lee)、中国、上海。
*/
クラス HttpRequest{
var $sHostAdd;
var $sUri;
var $iPort;
var $sRequestHeader;
var $sResponse;
関数 HttpRequest($sUrl){
$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i';
$arMatchUrlPart = 配列();
preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);
if (empty($arMatchUrlPart[4])){
$this->sUri = '/';
}それ以外{
$this->sUri = $arMatchUrlPart[4];
}
if (empty($arMatchUrlPart[3])){
$this->iPort = 80;
}それ以外{
$this->iPort = $arMatchUrlPart[3];
}
$this->addRequestHeader('ホスト: '.$arMatchUrlPart[1]);
$this->addRequestHeader('接続: 閉じる');
}
関数 addRequestHeader($sHeader){
$this->sRequestHeader .= トリム($sHeader)."rn";
}
関数 sendRequest($sMethod = 'GET', $sPostData = ''){
$sRequest = $sMethod." ".$this->sUri." HTTP/1.1rn";
$sRequest .= $this->sRequestHeader;
if ($sMethod == 'POST'){
$sRequest .= "Content-Type: application/x-www-form-urlencodedrn";
$sRequest .= "コンテンツの長さ: ".strlen($sPostData)."rn";
$sRequest .= "rn";
$sRequest .= $sPostData."rn";
}
$sRequest .= "rn";
$sockHttp = ソケット作成(AF_INET、SOCK_STREAM、SOL_TCP);
if (!$sockHttp){
die('socket_create() が失敗しました!');
}
$resSockHttp = ソケット接続($sockHttp, $this->sHostAdd, $this->iPort);
if (!$resSockHttp){
die('socket_connect() が失敗しました!');
}
ソケット書き込み($sockHttp, $sRequest, strlen($sRequest));
$this->sResponse = '';
while ($sRead = ソケット読み取り($sockHttp, 4096)){
$this->sResponse .= $sRead;
}
ソケットクローズ($sockHttp);
}
関数 getResponse(){
$this->sResponse を返します。
}
関数 getResponseBody(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
$arMatchResponsePart[1] を返します。
}
関数 getResponseHead(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
$arMatchResponsePart[0]を返します;
}
}
?>