プロが教える店舗&オフィスのセキュリティ対策術

fsockopenのソケットについて教えてください

▽PHP: fsockopen - Manual
  http://php.net/manual/ja/function.fsockopen.php

>fsockopen("www.example.com", 80, $errno, $errstr, 30);

■質問
・ソケットて何ですか?
・この1行にどういう意味があるのでしょうか?
・事前に通信エラーを確認?
・GETとかPOSTとかでエラー判定してはいけないのでしょうか?
・「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください

■質問背景
・APIコード見てたら、この処理が書かれていたので、調べてみたけど意味が理解できず、質問しました

A 回答 (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
    • good
    • 1
この回答へのお礼

詳しい説明ありがとうございました。

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

お礼日時:2013/05/16 12:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A