ホームページ >バックエンド開発 >PHPチュートリアル >PHP はソケットを使用して POST メソッドをシミュレートします

PHP はソケットを使用して POST メソッドをシミュレートします

墨辰丷
墨辰丷オリジナル
2018-06-01 17:40:151710ブラウズ

この記事では、主にソケットを使用して POST をシミュレートする PHP の方法を紹介し、ソケットを介して POST をシミュレートする一般的なテクニックを例とともに分析します。必要な方は参考にしてください。今日、友人が POST リクエストをシミュレートする PHP ソケットの例を書いているのを見たので、私は PHP ソケットも実装できるとは思いませんでした。

以前は、PHP のcurl拡張機能を使用してポストリクエストをシミュレートしていましたが、PHPソケットも実装できるとは思いませんでした。最近関連情報に目を通したところ、post の原理と本質を完全には理解していませんでした。実際には、次のように post とマークされたプロトコル文字列を宛先プログラムに送信することです。

POST/宛先プログラムURL HTTP /1.1cAccept

: 受信情報フォーマット© REFERER
: URL Lai Road


Accept-Language

: 受信言語

Content-Type

: Application/X-WWW-FORM- urlencoded

Cookie

: Web サイトの Cookie、あまり説明する必要はありませんね?

ユーザーエージェント

: ユーザーエージェント、オペレーティングシステムとバージョン、CPU の種類、ブラウザとバージョン、その他の情報

Host

: 送信先のホストアドレス

Content-Length

: 送信データの長さ

Pragma

: ローカルキャッシュの有無

Cache-Control

: Webページかどうかキャッシュが必要です

Connection

: Connection status
username=fengdingbo&password=jb51.net //post によって送信されるデータ

データを送信するためのフォームの post メソッドについては、誰もが最もよく知っているはずです。たとえば、ユーザー名とパスワードを次のページに送信したいとします。特定のページで、対応する入力ボックスに入力し、送信ボタンをクリックして、最後に上記のデータを含むフォームをアクション プログラムに送信します。これを知っておけば、難しくないと思います

現時点では、phpソケットを使用してポート80などのポートを開き、このポートを使用して上記の情報を宛先プログラムに送信するだけです。

ポート上でソケットチャネルを確立するにはどうすればよいですか?

PHP ならとても簡単です!

公式プロトタイプ:


resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]] ]] )


以下は人間の理解です:

fsockopen (ホスト名、ポート番号、エラー番号の変数、エラープロンプトの変数、タイムアウト)
ホスト名はデータを送信する必要がある宛先です。

ポート番号は、宛先プログラムがデータを待機するポートです。

エラー番号の & 変数。ソケットの作成が失敗した場合に返されるエラー番号です。
エラー プロンプトの & 変数は、エラーがあります 返されるエラーメッセージ

タイムアウト時間は、データを投稿した後に相手が応答しない場合に待機する最長時間です。

何も予期せぬことが起こらなければ (fsockopen() 関数のパラメーターを正しく設定した場合)、ソケット チャネルは開かれています。次に行う必要があるのは、開いたこのチャネルを通じて宛先プログラムにポスト リクエスト プロトコルを送信することです。この時点で、fwrite または fputs 関数を使用して、fsockopen() によって開かれたリソース ハンドルに post リクエスト形式を送信できます。この時点で、優れたソケットのシミュレートされた post リクエストが生成されます。

コードは次のとおりです



<?php
/**
 * SOCKET扩展函数
 * @copyright (c) 2013
 * @author Qiufeng <fengdingbo@gmail.com>
 * @link http://www.jb51.net
 * @version 1.0
 */
 
/**
 * Post Request
 *
 * @param string $url 
 * @param array $data
 * @param string $referer
 * @return array
 */
