PHP共享記憶體的使用

2021-08-31 12:19:08 字數 4153 閱讀 6304

php有兩套使用共享記憶體的函式,一套是system v ipc函式的封裝,另一套是shmop。這兩個都無需安裝外部庫檔案。前者只能在linux下使用,而且要使用它的話,在安裝php的時候要加上–enable-sysvshm選項;而後者在linux和windows(win2k之後的系統,win98不支援)都可以使用,但在windows的時候,只有在php是isapi執行模式才能正常工作,在安裝php的時候要加上–enable-shmop。

這兩套函式的使用相當簡單,下面分別給出簡單的用法,更詳細的資訊可以參考php手冊。

一、system v的共享記憶體使用:

<?php

// 建立記憶體塊

$key = 12345; // 共享記憶體的key,注:型別為int

$memsize = 100; // 共享記憶體的大小,單位byte

$perm = 0666; // 共享記憶體訪問許可權,參考linux的許可權

$var_key = 345; // 共享記憶體的某變數的key,注:型別為int

$shmid = shm_attach( $key, $memsize, $perm ); // 建立乙個共享記憶體

shm_put_var( $shmid, $var_key, "abc" ); // 插入乙個共享記憶體變數,key為$var_key,值為"abc"

shm_detach( $shmid ); // 關閉共享記憶體

?>

執行上面的php程式可以建立乙個key為12345的共享記憶體,大小為100位元組,裡面有個值為「abc」的變數。在linux命令列敲入ipcs可以看到建立的共享記憶體資訊:

—— shared memory segments ——–

key shmid owner perms bytes nattch status

0×00003039 262144 daemon 666 100 0

注:0×00003039就是12345的16進製制形式。

訪問新建立的共享記憶體並刪除這個共享記憶體的php**:

<?php

// 讀取記憶體塊內容

$shmid = shm_attach( 12345 ); // 訪問key為12345的共享記憶體

echo shm_get_var( $shmid, 345 ); // 把共享記憶體中key為345的變數列印出來,這裡將顯示abc

shm_remove( $shmid ); // 刪除該共享記憶體

?>

執行上面這個php**,將顯示abc,並把共享記憶體刪除,這時候再執行ipcs就可以看到那塊共享記憶體已經不存在了。

二、shmop的共享記憶體使用:

<?php

// 建立記憶體塊

$key = 12345; // 共享記憶體的key

$memsize = 100; // 共享記憶體的大小,單位byte

$perm = 0666; // 共享記憶體訪問許可權,參考linux的許可權

$offset = 0; // 共享記憶體偏移位址,0表示共享記憶體的起始位址

$shmid = shmop_open($key, "c", $perm, $memsize); // 建立乙個共享記憶體,第二個引數c表示建立

$shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"寫入共享記憶體

echo $shm_bytes_written; // 列印出寫入共享記憶體的資料長度,這裡將顯示3

shmop_close($shm_id); // 關閉共享記憶體

?>

執行這個php將建立乙個key為12345,大小為100位元組的共享記憶體,裡面寫入了」abc」這個字串。我們在寫乙個訪問這個共享記憶體的php:

<?php

// 讀取記憶體塊

$shm_id = shmop_open(12345, "w", 0, 0); // 開啟key為12345的共享記憶體,第二個引數w表示以讀寫方式開啟,開啟已存在的共享記憶體,第三個和第四個引數必須是0

$shm_data = shmop_read($shm_id, 0, 3); // 從共享記憶體裡面讀取3位元組的資料,第二個引數是偏移位址,0表示共享記憶體的起始位址

echo $shm_data; // 列印出上個函式返回的共享記憶體資料

shmop_delete($shm_id); // 刪除共享記憶體

?>

執行這個php將列印出abc,並把原來的共享記憶體刪除。

