# 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
- 前言
- 函数参考
- Socket 函数
- socket_accept
- socket_bind
- socket_clear_error
- socket_close
- socket_connect
- socket_create_listen
- socket_create_pair
- socket_create
- socket_getpeername
- socket_getsockname
- socket_last_error
- socket_listen
- socket_read
- socket_recv
- socket_select
- socket_send
- socket_set_block
- socket_set_nonblock
- SplQueue
- 魔术方法
- 魔术常量
- 杂项
- backlog的用处
- new self()和new static()的区别
- PHP变量的生命周期
- PHP抽象类
- 对象接口
- PHP中的常用关键字
- 常量
- 内存泄露
- global 与 $GLOBAL
- 简单说明CGI和动态请求是什么
- 设计模式
- 单例模式
- 工厂模式
- 适配器模式
- 策略模式
- 观察者模式
- 控制反转IoC简介
- session
- use_trans_sid
- auto_start
- session_id
- cookie_secure
- 面试
- 数据库相关
- 语句相关
- 索引相关
- 字段相关
- PHP相关
- 字符串相关
- 函数相关
- 运算符优先级相关
- 错误相关
- redis相关
- 10个常见的Redis面试"刁难"问题
- mysql
- MySQL中的锁
- MySQL存储引擎MyISAM 和 InnoDB的区别
- MySQL半同步复制
- explain 命令详解
- 索引
- 数据库事务
- MySQL和B树的那些事
- git
- github----向开源框架提交pr的过程
- 推荐博客
- linux
- 命令
- free
- 高并发
- 抢购/秒杀功能
- 算法
- 一致性Hash算法