stream_socket_client
(PHP 5, PHP 7, PHP 8)
stream_socket_client — インターネットドメインまたは Unix ドメインのソケット接続を開く
説明
string
$address
,int
&$error_code
= null
,string
&$error_message
= null
,?float
$timeout
= null
,int
$flags
= STREAM_CLIENT_CONNECT
,?resource
$context
= null
): resource|false
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_CONNECT
とSTREAM_CLIENT_PERSISTENT
のみです。 context
-
stream_context_create() で作成した有効なコンテキストリソース。
エラー / 例外
失敗した場合は、error_code
と
error_message
に
システムレベルの connect()
関数の実行時に発生したシステムレベルのエラーを表す値を返します。
もし、error_code
に返された値が 0
で、かつ、 この関数が false
を返した時は、
connect()
システムコールの前に何らかのエラーが
発生したことを示しています。これは、多くの場合、ソケットの初期化
に失敗したことで起こります。error_code
と
error_message
パラメータは常に参照渡しされることに
留意してください。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 |
timeout と
context は、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() - インターネットドメインまたは Unix ドメインのサーバーソケットを作成する
- stream_set_blocking() - ストリームのブロックモードを有効にする / 解除する
- stream_set_timeout() - ストリームにタイムアウトを設定する
- stream_select() - select() システムコールと同等の操作を、 ストリームの配列に対して seconds と microseconds で指定されたタイムアウト時間をもって行う
- fgets() - ファイルポインタから 1 行取得する
- fgetss() - ファイルポインタから 1 行取り出し、HTML タグを取り除く
- fwrite() - バイナリセーフなファイル書き込み処理
- fclose() - オープンされたファイルポインタをクローズする
- feof() - ファイルポインタがファイル終端に達しているかどうか調べる
- cURL 関数
User Contributed Notes 2 notes
For those wanting to use stream_socket_client() to connect to a local UNIX socket who can't find documentation on how to do it, here's a (rough) example:
<?php
$sock = stream_socket_client('unix:///full/path/to/my/socket.sock', $errno, $errstr);
fwrite($sock, 'SOME COMMAND'."\r\n");
echo fread($sock, 4096)."\n";
fclose($sock);
?>
The remote_socket argument, in its end (well... after the port), can also contain a "/" followed by a unique identifier. This is especially useful if you want to create multiple persistent connections to the same transport://host:port combo.
Example:
<?php
$socket = stream_socket_client('tcp://mysql.example.com:3306/root', $errorno, $errorstr, $timeout, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
?>
Note that while (p)fsockopen() follows a similar scheme, it doesn't have this particular feature.