首頁  >  文章  >  後端開發  >  PHP共享記憶體的使用

PHP共享記憶體的使用

巴扎黑
巴扎黑原創
2016-12-01 10:01:571830瀏覽

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 為想要刪除的變數名稱鍵 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn