最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP共享內(nèi)存使用與信號(hào)控制實(shí)例分析

 更新時(shí)間:2018年05月09日 09:38:22   作者:戰(zhàn)神悟空  
這篇文章主要介紹了PHP共享內(nèi)存使用與信號(hào)控制,結(jié)合實(shí)例形式分析了php基于shmop擴(kuò)展實(shí)現(xiàn)共享內(nèi)存的進(jìn)程間通信以及信號(hào)控制等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了PHP共享內(nèi)存使用與信號(hào)控制。分享給大家供大家參考,具體如下:

共享內(nèi)存

共享內(nèi)存的使用主要是為了能夠在同一臺(tái)機(jī)器不同的進(jìn)程中共享一些數(shù)據(jù),比如在多個(gè) php-fpm 進(jìn)程中共享當(dāng)前進(jìn)程的使用情況。這種通信也稱為進(jìn)程間通信(Inter-Process Communication),簡(jiǎn)稱 IPC。

PHP 內(nèi)置的 shmop 擴(kuò)展 (Shared Memory Operations) 提供了一系列共享內(nèi)存操作的函數(shù)(可能是用的人不多吧,這一塊兒的文檔還沒(méi)有中文翻譯)。在 Linux 上,這些函數(shù)直接是通過(guò)調(diào)用 shm* 系列的函數(shù)實(shí)現(xiàn),而 Winodows 上也通過(guò)對(duì)系統(tǒng)函數(shù)的封裝實(shí)現(xiàn)了同樣的調(diào)用。

主要函數(shù):

shmop_close — 關(guān)閉共享內(nèi)存塊

shmop_delete — 刪除共享內(nèi)存塊

shmop_open — 創(chuàng)建或打開(kāi)共享內(nèi)存塊

shmop_read — 從共享內(nèi)存塊中讀取數(shù)據(jù)

shmop_size — 獲取共享內(nèi)存塊的大小

shmop_write — 向共享內(nèi)存塊中寫(xiě)入數(shù)據(jù)

與此相關(guān)的還有一個(gè)很重要的函數(shù):ftok,通過(guò)文件的 inode 信息(*nix 上通過(guò) stat 或 ls -i 命令查看)創(chuàng)建 IPC 的唯一 key(文件/文件夾的 inode 是唯一的)。這個(gè)函數(shù)在 Linux 上也是直接調(diào)用同名的系統(tǒng)函數(shù)實(shí)現(xiàn),Windows 上還是使用一些封裝。

一個(gè)簡(jiǎn)單的計(jì)數(shù)例子:

<?php
# 創(chuàng)建一塊共享內(nèi)存
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, 'c', 0644, 8);
# 讀取并寫(xiě)入數(shù)據(jù)
$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);
# 關(guān)閉內(nèi)存塊,并不會(huì)刪除共享內(nèi)存,只是清除 PHP 的資源
shmop_close($shm_id);

以上這段代碼沒(méi)執(zhí)行一次計(jì)數(shù)加 1,而且數(shù)據(jù)是在不同進(jìn)程之間共享的。也就是說(shuō)除非手動(dòng)刪除這塊內(nèi)存使用,否則這個(gè)數(shù)據(jù)是不會(huì)重置的。

有個(gè)需要稍微注意的點(diǎn):shmop_open 的第二個(gè)參數(shù)是個(gè) flag,類似 fopen 的第二個(gè)參數(shù),其取值有以前幾個(gè):

"a" 只讀訪問(wèn);

"c" 如果內(nèi)存片段不存在,則創(chuàng)建,如果存在,則可讀寫(xiě);

"w" 讀寫(xiě);

"n" 創(chuàng)建新的內(nèi)存片段,如果同樣 key 的已存在,則會(huì)創(chuàng)建失敗,這是為了安全使用共享內(nèi)存考慮。

此外,由于使用的共享內(nèi)存片段是固定長(zhǎng)度的,在存儲(chǔ)和讀取的時(shí)候要計(jì)算好數(shù)據(jù)的長(zhǎng)度,不然可能會(huì)寫(xiě)入失敗或者讀取空值。

信號(hào)控制

