PHP共用記憶體的使用

來源:互聯網
上載者:User
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 為欲刪除的變數名稱鍵
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.