socket_create_pair
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_create_pair — 区別できないソケットの組を作成し、配列に保存する
説明
socket_create_pair
( int $domain
, int $type
, int $protocol
, array &$fd
) : bool
socket_create_pair() は、接続されており区別できない
2 つのソケットを作成し、それを fd
に保存します。
この関数は、一般に IPC(InterProcess Communication: プロセス間通信)
で使用します。
パラメータ
domain
domain
は、ソケットで使用するプロトコルの種類を指定します。 完全な一覧は socket_create() を参照ください。type
type
では、ソケットが使用する通信の形式を選択します。 完全な一覧は socket_create() を参照ください。protocol
protocol
は、指定したdomain
の中の特定のプロトコルを指定します。これは、返されるソケットとの通信に使用されます。 使用可能な値の名前は getprotobyname() で取得可能です。もし要求されるプロトコルが TCP あるいは UDP の場合、 対応する定数SOL_TCP
およびSOL_UDP
も使用可能です。サポートするプロトコルの完全な一覧は socket_create() を参照ください。
fd
2 つのソケットリソースが格納される配列への参照。
返り値
成功した場合に true
を、失敗した場合に false
を返します。
例
例1 socket_create_pair() の例
<?php$sockets = array();/* Windows では AF_INET を使う必要があります */$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);/* ソケットの組の設定 */if (socket_create_pair($domain, SOCK_STREAM, 0, $sockets) === false) { echo "socket_create_pair failed. Reason: ".socket_strerror(socket_last_error());}/* データの送受信 */if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) { echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($sockets[0]));}if (($data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) { echo "socket_read() failed. Reason: ".socket_strerror(socket_last_error($sockets[1]));}var_dump($data);/* ソケットのクローズ */socket_close($sockets[0]);socket_close($sockets[1]);?>
例2 socket_create_pair() での IPC の例
<?php$ary = array();$strone = 'Message From Parent.';$strtwo = 'Message From Child.';if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) { echo "socket_create_pair() failed. Reason: ".socket_strerror(socket_last_error());}$pid = pcntl_fork();if ($pid == -1) { echo 'プロセスを fork できません。';} elseif ($pid) { /* 親プロセス */ socket_close($ary[0]); if (socket_write($ary[1], $strone, strlen($strone)) === false) { echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($ary[1])); } if (socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) { echo "Received $strtwo\n"; } socket_close($ary[1]);} else { /* 子プロセス */ socket_close($ary[1]); if (socket_write($ary[0], $strtwo, strlen($strtwo)) === false) { echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($ary[0])); } if (socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) { echo "Received $strone\n"; } socket_close($ary[0]);}?>
参考
- socket_create() - ソケット(通信時の終端)を作成する
- socket_create_listen() - 接続を受けつけるためにポートにソケットをオープンする
- socket_bind() - ソケットに名前をバインドする
- socket_listen() - ソケット上で接続待ち(listen)する
- socket_last_error() - ソケットの直近のエラーを返す
- socket_strerror() - ソケットエラーの内容を文字列として返す