既然上面使用到了共享內(nèi)存存儲(chǔ)數(shù)據(jù),就需要考慮是否有多個(gè)進(jìn)程同時(shí)寫(xiě)入數(shù)據(jù)到共享內(nèi)存的情況,是否需要避免沖突。如果是這樣,就需要引入信號(hào)量進(jìn)行控制。

PHP 也提供了類似的內(nèi)置擴(kuò)展 sysvsem(這個(gè)擴(kuò)展在 Windows 環(huán)境下沒(méi)有,文檔中將 ftok 函數(shù)也歸到這個(gè)擴(kuò)展中,但實(shí)際上ftok 是在標(biāo)準(zhǔn)函數(shù)庫(kù)中提供的,所以在 Windows 下也是可用的)。

在說(shuō)信號(hào)量控制之前,先說(shuō)另外一件有意思的事情:看官方文檔你會(huì)發(fā)現(xiàn)這里同樣也有共享內(nèi)存操作的函數(shù)(shm_*),因?yàn)檫@其實(shí)是同一類別(或者說(shuō)來(lái)自于同一作者)的三個(gè)擴(kuò)展,還有一個(gè)是 sysvmsg(隊(duì)列消息) 。函數(shù)的實(shí)現(xiàn)上稍有差別,但實(shí)際做的事情基本相同。這和上文的 shmop 擴(kuò)展有什么區(qū)別呢?shmop 源碼下的 README 文件有簡(jiǎn)單的說(shuō)明:

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.

簡(jiǎn)單說(shuō)來(lái):sysvshm 擴(kuò)展提供的方法并不是原封不動(dòng)的存儲(chǔ)用戶的數(shù)據(jù),而是先使用 PHP 的變量序列化函數(shù)對(duì)參數(shù)進(jìn)行序列化然后再進(jìn)行存儲(chǔ)。這就導(dǎo)致通過(guò)這些方法存儲(chǔ)的數(shù)據(jù)無(wú)法和非 PHP 進(jìn)程共享。不過(guò)這樣也能存儲(chǔ)更豐富的 PHP 數(shù)據(jù)類型,上文的擴(kuò)展中 shmop_write 只能寫(xiě)入字符串。那么為什么 sysvshm 同樣不支持 Windows 呢?因?yàn)槠洳](méi)有引入封裝了 shm* 系列函數(shù)的tsrm_win32.h 的頭文件。

引入信號(hào)控制之后的示例:

<?php
$id_key = ftok(__FILE__, 't');
$sem_id = sem_get($id_key);
# 請(qǐng)求信號(hào)控制權(quán)
if (sem_acquire($sem_id)) {
  $shm_id = shmop_open($id_key, 'c', 0644, 8);
  # 讀取并寫(xiě)入數(shù)據(jù)
  $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);
  # 關(guān)閉內(nèi)存塊
  shmop_close($shm_id);
  # 釋放信號(hào)
  sem_release($sem_id);
}

