コードは次のとおりです:
* PHP ソケット プログラミングを使用して、HTTP 投稿をシミュレートし、リクエストを取得します
* @著者コマ
*/ クラス HTTP{
プライベート $sp = "rn"; //这里必须要書成双引号 private $protocol = 'HTTP/1.1';
プライベート $requestLine = "";
プライベート $requestHeader = "";
プライベート $requestBody = "";
プライベート $requestInfo = "";
プライベート $fp = null;
プライベート $urlinfo = null;
プライベート $header = array();
プライベート $body = "";
プライベート $responseInfo = "";
プライベート静的 $http = null; //HTTP对象单例
プライベート関数 __construct() {}
パブリック静的関数 create() {
if ( self::$http === null ) {
self::$http = 新しい Http();
}
自分自身を返します::$http;
}
パブリック関数 init($url) {
$this->parseurl($url);
$this->header['ホスト'] = $this->urlinfo['ホスト'];
$this を返します。
}
パブリック関数 get($header = array()) {
$this->header = array_merge($this->header, $header);
return $this->request('GET');
}
パブリック関数 post($header = array(), $body = array()) {
$this->header = array_merge($this->header, $header);
if ( !empty($body) ) {
$this->body = http_build_query($body);
$this->header['Content-Type'] = 'application/x-www-form-urlencoded';
$this->header['Content-Length'] = strlen($this->body);
}
return $this->request('POST');
}
プライベート関数リクエスト($method) {
$header = "";
$this->requestLine = $method.' '.$this->urlinfo['path'].'?'.$this->urlinfo['query'].' '.$this->プロトコル;
foreach ( $this->header as $key => $value ) {
$header .= $header == "" ? $key.':'.$value : $this->sp.$key.':'.$value;
}
$this->requestHeader = $header.$this->sp.$this->sp;
$this->requestInfo = $this->requestLine.$this->sp.$this->requestHeader;
if ( $this->body != "" ) {
$this->requestInfo .= $this->body;
}
/*
* 注意: ここの fsockopen 中の URL パラメーターの形式は "www.xxx.com" です
* 不可够带"http://"这种
*/
$port = isset($this->urlinfo['port']) ? isset($this->urlinfo['port']) : '80';
$this->fp = fsockopen($this->urlinfo['host'], $port, $errno, $errstr);
if ( !$this->fp ) {
echo $errstr.'('.$errno.')';
false を返します。
}
if ( fwrite($this->fp, $this->requestInfo) ) {
$str = "";
while ( !feof($this->fp) ) {
$str .= fread($this->fp, 1024);
}
$this->responseInfo = $str;
}
fclose($this->fp);
$this->responseInfoを返します;
}
プライベート関数 parseurl($url) {
$this->urlinfo = parse_url($url);
}
} // $url = "http://news.163.com/14/1102/01/AA0PFA7Q00014AED.html";
$url = "http://localhost/httppro/post.php"; $http = Http::create()->init($url); /* 送信get请要求
echo $http->get(array(
'ユーザーエージェント' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/35.0.1916.153 Safari/537.36',
));
*/
/* 送信post请要求 */ echo $http->post(array(
'ユーザーエージェント' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/35.0.1916.153 Safari/537.36',
), array('username'=>'发一个中文', 'age'=>22));
php模拟 http请求
方法 1: PHP のソケット プロセスを利用して、インターフェイスから直接データを送信し、ポストの操作を模倣します。
建立两个文件post.php,getpost.php
post.php内容如下:
复制代価代価如下:
$flag = 0;
$params = '';
$errno = '';
$errstr = '';
//要投稿のデータ
$argv = 配列(
'var1'=>'abc',
'var2'=>'友人、調子はどうですか??');
//造要投稿の文字串
foreach ($argv as $key=>$value) {
if ($flag!=0) {
$params .= "&";
$flag = 1;
}
$params.= $key."=; $params.= urlencode($value);
$flag = 1;
}
$length = strlen($params);
//ソケット接続
$fp = fsockopen("localhost",81,$errno,$errstr,10) または exit($errstr."--->".$errno);
//構築投稿要求の头
$header = "POST /flandy/getpost.php HTTP/1.1rn";
$header .= "ホスト:127.0.0.1rn";
$header .= "リファラー:/flandy/post.phprn";
$header .= "Content-Type: application/x-www-form-urlencodedrn";
$header .= "コンテンツの長さ: ".$length."rn";
$header .= "接続: 閉じるrnrn";
//追加投稿の文字串
$header .= $params."rn";
//投稿データを送信します
fputs($fp,$header);
$inheader = 1;
while (!feof($fp)) {
$line = fgets($fp,1024); //削除要求パケットの头のみ表示面の戻り回数
if ($inheader && ($line == "n" || $line == "rn")) {
$inheader = 0;
}
if ($inheader == 0) {
エコー $line;
}
}
fclose($fp);
?>
getpost.phpの内容は以下の通り
复制代価代価如下:
echo "これは投稿されたデータです";
echo "
";<br>
print_r($_REQUEST);<br>
echo "
";
?>
结果输出:
复制代価代価如下:
投稿されたデータはArrayです
(
[var1] => abc
[var2] => 友達、元気ですか??
)
上記のコードは、このマシンのポート 81 でのテストに合格しました。
方法 2:
PHP のcurl 拡張機能または HttpClient.class.php クラスを使用します。これら 2 つは非常に似ています。curl 実装コードは以下にリストされています。
2 つのファイル post2.php と getpost2.php
post2.phpの内容は以下の通りです:
コードをコピーします コードは次のとおりです:
$psecode = 'NDE005';
$website = 'www.baidu.com';
$amt = 1;
$pwd = 123456;
$ch =curl_init();
$curl_url = "http://localhost:81/flandy/getpost2.php?web=" .
"&pwd=" . $pwd=" &action=check&pseid=" .
"&amt= . $amt;
curl_setopt($ch, CURLOPT_URL, $curl_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURTRANSFER, 1);//直接出力せず、変数に戻ります
$curl_result =curl_exec($ch);
$result =explode(',', $curl_result);
curl_close($ch);
print_r($result);
?>
getpost2.phpの内容は以下の通りです:
コードをコピーします コードは次のとおりです:
echo "returndata
";
echo "
";<br>
print_r($_REQUEST);<br>
echo "
";
?>
結果出力:
コードをコピーします コードは次のとおりです:
配列 ([0] => returndataArray
)
(
[ウェブ] =>「www百度コム」
[パスワード] => 123456
[アクション] =>チェック
[psid] =>「NDE005」
[午前] => 1
)
)
方法 3:
これには、サードパーティのクラス ライブラリ HttpClient の助けが必要です。これは、ここからダウンロードできます: http://scripts.incutio.com/httpclient/
コードをコピーします コードは次のとおりです:
<?php
require_once 'HttpClient.class.php';
$params = array('web' => 'www.baidu.com',
'pwd' => '123456',
'アクション' => 'チェック',
'psid' => 'NDE005',
'amt' => 1);
$pageContents = HttpClient::quickPost('http://localhost:81/flandy/getpost3.php', $params);
$result =explode(',', $pageContents);
print_r($result);
?>
http://www.bkjia.com/PHPjc/917040.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/917040.html技術記事 PHP ソケット プログラミングを使用して Http post および get リクエストをシミュレートします。 ここでは、PHP Socket プログラミングを使用して Http post および get リクエストをシミュレートするコードを紹介します。これは非常に実用的です。