最近、私たちは .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)、上海、中国。*/class HttpRequest{var $sHostAdd;var $sUri;var $iPort;var $sRequestHeader;var $sResponse ;function HttpRequest($sUrl){$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i' ;$arMatchUrlPart = array();preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);if (empty($arMatchUrlPart[4])){$this- >sUri = '/';}else{$this->sUri = $arMatchUrlPart[4];}if (empty($arMatchUrlPart[3])){$this->iPort = 80;}else{$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-urlencoded rn";$sRequest .= "Content-Length: ".strlen($sPostData)."rn";$sRequest .= "rn";$sRequest .= $sPostData." rn";}$sRequest .= "rn";$sockHttp =socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if (!$sockHttp){die('socket_create() 失敗しました!');}$resSockHttp =socket_connect($sockHttp, $this->sHostAdd, $this->iPort);if (!$resSockHttp){die('socket_connect() が失敗しました!');}socket_write($sockHttp, $sRequest, strlen($sRequest) ));$this->sResponse = '';while ($sRead =socket_read($sockHttp, 4096)){$this->sResponse .= $sRead;}socket_close($sockHttp);}関数 getResponse(){return $this->sResponse;}function getResponseBody(){$sPatternSeperate = '/rnrn/';$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);return $arMatchResponsePart[1 ];}関数 getResponseHead(){$sPatternSeperate = '/rnrn/';$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);return $arMatchResponsePart[0];}} ?>