php程序間通訊 yoc PHP程序間通訊

2021-10-13 02:18:47 字數 4169 閱讀 8951

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的接收資料視窗...