php有兩套使用共享記憶體的函數,一套是System V IPC函數的封裝,另一套是shmop。這兩個都無需安裝外部庫檔案。前者只能在linux下使用,而且要使用它的話,在安裝php的時候要加上–enable-sysvshm選項;而後者在linux和windows(win2k之後的系統,win98不支援)都可以使用,但在windows的時候,只有在php是ISAPI運作模式才能正常運作,在安裝php的時候要加上–enable-shmop。
這兩組函數的使用相當簡單,以下分別給出簡單的用法,更詳細的資訊可以參考php手冊。
一、System V的共享記憶體使用:
// 建立記憶體區塊
$key = 12345; // 共享記憶體的key,註:類型為int
$memsize = 100;大小,單位byte
$perm = 0666; // 共享記憶體存取權限,參考linux的權限
$var_key = 345; // 共享記憶體的某變數的key,附註:類型為int
$shmid = shm_attach( $ , $memsize, $perm ); // 建立一個共享記憶體
shm_put_var( $shmid, $var_key, "abc" ); // 插入一個共享記憶體變量,key為$var_key,值為"abc"
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程式碼:
// 讀取記憶體區塊內容
$shmid = shm_attach( 12345 ); // 存取為12345的共享記憶體( $shmid, 345 ); // 把共享記憶體中key為345的變數印出來,這裡將顯示abc
shm_remove( $shmid ); // 刪除該共享記憶體
?>
運行上面這個php程式碼,將顯示顯示這個分享abc,並且把共享記憶體刪除,這時候再運行ipcs就可以看到那塊共享記憶體已經不存在了。
二、shmop的共享記憶體使用:
// 建立記憶體區塊
$key = 12345; // 共享記憶體的key
teize = 100; = 0666; // 共享記憶體存取權限,參考linux的權限
$offset = 0; // 共享記憶體偏移位址,0表示共享記憶體的起始位址
$shmid = shmop_open($key, "c", $ perm, $memsize); // 建立一個共享內存,第二個參數c表示創建
$shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"寫入共享內存
echowshten_by echow ; // 印出寫入共享記憶體的資料長度,這裡將顯示3
shmop_close($shm_id); // 關閉共享記憶體
?>
運行這個php將建立一個key為12345,大小為100位元組的共享內存,裡面寫入了”abc”這個字串。我們在寫一個存取這個共享記憶體的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 為想要刪除的變數名稱鍵