if ( ! function_exists(&#39;socket_post&#39;))
{
 function socket_post($url, $data, $referer=&#39;&#39;)
 {
 if( ! is_array($data))
 {
 return;
 }
 
 $data = http_build_query($data);
 $url = parse_url($url);
 
 if ( ! isset($url[&#39;scheme&#39;]) || $url[&#39;scheme&#39;] != &#39;http&#39;)
 {
 die(&#39;Error: Only HTTP request are supported !&#39;);
 }
 
 $host = $url[&#39;host&#39;];
 $path = isset($url[&#39;path&#39;]) ? $url[&#39;path&#39;] : &#39;/&#39;;
 
 // open a socket connection on port 80 - timeout: 30 sec
 $fp = fsockopen($host, 80, $errno, $errstr, 30);
 
 if ($fp)
 {
 // send the request headers:
 $length = strlen($data);
 $POST = <<<HEADER
POST {$path} HTTP/1.1
Accept: text/plain, text/html
Referer: {$referer}
Accept-Language: zh-CN,zh;q=0.8
Content-Type: application/x-www-form-urlencodem 
Cookie: token=value; pub_cookietime=2592000; pub_sauth1=value; pub_sauth2=value
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
Host: {$host}
Content-Length: {$length}
Pragma: no-cache
Cache-Control: no-cache
Connection: closern
{$data}
HEADER;
 fwrite($fp, $POST);
 $result = &#39;&#39;;
 while(!feof($fp))
 {
 // receive the results of the request
 $result .= fread($fp, 512);
 }
 }
 else
 {
 return array(
  &#39;status&#39; => &#39;error&#39;,
  &#39;error&#39; => "$errstr ($errno)"
  );
 }
 
 // close the socket connection:
 fclose($fp);
 
 // split the result header from the content
 $result = explode("rnrn", $result, 2);
 
 // return as structured array:
 return array(
 &#39;status&#39; => &#39;ok&#39;,
 &#39;header&#39; => isset($result[0]) ? $result[0] : &#39;&#39;,
 &#39;content&#39; => isset($result[1]) ? $result[1] : &#39;&#39;
 );
 }
}
 
print_r(socket_post(&#39;http://www.jb51.net/&#39;, array(&#39;name=&#39;=>&#39;qiufeng&#39;,&#39;password&#39;=>md5(&#39;www.jb51.net&#39;))));
/* e.g: socket_post(&#39;http://www.jb51.net&#39;, array(&#39;name=&#39;=>&#39;qiufeng&#39;,&#39;password&#39;=>md5(&#39;jb51.net&#39;))); */
/* End of file socket_helper.php */


実際、ソケットチャネルが開いたときに、渡したCOOKIEが正しければ、(実行中のPHPコードのスクリーンショットは上からのものであり、私のユーザーname を実行した後に返される Web ページに が表示されます。これは、他の Web サイトが私がログインしていることを認識したことを示します) 投稿のブラッシングや返信など、さまざまなことができます。


上記では十分説得力がありません。画像のアップロードを実装するための php ソケットを見てみましょう

このコードには 2 つの注意点があります:

まず、これは http post リクエストです。 ;


2 番目は、フォームアップロードプロトコルです。

のコードは次のとおりです。

<?php 
 
  $remote_server = "jb51.net"; 
 
  $boundary = "---------------------".substr(md5(rand(0,32000)),0,10); 
   
  // Build the header 
  $header = "POST /api.php?action=twupload HTTP/1.0rn"; 
  $header .= "Host: {$remote_server}rn"; 
  $header .= "Content-type: multipart/form-data, boundary=$boundaryrn"; 
 
  /* 
  // attach post vars 
  foreach($_POST AS $index => $value){ 
   $data .="--$boundaryrn"; 
   $data .= "Content-Disposition: form-data; name="".$index.""rn"; 
   $data .= "rn".$value."rn"; 
   $data .="--$boundaryrn"; 
  } 
  */
  $file_name = "aaa.jpg"; 
  $content_type = "image/jpg"; 
 
  $data = &#39;&#39;; 
  // and attach the file 
  $data .= "--$boundaryrn"; 
 
  $content_file = file_get_contents(&#39;aaa.jpg&#39;); 
  $data .="Content-Disposition: form-data; name="userfile"; filename="$file_name"rn"; 
  $data .= "Content-Type: $content_typernrn"; 
  $data .= "".$content_file."rn"; 
  $data .="--$boundary--rn"; 
 
  $header .= "Content-length: " . strlen($data) . "rnrn"; 
     // Open the connection 
 
 
  $fp = fsockopen($remote_server, 80); 
  // then just 
  fputs($fp, $header.$data); 
  // reader 
 
 while (!feof($fp)) { 
  echo fgets($fp, 128); 
 } 
 
fclose($fp);


この記事の内容全体が、皆さんのヘルプの学習に役立つことを願っています。関連する推奨事項:php
現在のURLアドレスを取得する方法操作クラスと使い方を詳しく解説



以上がPHP はソケットを使用して POST メソッドをシミュレートしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。