共享記憶體主要用於程序間通訊
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...