PHP共享內(nèi)存與shmop的使用

2024-01-28    分類: 網(wǎng)站建設(shè)

  現(xiàn)在的Web已經(jīng)對(duì)跨會(huì)話的通信有很高的需求了,比如在線聊天室等。這些基于客戶端事件而且數(shù)據(jù)更新頻繁的東西當(dāng)然NodeJS來做比較好。NodeJS除了便于處理事件外,更重要的是它有服務(wù)器級(jí)的內(nèi)存變量。如果要在PHP中實(shí)現(xiàn),最好的方式就是讓會(huì)話共享內(nèi)存。    跨會(huì)話的通信也經(jīng)常使用數(shù)據(jù)庫或硬盤來中轉(zhuǎn)。硬盤的方法我不推薦,PHP訪問硬盤的效率本身就不高,而且頻繁的讀寫硬盤對(duì)硬盤本身也是一種開銷。另一種是數(shù)據(jù)庫中轉(zhuǎn)的方式,這是最容易擴(kuò)展也是最穩(wěn)定的方式。也許有人會(huì)問,數(shù)據(jù)庫不是存在硬盤上的嗎?和直接操作硬盤有什么區(qū)別?因?yàn)閹缀跛械臄?shù)據(jù)庫都有緩存機(jī)制,即使是普通表,也會(huì)在內(nèi)存中做緩存,所以它可以比直接訪問硬盤的效率高。而且數(shù)據(jù)庫還有內(nèi)存表模式,表完全在內(nèi)存中,速度當(dāng)然就更快了。另外,數(shù)據(jù)庫未必是SQL,還有NoSQL,比如使用memcache連關(guān)系化解析都省了,這當(dāng)然效率高。而且這些數(shù)據(jù)庫提供了一系列的標(biāo)準(zhǔn)讀寫操作,所以更容易擴(kuò)展。   這些數(shù)據(jù)庫已經(jīng)提供了內(nèi)存讀寫,為什么我還要在程序里搞共享內(nèi)存呢?這當(dāng)然有其它因素需要考慮。雖然數(shù)據(jù)庫也可以直接讀寫內(nèi)存,但是數(shù)據(jù)庫本身畢竟是作為一個(gè)數(shù)據(jù)的中轉(zhuǎn)。我們的程序與數(shù)據(jù)庫通信是走端口的,這個(gè)過程的開銷不容忽視。至少,與程序內(nèi)直接訪問變量的速度相比,通過端口去查詢數(shù)據(jù)庫,再把數(shù)據(jù)返回給程序,這個(gè)過程就太繞了。所以如果某個(gè)模塊需要一個(gè)高效的跨會(huì)話通信功能,直接讓程序訪問內(nèi)存當(dāng)然是最好的做法。   不過PHP畢竟不是C++,訪問內(nèi)存需要調(diào)用封裝好的函數(shù)的,這效率其實(shí)并不高。我在Win7+Apache下測(cè)試的結(jié)果是讀取內(nèi)存的效率是訪問普通變量的四分之一,不過我覺得這個(gè)效率對(duì)PHP而言已經(jīng)很高了。另外,PHP并沒有C++那么靈活的指針功能,我們儲(chǔ)存在內(nèi)存中的字節(jié)串也只是字節(jié)串而已,無法直接把它當(dāng)做對(duì)象來讀入。所以這就有很大的局限性,不過對(duì)于簡(jiǎn)單的通信還是可以勝任的。   PHP做內(nèi)存共享有兩套接口。一個(gè)是shm,它實(shí)際上是變量共享,會(huì)把對(duì)象變量序列化后再儲(chǔ)存。使用起來倒是挺方便,但是序列化存儲(chǔ)對(duì)于效率優(yōu)先的內(nèi)存訪問操作而言就沒啥意義了。更重要的是它是LinuxOnly的,所以我就不理它了。另外一個(gè)是shmop,它是Linux和Windows通用的,不過功能上比shm弱了一些。   接下來手冊(cè)上有的東西我就不說了,就說一些使用shmop要注意的地方。首先是shmop_open這個(gè)函數(shù)的參數(shù)列表,手冊(cè)上說的很模糊。它有4個(gè)參數(shù),key、flags、mode、size。flags和size沒啥好說的,key是自己給定的一個(gè)數(shù)字,每一個(gè)不同的數(shù)字標(biāo)示一塊不同的內(nèi)存,值隨便給定,只要在自己的程序邏輯中不混亂就行了。當(dāng)然如果一個(gè)Apache下有多個(gè)站點(diǎn)就需要事先協(xié)商好,這也是shmop大的一個(gè)坑,就是因?yàn)檫@個(gè)所以擴(kuò)展性穩(wěn)定性都不如使用數(shù)據(jù)庫。mode參數(shù)是設(shè)置內(nèi)存塊的訪問權(quán)限,和文件的權(quán)限設(shè)置一樣,翻到手冊(cè)的chmod函數(shù)介紹上就可以找到詳細(xì)信息。還有shmop_delete函數(shù)也很詭異,我測(cè)試時(shí)創(chuàng)建的內(nèi)存塊是無法通過這個(gè)函數(shù)刪除的。查了一些資料后才知道這個(gè)函數(shù)只是把塊標(biāo)記為刪除,進(jìn)程結(jié)束后才釋放。這就坑爹了,進(jìn)程結(jié)束后釋放不是廢話嗎?不調(diào)用它難道進(jìn)程結(jié)束后可以不釋放?總之,一旦使用shmop創(chuàng)建了內(nèi)存塊就釋放不掉的,除非進(jìn)程結(jié)束。所以在創(chuàng)建內(nèi)存塊時(shí)建議key參數(shù)用常量而不用變量,否則很有可能造成內(nèi)存泄露。   PHP確實(shí)不適合做這樣的工作,顯然NodeJS要方便的多。但是沒辦法,以前的程序是PHP寫的,要全部重寫工作量太大了。我也正在努力的脫離PHP,以后就不糾結(jié)這么蛋疼的問題了。 本文來源于成都網(wǎng)站建設(shè)公司與成都網(wǎng)站設(shè)計(jì)制作公司-創(chuàng)新互聯(lián)成都公司!

分享標(biāo)題:PHP共享內(nèi)存與shmop的使用
網(wǎng)頁網(wǎng)址:http://www.muchs.cn/news40/315890.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、手機(jī)網(wǎng)站建設(shè)、搜索引擎優(yōu)化網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化