php程序間通訊 共享記憶體

2021-09-02 01:55:51 字數 2975 閱讀 7950

php如何實現共享記憶體。(注意:本示例是在linux下,請勿在windows下嘗試此**,並且必須是在php-cli模式下)

php提供了兩種實現共享記憶體的擴充套件。下面我們來一一講解。

一、shmop 系類函式

<?php 

$shm_key = ftok(__file__, 't');

/**開闢一塊共享記憶體

int $key , string $flags , int $mode , int $size

$flags:

a:訪問唯讀記憶體段

c:建立乙個新記憶體段,或者如果該記憶體段已存在,嘗試開啟它進行讀寫

w:可讀寫的記憶體段

n:建立乙個新記憶體段,如果該記憶體段已存在,則會失敗

$mode: 八進位制格式 0655

$size: 開闢的資料大小 位元組

*/$shm_id = shmop_open($shm_key, "c", 0655, 1024);

/** * 寫入資料 資料必須是字串格式 , 最後乙個指偏移量

* 注意:偏移量必須在指定的範圍之內,否則寫入不了

* */

$size = shmop_write($shm_id, 'hello world', 0);

echo "write into ";

//讀取的範圍也必須在申請的記憶體範圍之內,否則失敗

$data = shmop_read($shm_id, 0, $size);

var_dump($data);

/*刪除 只是做乙個刪除標誌位,同時不在允許新的程序程序讀取,當在沒有任何程序讀取時系統會自動刪除

*/shmop_delete($shm_id);

//關閉該記憶體段

shmop_close($shm_id);

?>

注意兩點:

1、shmop_read 函式 第2個引數 是讀取的起始位置,第3個引數是要讀取的長度,如果你要讀取的長度小於首席資訊官度,原資訊會被截斷成你指定的長度。

2、shmop_write 函式僅可寫 字串 內容!

二、用 semaphore 擴充套件中的 sem 類函式 (用起來更方便,類似 key-value 格式)

<?php 

$key = ftok(__file__, 'a');

$shar_key = 1;

// 建立乙個共享記憶體

$shm_id = shm_attach($key, 1024, 0666); // resource type

if ($shm_id === false)

//設定乙個值

shm_put_var($shm_id, $shar_key, 'test');

#刪除乙個key

//shm_remove_var($shm_id, $shar_key);

//獲取乙個值

$value = shm_get_var($shm_id, $shar_key);

var_dump($value);

//檢測乙個key是否存在

var_dump(shm_has_var($shm_id, $shar_key));

//從系統中移除

shm_remove($shm_id);

//關閉和共享記憶體的連線

shm_detach($shm_id);

?>

shm_put_var 第三個引數 寫入的值 是乙個混合型別,所以沒有shmop_write的侷限性。

注意:$shar_key只能是 int 型的引數。

php如何建立、操作共享記憶體,下面我們來看一下,他們如何在程序間通訊發揮作用吧。

<?php 

//共享記憶體通訊

//1、建立共享記憶體區域

$shm_key = ftok(__file__, 't');

$shm_id = shm_attach( $shm_key, 1024, 0655 );

const share_key = 1;

$childlist = ;

//2、開3個程序 讀寫 該記憶體區域

for ( $i = 0; $i < 3; $i++ ) else if ( $pid == 0 ) else

echo "child process " . getmypid() . " is writing ! now count is $count\n";

exit( "child process " . getmypid() . " end!\n" );

} else }

// 等待所有子程序結束

while( !empty( $childlist ) )

}//父程序讀取共享記憶體中的值

$count = shm_get_var($shm_id, share_key);

echo "final count is " . $count . php_eol;

//3、去除記憶體共享區域

#從系統中移除

shm_remove($shm_id);

#關閉和共享記憶體的連線

從結果中我們可以看到,最終的 count 的值還是0。這是為什麼呢?簡單分析一下,不難發現,當我們開啟建立程序的時候,3個子程序同時開啟了 共享記憶體區域,此時他們幾乎是同步的,所以讀到的資訊都是沒有count值,此時他們執行自己的業務

邏輯然後將 count 為0的結果寫入記憶體區域。這並不是我們想要的結果,三個子程序互相搶占了資源,這是不合理的,那怎麼規避這個問題呢?答案是通過 訊號量 !

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...