PHP進程通信基礎——shmop 、sem系列函數使用


PHP進程通信基礎——shmop 、sem系列函數使用

進程通信的原理就是在系統中開辟出一個共享區域,不管是管道也好,還是共享內存,都是這個原理。如果心中有了這個概念,就會很方便去理解代碼。由於官網上shmop函數的英語解釋稍顯復雜,所以一邊練習,一邊簡單翻譯了下。信號量的內存擴展函數,比較簡單,也非常好理解。所以就沒有翻譯。這篇博客是通信基礎,所以直接就放實例代碼了,按照上代碼上敲一遍,就能夠明白個七七八八了。如果實在不明白,可以復制進去,直接打斷點調試,也是一種不錯的學習思路。
這篇文章參考:
http://php.net/manual/en/ref.sem.php
http://php.net/manual/en/ref.shmop.php
http://www.cnblogs.com/nickbai/articles/6133354.html

1、shmop 系列函數使用

<?php
//使用shmop 系列函數
set_time_limit(0);
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0655, 1024);
$size = shmop_write($shm_id, "Hello world".PHP_EOL, 0);
shmop_write($shm_id, 'I love you'.PHP_EOL, $size+1);
echo $size.PHP_EOL;
$data = shmop_read($shm_id, 0, 100);
var_dump($data);
shmop_delete($shm_id);
shmop_close($shm_id);

//Shared Memory Functions

/**
* shmop_open(int $key , string $flags , int $mode , int $size)
* $key 共享內存的key
* $flags 的值有以下幾種
* a : 創建一個只讀的共享內存區。
* c : 如果共享內存區已存在,則打開該共享內存區,並嘗試讀寫。否則新建共享內存區
* w : 創建一個讀寫共享內存區
* n : 創建一個共享內存區,如果已存在,則返回失敗
*
* $mode 讀寫權限。如0755 0644 等
* $size 申請共享內存區的大小
*/


/**
* shmop_read( resource $shmid , int $start , int $count)
* 將從共享內存塊中讀取數據
* $shmid 共享內存id,資源類型
* $start 從共享內存的那個字節開始讀起
* $count 一次讀取多少個字節。
* 如果count值小於發送的信息長度,則信息會被截斷。
*/


/**
* shmop_write(resource $shmid , string $data , int $offset)
* 將數據寫入共享內存塊
* $data 將要寫入的數據
* $offset 從共享內存塊的那個位置開始寫入。
* 該函數的返回值是寫入數據的長度。
*/


/**
* shmop_size(resource $shmid);
* 返回當前共享內存塊,已經使用的大小
*/



/**
* shmop_delete ( resource $shmid )
* 刪除一個共享內存塊的,刪除引用關系
*/


/**
* shmop_close ( resource $shmid )
* 關閉共享內存塊
* 要先使用shmop_delete 之后才能繼續使用shmop_close
*/

2、shm 系列函數使用

<?php
//使用信號量擴展共享內存
$key = ftok(__FILE__, 'a');
$share_key = 1;

//創建一個共享內存,大小為1024字節,權限為755
$shm_id = shm_attach($key, 1024, 0755);

//將一個key=>value放進共享內存
$message1 = "I love Roverliang";
shm_put_var($shm_id, $share_key, $message1);

//重復使用key ,前一個設置的值會被后一個設置的值覆蓋掉。
$message2 = "I love Rover";
shm_put_var($shm_id, $share_key, $message2);

//讀取一個共享內存值
$read_message = shm_get_var($shm_id, $share_key);
echo $read_message.PHP_EOL;

//並不是取走了,而是讀取
$read_message2 = shm_get_var($shm_id, $share_key);
echo $read_message2.PHP_EOL;

//判斷共享內存中,某個值是否存在
$isexists = shm_has_var($shm_id, $share_key);
var_dump($isexists);

//刪除一個值
shm_remove_var($shm_id, $share_key);

//判斷共享內存中,某個值是否存在
$isexists = shm_has_var($shm_id, $share_key);
var_dump($isexists);

//刪除一個共享內存
shm_remove($shm_id);

//關閉共享內存的連接
shm_detach($shm_id);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM