這篇文章主要介紹了關於PHP共享記憶體使用與訊號控制實例分析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
本文實例講述了PHP共享記憶體使用與訊號控制。分享給大家供大家參考,具體如下:
共享記憶體
共享記憶體的使用主要是為了能夠在同一台機器不同的進程中共享一些數據,例如在多個php-fpm 進程中共享當前進程的使用情況。這種通訊也稱為進程間通訊(Inter-Process Communication),簡稱 IPC。
PHP 內建的 shmop 擴充功能 (Shared Memory Operations) 提供了一系列共享記憶體操作的函數(可能是用的人不多吧,這塊兒的文檔還沒有中文翻譯)。在 Linux 上,這些函數直接是透過呼叫 shm* 系列的函數來實現,而 Winodows 上也透過對系統函數的封裝實現了相同的呼叫。
主要函數:
shmop_close — 關閉共享記憶體區塊
##shmop_delete# — 刪除共享記憶體區塊
shmop_open — 建立或開啟共享記憶體區塊
shmop_read — 從共享記憶體區塊讀取資料
#shmop_size — 取得共享記憶體區塊的大小
shmop_write — 寫入記憶體區塊中寫入資料
與此相關的還有一個很重要的函數:ftok,透過檔案的inode 資訊(*nix 上透過stat 或ls -i 指令檢視)來建立IPC 的唯一key(檔案/資料夾的inode 是唯一的)。這個函數在 Linux 上也是直接呼叫同名的系統函數實現,Windows 上還是使用一些封裝。 一個簡單的計數範例:<?php # 创建一块共享内存 $shm_key = ftok(__FILE__, 't'); $shm_id = shmop_open($shm_key, 'c', 0644, 8); # 读取并写入数据 $count = (int) shmop_read($shm_id, 0, 8) + 1; shmop_write($shm_id, str_pad($count, 8, '0', STR_PAD_LEFT), 0); // echo shmop_read($shm_id, 0, 8); # 关闭内存块,并不会删除共享内存,只是清除 PHP 的资源 shmop_close($shm_id);
訊號控制
既然上面使用到了共享記憶體存儲數據,就需要考慮是否有多個進程同時寫入數據到共享內存的情況,是否需要避免衝突。如果是這樣,就需要引入信號量進行控制。 PHP 也提供了類似的內建擴充sysvsem(這個擴充功能在Windows 環境下沒有,文件中將ftok 函數也歸到這個擴充功能中,但實際上ftok 是在標準函式庫中提供的,所以在Windows 下也是可用的)。 在說信號量控制之前,先說另外一件有意思的事情:看官方文檔你會發現這裡同樣也有共享內存操作的函數(shm_*),因為這其實是同一類別(或者說來自於同一作者)的三個擴展,還有一個是sysvmsg(佇列訊息) 。函數的實作上稍有差別,但實際做的事情基本上都一樣。這和上文的 shmop 擴充有什麼差別呢? shmop 原始碼下的README 檔案有簡單的說明:PHP already had a shared memory extension (sysvshm) written by Christian Cartus
<?php $id_key = ftok(__FILE__, 't'); $sem_id = sem_get($id_key); # 请求信号控制权 if (sem_acquire($sem_id)) { $shm_id = shmop_open($id_key, 'c', 0644, 8); # 读取并写入数据 $count = (int) shmop_read($shm_id, 0, 8) + 1; shmop_write($shm_id, str_pad($count, 8, '0', STR_PAD_LEFT), 0); // echo shmop_read($shm_id, 0, 8); # 关闭内存块 shmop_close($shm_id); # 释放信号 sem_release($sem_id); }
相關推薦:
#
以上是PHP共享記憶體使用與訊號控制實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!