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

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

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

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

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

廣告

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

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