好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > PHP共享內存使用與信號控制實例分析

PHP共享內存使用與信號控制實例分析

熱門標簽:長沙做地圖標注公司 四川保險智能外呼系統供應商 遼寧ai電銷機器人價格 電話機器人銷售主要負責什么 福建銀行智能外呼系統價格 上海做外呼線路的通信公司 地圖標注專員怎么樣 寧波外呼營銷系統 房產中介用的是什么外呼系統

本文實例講述了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);

以上這段代碼沒執行一次計數加 1,而且數據是在不同進程之間共享的。也就是說除非手動刪除這塊內存使用,否則這個數據是不會重置的。

有個需要稍微注意的點:shmop_open 的第二個參數是個 flag,類似 fopen 的第二個參數,其取值有以前幾個:

"a" 只讀訪問;

"c" 如果內存片段不存在,則創建,如果存在,則可讀寫;

"w" 讀寫;

"n" 創建新的內存片段,如果同樣 key 的已存在,則會創建失敗,這是為了安全使用共享內存考慮。

此外,由于使用的共享內存片段是固定長度的,在存儲和讀取的時候要計算好數據的長度,不然可能會寫入失敗或者讀取空值。

信號控制

既然上面使用到了共享內存存儲數據,就需要考慮是否有多個進程同時寫入數據到共享內存的情況,是否需要避免沖突。如果是這樣,就需要引入信號量進行控制。

PHP 也提供了類似的內置擴展 sysvsem(這個擴展在 Windows 環境下沒有,文檔中將 ftok 函數也歸到這個擴展中,但實際上ftok 是在標準函數庫中提供的,所以在 Windows 下也是可用的)。

在說信號量控制之前,先說另外一件有意思的事情:看官方文檔你會發現這里同樣也有共享內存操作的函數(shm_*),因為這其實是同一類別(或者說來自于同一作者)的三個擴展,還有一個是 sysvmsg(隊列消息) 。函數的實現上稍有差別,但實際做的事情基本相同。這和上文的 shmop 擴展有什么區別呢?shmop 源碼下的 README 文件有簡單的說明:

PHP already had a shared memory extension (sysvshm) written by Christian Cartus cartus@atrior.de>, unfortunately this extension was designed with PHP only in mind and offers high level features which are extremely bothersome for basic SHM we had in mind.

簡單說來:sysvshm 擴展提供的方法并不是原封不動的存儲用戶的數據,而是先使用 PHP 的變量序列化函數對參數進行序列化然后再進行存儲。這就導致通過這些方法存儲的數據無法和非 PHP 進程共享。不過這樣也能存儲更豐富的 PHP 數據類型,上文的擴展中 shmop_write 只能寫入字符串。那么為什么 sysvshm 同樣不支持 Windows 呢?因為其并沒有引入封裝了 shm* 系列函數的tsrm_win32.h 的頭文件。

引入信號控制之后的示例:

?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);
}

但是本地想模擬實現寫入沖突實際上是非常難的(考慮到計算機的執行速度)。在本地測試中,使用 for 循環操作時如果不使用shmop_close 關閉資源會出現無法打開共享內存的錯誤警告。這應該是因為正在共享內存被上一次操作占用中還沒有釋放導致。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP基本語法入門教程》、《PHP錯誤與異常處理方法總結》、《php程序設計算法總結》及《php面向對象程序設計入門教程》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP進程通信基礎之信號量與共享內存通信
  • PHP共享內存用法實例分析
  • 單臺服務器的PHP進程之間實現共享內存的方法
  • php共享內存段示例分享
  • php使用shmop函數創建共享內存減少負載的方法

標簽:工商登記 深圳 澳門 常德 佛山 延安 宿遷 宜春

巨人網絡通訊聲明:本文標題《PHP共享內存使用與信號控制實例分析》,本文關鍵詞  PHP,共享,內存,使用,與,信號,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP共享內存使用與信號控制實例分析》相關的同類信息!
  • 本頁收集關于PHP共享內存使用與信號控制實例分析的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 亚洲小说春色综合另类电影| 男男h黄动漫啪啪无遮挡软件| 小说稚嫩共妻哭喊np| h文宫交灌尿| juliaann熟妇无码欧美AV| 99er热精品视频国产免费| 晚上英语老师就是你的了app| 共妻调教(NP,调教)玩具工厂| 大乳尤物冰露| 免费看美女午夜大片| 无码任你躁久久久久久老妇APP| 男男1v1高h猛烈做哭bl强制| 全程穿着高跟鞋做爰视频| 日韩国产片| 男人激烈吮乳吃奶动视频| 9420高清完整版在线观看国语| 艳妇500篇短篇h系列| 第一次3p经历小黄完整版| 往下边塞东西逛街是什么感觉| 滴蜡电击调教乳尖| 国产乱人伦偷精品视频不卡| 国色天香社区视频免费高清在线观看| 亚洲精品久久vr| 4444西西人体做爰大胆秘密| 人色偷偷色AV噜噜狠狠99| 福利姬Jk丝袜-91Porn| 69欧美性猛交| 勾魂尤物丰满大胸极品美女| 东北老女人啪啪国语对白| 欧洲同性精品视频| 宁晋县| 乱欲禁品| 铜铜铜铜铜铜铜铜好痛| 翻白眼流口水享受的表情图| 一色桃子av人妻中文字幕| 99精品国产在热久久一无码| WC凸凹撤尿女厕视频HD| 免费国产调教视频在线观看| 1024手机看片人妻人伦电影网| 综合激情网站| 毛片免费网址|