ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
# socket_create_pair * * * * * 说明: > 创建一对无名的套接字,并将它们存储在一个数组中,这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向s[0]中写入,就可以从s[1]中读取(只能从s[1]中读取),也可以在s[1]中写入,然后从s[0]中读取;但是,若没有在0端写入,而从1端读取,则1端的读取操作会阻塞,即使在1端写入,也不能从1读取,仍然阻塞;反之亦然...... 语法: ~~~ bool socket_create_pair ( int $domain , int $type , int $protocol , array &$fd ) ~~~ 参数: | 参数 | 描述 | | --- | --- | | domain | 为创建的套接字指定协议| | type | 套接字使用的类型| | protocol | 套接字使用的类型| | fd | 包含两个套接字资源的引用数组| domain,type,protocol参数具体选项可参考 https://www.kancloud.cn/mangyusisha/php/550787 返回值: | 成功 | 失败 | | --- | --- | | true | false | 返回失败,错误代码会传入 socket_last_error() ,如果将此参数传入 socket_strerror() 则可以得到错误的文字说明。 技术细节: PHP版本:PHP 4 >= 4.1.0, PHP 5, PHP 7 实例一:同进程的通讯 socket_create_pair_example.php ~~~ <?php $sockets = array(); // window 需要使用 AF_INET 协议 $domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX); //创建一对无名的套接字,并将它们存储在 $sockets 数组中 if (socket_create_pair($domain, SOCK_STREAM, 0, $sockets) === false) { echo "socket_create_pair failed. Reason: " . socket_strerror(socket_last_error()); } // 写入数据 $write_string = "ABCdef123\n"; $write_string_length = strlen($write_string); if (socket_write($sockets[0], $write_string, $write_string_length) === false) { echo "socket_write() failed. Reason: " . socket_strerror(socket_last_error($sockets[0])); } //读取 上面写入的数据 if (($read_string = socket_read($sockets[1], $write_string_length, PHP_BINARY_READ)) === false) { echo "socket_read() failed. Reason: " . socket_strerror(socket_last_error($sockets[1])); } var_dump($read_string); /* 关闭套接字 */ socket_close($sockets[0]); socket_close($sockets[1]); ~~~ 打开windows的cmd窗口,然后,运行php socket_create_pair_example.php ![](https://box.kancloud.cn/a0e132c56dd69ffb81f0a6b7df60a8b0_325x54.png) socket_create_pair创建的套接字可以进行双工通信,可以把$sockets[0]和$sockets[1]位置对调 运行程序也是一样的结果 实例二:不同进程直接的通讯(以下实例不能在window运行) socket_create_pair_ipc_example.php ~~~ $parent_message = '我是父级进程'; $child_message = '我是子进程'; $sockets = array(); // window 需要使用 AF_INET 协议 $domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX); //创建一对无名的套接字,并将它们存储在 $sockets 数组中 if (socket_create_pair($domain, SOCK_STREAM, 0, $sockets) === false) { echo "socket_create_pair failed. Reason: " . socket_strerror(socket_last_error()); } //创建一个新的进程(子进程) 子进程和父进程 从这里开始往下执行 $pid = pcntl_fork(); if ($pid == -1) { echo '错误,不能创建进程'; } elseif ($pid) { // 父进程 socket_close($sockets[0]); if (socket_write($sockets[1], $parent_message, strlen($parent_message)) === false) { echo "socket_write() failed. Reason: " . socket_strerror(socket_last_error($sockets[1])); } if (socket_read($sockets[1], strlen($child_message), PHP_BINARY_READ) == $child_message) { echo "父进程收到子进程信息: $child_message\n"; } socket_close($sockets[1]); } else { // 子进程 socket_close($sockets[1]); if (socket_write($sockets[0], $child_message, strlen($child_message)) === false) { echo "socket_write() failed. Reason: " . socket_strerror(socket_last_error($sockets[0])); } if (socket_read($sockets[0], strlen($parent_message), PHP_BINARY_READ) == $parent_message) { echo "子进程收到父进程信息: $parent_message\n"; } socket_close($sockets[0]); } ~~~ 在linux 中 运行php socket_create_pair_ipc_example.php ![](https://box.kancloud.cn/fca19b2e167bfc57829a34bc45d35c55_630x62.png) 注: 1、需要开启sockets和 pcntl 扩展 资料来源: http://php.net/manual/zh/function.socket-create-pair.php http://blog.51cto.com/liulixiaoyao/533469