php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種:訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理:
管道通訊pipe
管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然後程序b從管道p中讀取資料。php提供的管道操作api與操作檔案的api基本一樣,除了建立管道使用posix_mkfifo函式,讀寫等操作均與檔案操作函式相同。當然,你可以直接使用檔案模擬管道,但是那樣無法使用管道的特性了。
通過管道通訊的大概思路是,首先建立乙個管道,然後子程序向管道中寫入資訊,父程序從管道中讀取資訊,這樣就可以做到父子程序直接實現通訊了。
// 建立管道
$pipepath = "pipe";
if( !file_exists( $pipepath ) )else\n";
$childlist = array();
// 建立訊息佇列,定義訊息型別
$id = ftok(__file__, 'm');
$msgqueue = msg_get_queue($id);
const msg_tyep = 1;
// 生產者
function producer()
global $msgqueue;
$pid = posix_getpid();
$repeatnum = 5;
for ($i = 0; $i <= $repeatnum; $i++) ) progress create! ";
msg_send($msgqueue, msg_tyep, $str);
$rand = rand(1, 3);
sleep($rand);
// 消費者
function consumer()
global $msgqueue;
$pid = posix_getpid();
$repeatnum = 6;
for ($i = 1; $i<= $repeatnum; $i++) | consumer() destroy \n";
$rand = rand(1, 3);
sleep($rand);
function createprogress($callback)
$pid = pcntl_fork();
if ($pid == -1) elseif ($pid == 0) )child progress end!\n");
} else \n";
for ($i = 0; $i < 2; $i++) \n";
while (!empty($childlist)) )main progress end!\n";
複製**
執行結果:
create producer progresses: 21432
create producer progresses: 21433
create producer progresses: 21434
create consumer progresses: 21435
(21426) progress create! 2 | consumer(21435) destroy
(21424) progress create! 1 | consumer(21436) destroy
create consumer progresses: 21436
(21426) progress create! 3 | consumer(21436) destroy
(21426) progress create! 4 | consumer(21435) destroy
(21425) progress create! 3 | consumer(21436) destroy
(21424) progress create! 2 | consumer(21435) destroy
(21426) progress create! 5 | consumer(21435) destroy
(21424) progress create! 3 | consumer(21436) destroy
(21433)child progress end!
(21425) progress create! 4 | consumer(21435) destroy
(21424) progress create! 4 | consumer(21436) destroy
(21434)child progress end!
(21424) progress create! 5 | consumer(21435) destroy
(21425) progress create! 5 | consumer(21436) destroy
(21432)child progress end!
(21435)child progress end!
(21436)child progress end!
(21431)main progress end!
複製**
訊號量與共享記憶體
$parentpid = posix_getpid();
echo "parent progress pid:\n";
// 建立共享記憶體,建立訊號量,定義共享key
// ftok(檔案路徑,資源識別符號) 建立乙個ipc通訊所需的id
$shm_id = ftok(__file__, 'm');
$shm_id = ftok(__file__, 's');
// shm_attach(id) 建立或者開啟乙個共享記憶體
$sharememory = shm_attach($shm_id);
// 返回乙個可使用者訪問系統訊號量的id
$signal = sem_get($shm_id);
const share_key = 1;
// 生產者
function producer() ) count: \n";
} else ) count: 0\n";
// 釋放
sem_release($signal);
function createprogress($callback) elseif ($pid == 0) ) child progress end!\n");
} else \n";
// 等待所有子程序
while (!empty($childlist)) ) main progress end!\n";
複製**
執行結果:
使用訊號量來實現共享記憶體的鎖機制
parent progress pid:31720
create producer child progress: 31721
create producer child progress: 31722
(31721) count: 0
(31721) count: 1
(31721) count: 2
(31721) count: 3
(31721) count: 4
(31721) child progress end!
create producer child progress: 31723
(31722) count: 5
(31722) count: 6
(31722) count: 7
(31722) count: 8
(31722) count: 9
(31722) child progress end!
(31723) count: 10
(31723) count: 11
(31723) count: 12
(31723) count: 13
(31723) count: 14
(31723) child progress end!
(31720) main progress end!
複製**
無鎖情況
warning: sem_release(): sysv semaphore 4357894312 (key 0x73048925) is not currently acquired in /users/easyboom/www/example/訊號量與共享記憶體.php on line 38
複製**
php程序間通訊 訊號
php程序間通訊的另外乙個手段就是通過 訊號 來在程序間傳遞資訊。訊號是一種系統呼叫。通常我們用的kill命令就是傳送某個訊號給某個程序的。具體有哪些訊號可以在liunx mac中執行kill l檢視。一些php訊號的意思如下 sighup 終止程序 終端線路結束通話 sigint 終止程序 中斷程...
php程序間通訊 共享記憶體
php如何實現共享記憶體。注意 本示例是在linux下,請勿在windows下嘗試此 並且必須是在php cli模式下 php提供了兩種實現共享記憶體的擴充套件。下面我們來一一講解。一 shmop 系類函式 shm key ftok file t 開闢一塊共享記憶體 int key string f...
程序間通訊
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...