ホームページ  >  記事  >  バックエンド開発  >  PHP ソケット シミュレーション POST リクエストの例_PHP チュートリアル

PHP ソケット シミュレーション POST リクエストの例_PHP チュートリアル

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

最も一般的に使用されるシミュレートされた POST リクエストは、ほとんどすべて phpcurl を使用して実装されています。今日、友人が記事を書いているのを見ました。ここで、PHP ソケットのシミュレートされた POST の例を共有します。リクエスト。 。

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

POST/宛先プログラムURL HTTP/1.1
承諾: 情報フォーマットを受信します
リファラー: URL の発信元
Accept-Language: 言語を受け入れます
コンテンツタイプ: application/x-www-form-urlencoded
Cookie: ウェブサイトの Cookie については、あまり説明する必要はありませんね
ユーザーエージェント: ユーザーエージェント、オペレーティングシステムとバージョン、CPU タイプ、ブラウザとバージョン、その他の情報
ホスト: 送信先のホストアドレス
Content-Length: 送信されるデータの長さ
プラグマ: ローカル キャッシュはありますか? キャッシュ制御: Web ページのキャッシュが必要ですか
接続: 接続ステータス
username=fengdingbo&password=bKjia.c0m //送信されたデータを投稿します

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

現時点では、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() で開かれたリソース ハンドルにポスト リクエストの形式を送信することができます。この時点で、素晴らしいソケット シミュレートされたポスト リクエストが生まれます。

代码如下 复制幣

/**
 * SOCKET扩展関数数
 * @copyright (c) 2013
 * @author Qiufeng
 * @link http://www.bKjia.c0m
 * @バージョン 1.0
 */
 
/**
 *投稿リクエスト
 *
 * @param 文字列 $url
 * @param array $data
 * @param string $referer
 * @return 配列
 */
if ( ! function_exists('socket_post'))
{
 関数ソケット_ポスト($url, $data, $referer='')
 {
  if( ! is_array($data))
  {
   戻ります;
  }
 
  $data = http_build_query($data);
  $url = parse_url($url);
 
  if ( ! isset($url['scheme']) || $url['scheme'] != 'http')
  {
   die('エラー: HTTP リクエストのみがサポートされています !');
  }
 
  $host = $url['ホスト'];
  $path = isset($url['path']) ? $url['パス'] : '/';
 
  // ポート 80 でソケット接続を開きます - タイムアウト: 30 秒
  $fp = fsockopen($host, 80, $errno, $errstr, 30);
 
  if ($fp)
  {
   // リクエストヘッダーを送信します:
   $length = strlen($data);
   $POST = << POST {$path} HTTP/1.1
受け入れる: text/plain、text/html
リファラー: {$referer}
受け入れ言語: zh-CN,zh;q=0.8
コンテンツタイプ: application/x-www-form-urlencodem
Cookie: トークン=値; pub_cookietime=2592000; pub_sauth1=値; pub_sauth2=値
ユーザーエージェント: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML、Gecko など) Chrome/24.0.1312.56 Safari/537.17
ホスト: {$host}
コンテンツの長さ: {$length}
プラグマ: キャッシュなし
キャッシュ制御: キャッシュなし
つながり: 近づく
{$データ}
ヘッダー;
   fwrite($fp, $POST);
   $結果 = '';
   while(!feof($fp))
   {
    // リクエストの結果を受け取ります
    $result .= fread($fp, 512);
   }
  }
  それ以外
  {
   配列を返します(
     'ステータス' => 「エラー」、
     'エラー' => "$errstr ($errno)"
     );
  }
 
  // ソケット接続を閉じます:
  fclose($fp);
 
  // 結果ヘッダーをコンテンツから分割します
  $result =explode("rnrn", $result, 2);
 
  // 構造化配列として返す:
  配列を返します(
    'ステータス' => 「わかりました」
    'ヘッダー' => isset($result[0]) ? $result[0] : '',
    'コンテンツ' => isset($result[1]) ? $result[1] : ''
    );
 }
}
 
print_r(socket_post('http://hzhuti.com/', array('name='=>'qiufeng','password'=>md5('www.bKjia.c0m'))));
/* 例: socket_post('http://www.bKjia.c0m', array('name='=>'qiufeng','password'=>md5('bKjia.c0m'))); */
/* ファイルの終わりソケット_helper.php */

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

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

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

まず、http 投稿リクエストです

2 つ目はフォームアップロード同意書です。

文字列の下のリクエストはどの言語にも適しています。

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

$remote_server = "bKjia.c0m";
$boundary = "---------------------".substr(md5(rand(0,32000)),0,10);                                        // ヘッダーを構築します
$header = "POST /api.php?action=twupload HTTP/1.0rn"; $header .= "ホスト: {$remote_server}rn"; $header .= "コンテンツタイプ: multipart/form-data、boundary=$boundaryrn";
/*
// ポスト変数を添付します
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 = "画像/jpg";
$data = ''; // ファイルを添付します
$data .= "--$boundaryrn";
$content_file = file_get_contents('aaa.jpg'); $data .="Content-Disposition: form-data; name="userfile"; filename="$file_name"rn"; $data .= "コンテンツタイプ: $content_typernrn"; $data .= "".$content_file."rn"; $data .="--$boundary--rn";
$header .= "コンテンツの長さ: " .strlen($data) . // 接続を開きます


$fp = fsockopen($remote_server, 80); // あとは
fputs($fp, $header.$data); // リーダー

ながら (!feof($fp)) {
エコー fgets($fp, 128); }

fclose($fp);






www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/633062.html技術記事最も一般的に使用されるシミュレートされた POST リクエストは、ほとんどすべて PHP ソケットを使用して実装されるとは考えていませんでした。今日、友人が記事を書いているのを見ました...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。