共享內(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è)需要稍微注意的點(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ō)明:
簡(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的頭文件。
但是本地想模擬實(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)致。
免費(fèi)學(xué)習(xí)課堂
- 免費(fèi)推廣知識(shí)
- 競(jìng)價(jià)推廣知識(shí)
- 新媒體營(yíng)銷知識(shí)
- 網(wǎng)站運(yùn)營(yíng)知識(shí)
- 網(wǎng)站設(shè)計(jì)知識(shí)
- 網(wǎng)站建設(shè)知識(shí)
- Web前端知識(shí)
- 軟文營(yíng)銷知識(shí)
- 網(wǎng)站策劃知識(shí)
- 整合營(yíng)銷
推薦文章
- 織夢(mèng)dedecms漏洞修復(fù)大全含任意文件
- 整頓微信公眾號(hào)過(guò)度營(yíng)銷 對(duì)嚴(yán)重違
- SEO優(yōu)化過(guò)程要避免什么?
- 網(wǎng)站空間被掛馬的原因原因及解決
- 2016企業(yè)該如何運(yùn)用互聯(lián)網(wǎng)進(jìn)行營(yíng)銷
- WEB前端項(xiàng)目開(kāi)發(fā)中需注意的細(xì)節(jié)
- 低價(jià)網(wǎng)站建設(shè)的危害有哪些?
- 如何詳細(xì)的分析你網(wǎng)站的競(jìng)爭(zhēng)對(duì)手
- 網(wǎng)站設(shè)計(jì)中四個(gè)常犯的錯(cuò)誤
- 如何搭配網(wǎng)站設(shè)計(jì)中的色彩?
PHP 共享內(nèi)存使用與信號(hào)控制
來(lái)源:北京匯仁智杰科技有限公司 時(shí)間:2016-05-19 點(diǎn)擊: 次
推薦文章
- 織夢(mèng)dedecms漏洞修復(fù)大全含任意文件2016-09-05
- 整頓微信公眾號(hào)過(guò)度營(yíng)銷 對(duì)嚴(yán)重違2016-01-26
- SEO優(yōu)化過(guò)程要避免什么?2016-01-26
- 網(wǎng)站空間被掛馬的原因原因及解決2016-01-26
- 2016企業(yè)該如何運(yùn)用互聯(lián)網(wǎng)進(jìn)行營(yíng)銷2016-01-26
- WEB前端項(xiàng)目開(kāi)發(fā)中需注意的細(xì)節(jié)2016-01-26
- 低價(jià)網(wǎng)站建設(shè)的危害有哪些?2016-01-15
- 如何詳細(xì)的分析你網(wǎng)站的競(jìng)爭(zhēng)對(duì)手2015-06-10
- 網(wǎng)站設(shè)計(jì)中四個(gè)常犯的錯(cuò)誤2015-01-22
- 如何搭配網(wǎng)站設(shè)計(jì)中的色彩?2015-01-22