但是本地想模擬實(shí)現(xiàn)寫(xiě)入沖突實(shí)際上是非常難的(考慮到計(jì)算機(jī)的執(zhí)行速度)。在本地測(cè)試中,使用 for 循環(huán)操作時(shí)如果不使用shmop_close 關(guān)閉資源會(huì)出現(xiàn)無(wú)法打開(kāi)共享內(nèi)存的錯(cuò)誤警告。這應(yīng)該是因?yàn)檎诠蚕韮?nèi)存被上一次操作占用中還沒(méi)有釋放導(dǎo)致。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基本語(yǔ)法入門(mén)教程》、《PHP錯(cuò)誤與異常處理方法總結(jié)》、《php程序設(shè)計(jì)算法總結(jié)》及《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • PHP?Array?數(shù)組詳細(xì)介紹

    PHP?Array?數(shù)組詳細(xì)介紹

    這篇文章主要介紹了PHP?Array數(shù)組詳細(xì)介紹,PHP中的array實(shí)際上是一個(gè)有序映射。映射是一種把?values?關(guān)聯(lián)到keys的類型,更多詳情需要的小伙伴可以參考一下
    2022-09-09
  • PHP Beanstalkd消息隊(duì)列的安裝與使用方法實(shí)例詳解

    PHP Beanstalkd消息隊(duì)列的安裝與使用方法實(shí)例詳解

    這篇文章主要介紹了PHP Beanstalkd消息隊(duì)列的安裝與使用方法,結(jié)合實(shí)例形式詳細(xì)分析了PHP Beanstalkd消息隊(duì)列的基本功能、原理、安裝、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • php實(shí)現(xiàn)字符串首字母大寫(xiě)和單詞首字母大寫(xiě)的方法

    php實(shí)現(xiàn)字符串首字母大寫(xiě)和單詞首字母大寫(xiě)的方法

    這篇文章主要介紹了php實(shí)現(xiàn)字符串首字母大寫(xiě)和單詞首字母大寫(xiě)的方法,涉及php中ucfirst和ucwords函數(shù)的使用技巧,需要的朋友可以參考下
    2015-03-03
  • 通過(guò)php動(dòng)態(tài)傳數(shù)據(jù)到highcharts

    通過(guò)php動(dòng)態(tài)傳數(shù)據(jù)到highcharts

    本文主要介紹了通過(guò)php動(dòng)態(tài)傳數(shù)據(jù)到highcharts的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • php 抽象類的簡(jiǎn)單應(yīng)用

    php 抽象類的簡(jiǎn)單應(yīng)用

    我想博客中的 文章列表和單個(gè)的文章閱讀 統(tǒng)一起來(lái),我覺(jué)得除了sql查詢語(yǔ)句結(jié)構(gòu)不同,HTML代碼不同,其它也就一樣。不過(guò)話說(shuō)回來(lái),這兩個(gè)都是主要功能,所以這的確有點(diǎn)不適合,不過(guò)昨晚讀了一點(diǎn)設(shè)計(jì)模式,好歹得寫(xiě)點(diǎn)啥好。
    2011-09-09
  • PHP更安全的密碼加密機(jī)制Bcrypt詳解

    PHP更安全的密碼加密機(jī)制Bcrypt詳解

    這篇文章主要給大家介紹了關(guān)于PHP更安全的密碼加密機(jī)制Bcrypt的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • C# WinForm中實(shí)現(xiàn)快捷鍵自定義設(shè)置實(shí)例

    C# WinForm中實(shí)現(xiàn)快捷鍵自定義設(shè)置實(shí)例

    這篇文章主要介紹了對(duì)C# WinForm中實(shí)現(xiàn)快捷鍵自定義設(shè)置實(shí)例,本文實(shí)現(xiàn)了大多數(shù)軟件如QQ、有道詞典中的快捷鍵設(shè)置功能,即按下相應(yīng)按鍵后顯示在文本框中,需要的朋友可以參考下
    2015-01-01
  • 深入PHP5中的魔術(shù)方法詳解

    深入PHP5中的魔術(shù)方法詳解

    本篇文章是對(duì)PHP5中的魔術(shù)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP7下安裝并使用xhprof性能分析工具

    PHP7下安裝并使用xhprof性能分析工具

    這篇文章主要介紹了PHP7下安裝并使用xhprof性能分析工具,對(duì)性能感興趣的朋友,可以研究下
    2021-04-04
  • php實(shí)現(xiàn)的美國(guó)50個(gè)州選擇列表實(shí)例

    php實(shí)現(xiàn)的美國(guó)50個(gè)州選擇列表實(shí)例

    這篇文章主要介紹了php實(shí)現(xiàn)的美國(guó)50個(gè)州選擇列表實(shí)例,可實(shí)現(xiàn)讓當(dāng)前州為選中狀態(tài)的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

临沭县| 章丘市| 康马县| 邹平县| 重庆市| 天镇县| 石泉县| 陕西省| 佛学| 富阳市| 屯昌县| 方正县| 密云县| 略阳县| 龙川县| 同心县| 五莲县| 卓尼县| 古田县| 安顺市| 北京市| 承德县| 土默特左旗| 南昌市| 泌阳县| 西乌| 沐川县| 清新县| 彭州市| 双桥区| 青神县| 电白县| 松潘县| 鲁山县| 松江区| 历史| 普兰县| 习水县| 中江县| 舒城县| 保德县|