PHP共享記憶體用法例項分析

2023-03-19 02:05:39 字數 2515 閱讀 2737

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

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

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

例項:$shm_key = ftok(__file__,程式設計客棧 't');

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

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

$flags: a:訪問只讀記憶體段

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

w:可讀寫的記憶體段

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

$mode: 八進位制格式 065mxwkuuz5

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

#關閉該記憶體段

shm程式設計客棧op_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程式設計客棧www.cppcns.com data'; $shmq->enqueue($data);

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

* unset($shmq);

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

php 共享記憶體

php 共享記憶體 共享記憶體主要用於程序間通訊 php中的共享記憶體有兩套擴充套件可以實現 1 shmop 編譯時需要開啟 enable shmop 引數 例項 shm key ftok file t 開闢一塊共享記憶體 int key string flags int mode int size...

linux共享記憶體用法

一 相關函式 生成一個訪問共享記憶體的key key t ftok const char pathname,int proj id pathname 指定路徑名 proj id 通訊雙方約定,通常為0 255 eg int key ftok path,proj id 建立或獲取一個共享記憶體,成功返...

PHP佇列用法例項

這篇文章主要介紹了php佇列用法,以例項形式詳細講述了php佇列的實現與各種常用的操作,非常具有參考借鑑價值,需要的朋友可以參考下 什麼是佇列,是先進先出的線性表,在具體應用中通常用連結串列或者陣列來實現,佇列只允許在後端進行插入操作,在前端進行刪除操作。什麼情況下會用了佇列呢,併發請求又要保證事務...

共享記憶體 共享記憶體

共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段實體記憶體。步驟 建立 開啟 對映 分離 刪除 1 shmget 作用 在核心中建立共享記憶體 原理 int shmget key t key,int size,int shm 引數 ke...

MySQL索引用法例項分析

mysql描述 一個文章庫,裡面有兩個表 category和article。category裡面有10條分類資料。article裡面有20萬條。article裡面有一個 article category 欄位是與category裡的 category id 欄位相對應的。article表裡面已經把 ...

C 泛型用法例項分析

這裡演示如何建立具有單個型別引數的自定義泛型列表類,以及如何實現 ienumerable 以便對列表的內容啟用 foreach 迭代。此示例還演示客戶端 如何通過指定型別引數來建立該類的例項,以及該型別引數的約束如何實現對型別引數執行其他操作。using system using system.co...

php共享記憶體實現

接著上上篇部落格 裡面的問題,如何避免每次請求都包含檔案。自己寫擴充套件對當前業務來說解決顯然有點小題大做,在php中其實可以用共享記憶體來解決這個問題。共享記憶體是一種最為高效的程序間通訊 ipc 方式,程序可以直接讀寫記憶體,而不需要任何資料的拷貝。php原始碼擴充套件中有個與共享記憶體相關的擴...

GetMessage 用法例項

主執行緒中定義 m threadstop false handle hhandle createthread null,0,playvideofile,void this,0,null 在子執行緒中 playvideofile 如果執行緒正常結將束 m threadstop true 子執行緒實現建...

tar用法例項

tar用法例項 tar命令 tar 檔案是幾個檔案和 或 目錄在一個檔案中的集合。這是建立備份和歸檔的佳徑。tar 使用的選項有 c 建立一個新歸檔。f 當與 c 選項一起使用時,建立的 tar 檔案使用該選項指定的檔名 當與 x 選項 一起使用時,則解除該選項指定的歸檔。t 顯示包括在 tar 檔...