
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コード見てたら、この処理が書かれていたので、調べてみたけど意味が理解できず、質問しました
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
詳しい説明ありがとうございました。
>そもそも$_GETや$_POSTで取得できるものは、「ブラウザ」(閲覧者)から送信された情報だけです
・ものすごく勘違いしていました
・大変参考になりましたー
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- その他(車) パイオニアのカーナビAVIC-MRP006のシガーソケットについて 3 2023/05/22 09:27
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Windows 10 Fドライブは「赤丸の中にレ点マーク」が付いているのは何故ですか 1 2023/05/30 21:31
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Cにおける通信プログラミングの...
-
TCP/IP通信時のサーバーからの受信
-
送信したデータの一部が文字化...
-
UDPの接続って?
-
UDP通信におけるbind関数について
-
【ajax】 XMLHttpRequestオブジ...
-
Socket通信の0バイト受信について
-
winsockでファイル転送
-
ソケット通信 同じポート番号...
-
socketプログラミングについて
-
UDP通信する時に、相手にどうや...
-
WinSockでチャット
-
VB6のwinsockでconnectできない
-
MFCソケットについて
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
Javascritpでソケット通信?
-
Connectエラーが出てしまう・・...
-
ソケット通信
-
Winsockで接続待ちタイムアウト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
Socket通信の0バイト受信について
-
VB6のwinsockでconnectできない
-
ソケットでクライアントのipア...
-
ソケットを用いた1対多通信につ...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
相手のIPアドレスを取得する方法
-
recv関数でフリーズしてしまう
-
closeされたsocketへの動作につ...
-
送信したデータの一部が文字化...
-
UDP通信(SNMP)したいが、うま...
-
ソケット通信
-
Connectエラーが出てしまう・・...
-
WinSockでの通信プログラムがう...
おすすめ情報