類似於 asp中的 application 實現多用戶
的緩存共享
進程間共享變量
用戶在一個Web 應用 程序 中導航 時,如果能在Web服務器 上存儲用戶或會話的特定數據,從而每次請求網頁 時能很容易地訪問這些數據,將非常有用。存儲的可以 是有關用戶、用戶首選項的信息,或者是與應用程序相關的數據,如購物車中的數據。用戶每次請求包含session_start()函數調用的網頁時,服務 器會開始一個新進程(或重用一個空閒進程),PHP 引擎將在查詢字符串或cookie數據中查找一 個會話ID。這會獲取 到已保存的會話數據,並建立$_SESSION數 組。
在技巧 10-5已經提到,$_SESSION是一個超全局 變量,可以從任何代碼 段直接訪問。如果會話是活動的,可以 從$_SESSION數組獲取、增加、更新和刪除值。這與處理任何其他變量是類似的。引擎會在腳本結束時自動保存數組的值,除非因爲錯誤異常中止。會話數 據文件 會鎖定,以避免多個進程同時訪問(寫)相同的數據。 如果腳本執行的時間 很長,或者要從同一個服務器加載多個幀,可以優化應 用程序,使用session_write_close()或session_commit()關閉會話數據文件。不論使用其中哪一個命令,之後都不能再 向$_SESSION數組增加新的值。
共享內存是在進程中共享數據的另一種辦法。兩個進程同時運行時(可能由不同的客戶啓動),就可以使用共享內存。在 大多數情況下,共享內存比共享文件或數據庫 表的速度更快。在PHP中使用共享內存時,必須使 用–enable–shmop參數編譯。
說明 使用共享內存時,要求進程是持久的,如Apache模塊、IIS ISAPI或PHP-GTK應用程序。
shmop擴 展實現了6個簡單函數,如表10-8所示。
表10-8 shmop函數
函 數 名 |
描 述 |
shmop_open() |
打開或創建一個內存塊來共享 |
shmop_close() |
關閉一個共享內存塊 |
shmop_delete() |
刪除一個共享內存塊 |
shmop_read() |
從一個共享內存塊讀取數據 |
shmop_write() |
將數據寫到一個共享內存塊 |
shmop_size() |
得到一個共享內存塊的大小 |
使用一個共享 內存塊之前必須先創建它。可以使用shmop_open()函數創建共享內存塊,這個函數取4個參數。第一個參數是一個唯一ID(一個整數),用於標識這 個內存塊。第二個參數是一個標誌,指定了要如何訪問這個塊(a = 只讀,c = 創建或讀/寫,w = 讀寫, n = 創建新塊或失敗)。第三個參數指定了內存塊的入口,像文件系統 權限一樣作爲一個八進制數傳入(如0644)。第四 個參數(也是最後一個)設置 了塊的大小。如果打開一個現有的塊,第三個和第四個 參數應當設置爲0。
說明 共享內存塊的大小在創建時就已經固定,而且不能再改變。
下面的例子顯 示瞭如何創建並寫入一個內存塊。這個塊將在腳本結束時刪除並關閉,所以爲了說明共享內存的工作原理,腳本會在終止前等待60秒。這段時間應該足夠運行下一 個例子並查看共享內存。
代碼
如果另一個進程還要使用這個內存塊,就不能將其刪除,另一個進程可以訪問這 個數據,如下所示:
工作原理
在兩個腳本間共享內存時,要求這兩個腳本同時運行。第一個腳本 用一個字符串定義了一個共享內存塊,並從這個塊中讀取6個字節。第二個腳本通過同一個句柄(0×123)連接到同一個塊,再讀取整個字符串併發送給客戶。
命令行查看
ipcs -h for help.
[root@localhost html]# ipcs -m
------ Shared Memory Segments --------
key shmid
owner perms bytes nattch status
0x00000001
262144 root 644 4 0
[root@localhost html]#
可以看到,共享內存的key, shmid,所有者,權限,大小,attach數,和狀態。
刪除共享內存可以用ipcrm -m shmid或ipcrm -M shmkey命令來完成。
[root@localhost html]# ipcrm -M 0x00000001
[root@localhost html]#
ipcs -m
------ Shared Memory Segments --------
key shmid
owner perms bytes nattch status
[root@localhost html]#