php 共享記憶體

2021-09-06 18:25:52 字數 2903 閱讀 6897

共享記憶體主要用於程序間通訊

php中的共享記憶體有兩套擴充套件可以實現

1、shmop  編譯時需要開啟--enable-shmop 引數

例項:

$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", 0644, 1024);/**

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

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

* */$size = shmop_write($shm_id, 'songjiankang', 0);

echo "write into ";

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

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

var_dump($data);#

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

shmop_delete($shm_id);#

關閉該記憶體段

shmop_close($shm_id);

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

//

get the file token key

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

//建立乙個共享記憶體

$shm_id = shm_attach($key, 1024, 777); //

resource type

if ($shm_id === false) #

設定乙個值

shm_put_var($shm_id, 111, 'value');

#刪除乙個key

//shm_remove_var($shm_id, 111);

#獲取乙個值

$value = shm_get_var($shm_id, 111);

var_dump($value);#

檢測乙個key是否存在

// var_dump(shm_has_var($shm_id, 111));

#從系統中移除

shm_remove($shm_id);#

關閉和共享記憶體的連線

shm_detach($shm_id);

注意:這兩種方式不通用的

乙個用共享記憶體和訊號量實現的訊息佇列

/*

** 使用共享記憶體和訊號量實現

* * 支援多程序, 支援各種資料型別的儲存

* 注: 完成入隊或出隊操作,盡快使用unset(), 以釋放臨界區**/

class

shmqueue

private

function

init ()}}

public

function

getlength ()

public

function enqueue ($value

)

$data = $this->encode($value

); shmop_write(

$this->shmid, $data, $this->rear);

$this->rear = $this->ptrinc($this->rear);

return

true

; }

public

function

dequeue ()

$value = shmop_read($this->shmid, $this->front, $this->blocksize - 1);

$this->front = $this->ptrinc($this->front);

return

$this->decode($value

); }

private

function ptrinc ($ptr

)

private

function encode ($value

)

return

$data

; }

private

function decode ($value

)

public

function

__destruct ()

}/** // 進隊操作 $shmq = new shmqueue(); $data = 'test data'; $shmq->enqueue($data);

* unset($shmq); // 出隊操作 $shmq = new shmqueue(); $data = $shmq->dequeue();

* unset($shmq);

*/

linux下 用 ipc命令檢視 ,用 ipcrm 命令可以刪除

參考:

php共享記憶體相關函式

共享記憶體函式類似於檔案操作函式,但無需處理乙個流,您將處理乙個共享記憶體訪問 id。param int key 標識系統中的共享記憶體段的數字 parma string flags 訪問模式,它非常類似於fopen函式的訪問模式 param int mode 記憶體段的許可權。您必須在這裡提供乙個...

PHP共享記憶體的使用

php有兩套使用共享記憶體的函式,一套是system v ipc函式的封裝,另一套是shmop。這兩個都無需安裝外部庫檔案。前者只能在linux下使用,而且要使用它的話,在安裝php的時候要加上 enable sysvshm選項 而後者在linux和windows win2k之後的系統,win98不...

php程序間通訊 共享記憶體

php如何實現共享記憶體。注意 本示例是在linux下,請勿在windows下嘗試此 並且必須是在php cli模式下 php提供了兩種實現共享記憶體的擴充套件。下面我們來一一講解。一 shmop 系類函式 shm key ftok file t 開闢一塊共享記憶體 int key string f...