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

來源:互聯網
上載者:User

標籤:var   申請   類型   位元組   move   唯讀   讀取   time   概念   

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);

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.