總結:1. 這兩套函式都是簡單易用的,shmop的唯一好處是可以在windows下使用,在linux下的話推薦使用shm_*那套函式,因為那套函式在插入、更新以及讀取共享記憶體裡面的變數相當方便,而shmop需要自己來規劃共享記憶體的儲存結構,應用起來稍微複雜一點。此外,上面的例子裡面我直接用數字12345作為共享記憶體的key,實際上,更為標準的做法是使用ftok函式來把乙個路徑轉成ipc的key。具體做法可以參考php手冊。

2. 在使用shmop時,如果使用完成後沒有進行shmop_delete()操作,則下次對共享記憶體變數值的寫入會有問題出現,如果前次寫入的長度〉下次寫入的長度,則只覆蓋前面的,多餘的內容保留。反之,如果前次寫入的長度〈下次寫入的長度,則多餘的內容會自動追加到後面。

3. 共享記憶體時需要的key及變數均為int型別。

=================================

shm_attach

開啟建立共享記憶體空間。

語法: int shm_attach(int key, int [memsize], int [perm]);

返回值: 整數

函式種類: 作業系統與環境

內容說明: 本函式用來開啟或者建立共享記憶體空間。引數 key 為這部分的鍵。引數 memsize 可省略,表示所需最小的記憶體空間 (單位為 byte 位組),預設值在 php3.ini 或 php.ini 中的 sysvshm.init_mem 配置,若無配置則為 10000 bytes。引數 perm 亦可省略,為該記憶體空間的使用許可權,預設值為 666。返回值為共享記憶體的id 值,可供程式使用。

shm_detach

中止共享記憶體空間鏈結。

語法: int shm_detach(int shm_identifier);

返回值: 整數

函式種類: 作業系統與環境

內容說明: 本函式用來中止與共享記憶體空間的鏈結。引數 shm_identifier 即為欲停止部分的共享記憶體 id 值。

shm_remove

清除記憶體空間。

語法: int shm_remove(int shm_identifier);

返回值: 整數

函式種類: 作業系統與環境

內容說明: 本函式用來清除共享記憶體空間的所有資料。引數 shm_identifier 即為欲停止部分的共享記憶體 id 值。

shm_put_var

加入或更新記憶體空間中的變數。

語法: int shm_put_var(int shm_identifier, int variable_key, mixed variable);

返回值: 整數

函式種類: 作業系統與環境

內容說明: 本函式可用來增加或者修改記憶體空間中變數值。引數 shm_identifier 為欲增加修改的共享記憶體 id 值。引數 variable_key 為欲增加修改的變數名稱鍵。引數 variable 為變數的內容,變數的型別可以是倍精確數 (double)、整數 (integer)、字串 (string) 或者是陣列 (array)。

shm_get_var

取得記憶體空間中指定的變數。

語法: mixed shm_get_var(int shm_identifier, int variable_key);

返回值: 混合型別資料

函式種類: 作業系統與環境

內容說明: 本函式可用來取得記憶體空間中指定的變數值。引數 shm_identifier 為欲取得的共享記憶體 id 值。引數 variable_key 為欲取得的變數名稱鍵。返回值即為指定變數鍵的值。

shm_remove_var

刪除記憶體空間中指定的變數。

語法: int shm_remove_var(int id, int variable_key);

返回值: 整數

函式種類: 作業系統與環境

內容說明: 本函式可用來刪除記憶體空間中指定的變數值。引數 shm_identifier 為欲除去的共享記憶體 id 值。引數 variable_key 為欲刪除的變數名稱鍵

php 共享記憶體

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

共享記憶體的使用

http download1.csdn.net down3 20070529 29183222619.chttp download1.csdn.net down3 20070529 29183246962.chttp download1.csdn.net down3 20070529 2918324...

共享記憶體的使用

共享記憶體mmap使用 date tue apr 8 14 53 43 cst 2014 include extern c using namespace std define sem file sem lock int main int argc,char argv 開啟訊號量 int count...