# 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參數具體選項可參考
http://www.hmoore.net/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

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

注:
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算法