stream_socket_client

インターネットドメインまたは Unix ドメインのソケット接続を開く

説明

resourcefalse stream_socket_client(
    string $address,
    int &$error_code = null,
    string &$error_message = null,
    floatnull $timeout = null,
    int $flags = STREAM_CLIENT_CONNECT,
    resourcenull $context = null
)

address で指定された接続先との、 ストリームまたはデータグラム接続を確立します。 作成されるソケットのタイプは、[トランスポート]://[ターゲット] という形式の URL フォーマットによって指定された トランスポートによって決定されます。 TCP や UDP といったインターネットドメインのソケット (AF_INET) には、address パラメータの ターゲット の部分は、ホスト名または IP アドレスと、 それに続くコロンで区切られたポート番号から構成されていなければなりません。 Unix ドメインのソケットの場合は、ターゲット の部分は、ファイルシステムにおけるソケットのファイルを指定しなくては いけません。

注意:

ストリームはデフォルトではブロックモードで開かれますが、 stream_set_blocking を使うことで非ブロックモードに 変更することができます。

パラメータ

address

接続するソケットのアドレス。

error_code

接続に失敗した場合にシステムレベルのエラー番号が設定されます。

error_message

接続に失敗した場合にシステムレベルのエラーメッセージが設定されます。

timeout

connect() システムコールがタイムアウトとなるまでの秒数。 デフォルトでは、 default_socket_timeout の値を使います。

注意: このパラメータが適用されるのは、非同期通信を試みていない場合のみです。

注意:

ソケット上のデータの読み書きに関してタイムアウトを設定する必要がある場合は、 stream_set_timeout を使ってください。 stream_socket_client に渡される timeout は、ソケットの接続時にのみ適用されます。

flags

接続設定フラグの任意の組み合わせを指定できるビットフィールドです。 現在、接続設定フラグとして選択できる値は、 STREAM_CLIENT_CONNECT(デフォルト)、 STREAM_CLIENT_ASYNC_CONNECTSTREAM_CLIENT_PERSISTENT のみです。

context

stream_context_create で作成した有効なコンテキストリソース。

戻り値

成功した場合に、 fgets, fgetss, fwrite, fclose, feof といった、ファイル関数と共に使うことのできるストリームリソースを返します。

エラー / 例外

失敗した場合は、error_codeerror_message に システムレベルの connect() 関数の実行時に発生したシステムレベルのエラーを表す値を返します。 もし、error_code に返された値が 0 で、かつ、 この関数が false を返した時は、 connect() システムコールの前に何らかのエラーが 発生したことを示しています。これは、多くの場合、ソケットの初期化 に失敗したことで起こります。error_codeerror_message パラメータは常に参照渡しされることに 留意してください。

変更履歴

バージョン 説明
8.0.0 timeoutcontext は、nullable になりました。

例1 stream_socket_client の例

<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>

例2 UDP 接続の使用

ローカルホスト上で動いている UDP サービスの "daytime" (ポート 13) で日時の情報を取得します。

<?php
$fp = stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
if (!$fp) {
    echo "ERROR: $errno - $errstr<br />\n";
} else {
    fwrite($fp, "\n");
    echo fread($fp, 26);
    fclose($fp);
}
?>

注意

警告

UDP ソケットは、リモートホストに到達できなくても エラーを発生せず、開いているかような状態になることがありす。 このエラーは、実際にソケットに対して、読み込みや書き込み動作を 行ってみないと判断できません。原因としては、UDP が非接続型の プロトコルであることが挙げられます。つまり、実際にデータを 送受信する段階になるまで、OS の側では接続を確立しようとしないという ことです。

注意: 数値で IPv6 アドレスを指定するときは、 (例 fe80::1) アドレスを角カッコでくくらなくてはなりません。たとえば、 tcp://[fe80::1]:80.

注意:

環境により、Unix ドメインや接続タイムアウトが利用できない場合があります。 有効なトランスポートのリストは、stream_get_transports で取得できます。組み込むのポートの一覧については、 サポートされるソケットトランスポートのリスト を参照ください。

参考

  • stream_socket_server
  • stream_set_blocking
  • stream_set_timeout
  • stream_select
  • fgets
  • fgetss
  • fwrite
  • fclose
  • feof
  • cURL 関数