免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

PHP共享內存與shmop的使用

2024-01-28    分類: 網站建設

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

分享標題:PHP共享內存與shmop的使用
網頁網址:http://m.newbst.com/news40/315890.html

成都網站建設公司_創新互聯,為您提供云服務器手機網站建設搜索引擎優化網站維護、品牌網站設計服務器托管

廣告

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

成都seo排名網站優化