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 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...