首頁 後端開發 php教程 PHP共享記憶體的使用

PHP共享記憶體的使用

Dec 01, 2016 am 10:01 AM
Linux php

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

CakePHP 專案配置

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和時間

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

CakePHP 檔案上傳

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

討論 CakePHP

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles