ホームページ >バックエンド開発 >PHPチュートリアル >PHP ソケット プログラミングを使用して Http post および get リクエストをシミュレートする、socketget_PHP チュートリアル

PHP ソケット プログラミングを使用して Http post および get リクエストをシミュレートする、socketget_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:13:08965ブラウズ

PHP ソケット プログラミングを使用して、HTTP の投稿とリクエストの取得をシミュレートします (socketget)。

ここでは、PHP ソケット プログラミングを使用して HTTP リクエストをシミュレートするコードを共有したいと思います。これは非常に実用的です。最後に、HTTP リクエストをシミュレートするいくつかの方法について説明します。

コードをコピーします コードは次のとおりです:

* 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);
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/917040.html技術記事 PHP ソケット プログラミングを使用して Http post および get リクエストをシミュレートします。 ここでは、PHP Socket プログラミングを使用して Http post および get リクエストをシミュレートするコードを紹介します。これは非常に実用的です。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。