• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fsockopenのソケットが全然分からないのです)

fsockopenのソケットとは?どうやって使う?

このQ&Aのポイント
  • ソケットとは、通信接続のためのエンドポイントを表すものです。
  • fsockopenの引数で指定されたホスト名、ポート番号、タイムアウト値を使用して通信接続を確立します。
  • fsockopenのメリットは、高度なネットワーキング機能を利用できることや、TCP/IPソケットを使ってデータを送信したり受信したりできることです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

【Q1】 ソケットて何ですか? 【A1】 ソケットの定義 http://e-words.jp/w/E382BDE382B1E38383E38388.html 「ソケットには、通信を行うアプリケーションソフトがTCP/IPを扱うための仮想的なインターフェースという意味もある。」 こっちの意味です。 【Q2】 この1行にどういう意味があるのでしょうか? 【A2】 fsockopen関数を用いて、www.example.com に ポート80 で接続要求。 通常、HTTPで接続する場合はほとんどのサーバーがポート80を要求する。 接続を最大30秒まで待つ。 それより長引いたら接続失敗とし、FALSEを返す。 それに伴い、$errnoにエラーコード、$errstrにエラーメッセージが代入される。 接続成功したとき、リソース(ファイルポインタ)を返す。 リソースはそのPHPスクリプトが終了するか、fclose関数で意図的に解放するまで使い続けられる。 リソース型について http://www.sakc.jp/blog/archives/8698 【Q3】 事前に通信エラーを確認? GETとかPOSTとかでエラー判定してはいけないのでしょうか? 【A3】 意味を取り違えています。 A4参照。 【Q4】 「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください 【A4】 そもそも$_GETや$_POSTで取得できるものは、「ブラウザ」(閲覧者)から送信された情報だけです。 [リクエスト] ブラウザ → 自サーバー <ブラウザ側> アドレス入力欄にURLを入れて、Enterを押すこと。 そこからの実際のリクエスト処理(リクエストヘッダー送信)は全部ブラウザがやってくれる。 このときはパラメータはGETで送られる。 フォームを用いて、ユーザーを押させて送信させることもでき、そのときはform要素のmethod属性で指定した方法(GETやPOST)が使われる。 <自サーバー> $_GETや$_POSTなどでクエリを受け取ることも出来る。 [レスポンス] ブラウザ ← 自サーバー <自サーバー> 普通にHTMLとして記述したものや、<?php?>内でechoするなどして出力したものをブラウザ側にHTMLとして返す。 <ブラウザ側> HTMLを解析し、Webページとして表示することは全部ブラウザがやってくれる。 一方、fsockopen関数は、「接続先サーバー」との通信に使います。 [リクエスト] 自サーバー → 接続先サーバー <自サーバー> fsockopen関数を使う場合、実際のリクエスト処理(リクエストヘッダー)を全て自分で記述しなければならない。 リクエストヘッダーはfwrite関数で送信する(書き込む)。 <接続先サーバー> $_GETや$_POSTなどでクエリを受け取ることも出来る。 [レスポンス] 自サーバー ← 接続先サーバー <接続先サーバー> 普通にHTMLとして記述したものや、<?php?>内でechoするなどして出力したものをブラウザ側にHTMLとして返す。 <自サーバー> fsockopen関数を使う場合、レスポンスはfgets関数を繰り返して取得する。 通常、feof関数がTrueを返すまで(ファイルポインタが末尾に達するまで)ループさせる。 ループが終わって、fgets関数で取得していった文字列を全て繋げると、レスポンスヘッダー(通信状態を記したもの)とレスポンスボディ(HTMLソース)が連続する2つの改行によって区切られていることが分かる。通常、これをexplode関数を使うなりして分割して使う。 【まとめ】 分かりやすく言えば、「ソケット通信をPHPスクリプトに記述する」ということは、「PHPスクリプトをあたかもブラウザのように動かす」、という言い方も出来るかもしれません。 【サンプルコード】 例: Yahoo!JAPANのトップページをfsockopen関数を用いて取得し、HTML特殊文字をエスケープして表示 http://ideone.com/kMxEIH

re97
質問者

お礼

詳しい説明ありがとうございました。 >そもそも$_GETや$_POSTで取得できるものは、「ブラウザ」(閲覧者)から送信された情報だけです ・ものすごく勘違いしていました ・大変参考になりましたー

関連するQ&A