多程序程式設計一定會遇到的問題就是:不同的程序間在兢爭相同的資源。
資源可能是螢幕的輸出或是資料庫的連線。
我們不希望兩個以上的程序兢爭螢幕輸出資源,到時可能演變成一個程序輸出兩行而另一個程序再輸出兩行,這樣的輸出是不能看的。
為了解決這個問題,我們必須引入互斥機制,就要有關鍵區域(Critical Area)和信號機(Semaphore)的技術。
在 PHP 下,可以參考官方文件 Semaphore, Shared Memory and IPC Functions
要是以上幾個名詞都忘了的話,再溫習一下作業系統的書吧。
預設情況下...Apache 是不會編譯 semaphore 進去的...所以通常都要自行compiler...還好...在CentOS 5.6 下...
如果yum升級到 PHP 5.3.3 則預設就包進去了...真是太方便了...
============================================================================
以下內容皆參考php官方手冊簡單翻譯出來的。
註:此系列函數不能使用在Windows平台下!
int ftok ( string $pathname , string $proj )
Convert a pathname and a project identifier to a System V IPC key.
將一個可存取的路徑和項目ID轉換成sysv可存取的IPC key (int)。 pathname:可存取的路徑。
proj:項目ID,必須是單一字元。
return:正確執行會返回一IPC key,錯誤會返回-1。
// 以下msg暫時不會使用到,所以沒有翻譯。
msg_get_queue — Create or attach to a message queue
msg_queue_exists — Check whether a message queue exists
msg_receive — Receive a message from a message queue
msg_remove_queue — Destroy a message queue
msg_send — Send a message to a message queue
msg_set_queue — Set information in the message queue data structure
msg_stat_queue — Returns information from the message queue data structure
bool sem_acquire ( resource $sem_identifier )
向信號機要求,信號機會減少一個資源數,並進入臨界區。
sem_identifier:信號機編號,由seg_get取得。
return:成功為TRUE,失敗為FALSE。
resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )
取得一個新的信號機。
參數:
key:信號機的編號,要是一個還沒有用過的編號。通常使用 ftok() 取得。
max_acquire:設定一個信號機要讓多少程序存取,預設為1。
perm:設定權限,預設為0666。
auto_release:當要求信號機關閉時是否要自動釋出記憶體,預設為1(是)。
return:信號機編號。
bool sem_release ( resource $sem_identifier )
向信號機通知釋放一個資源數,並離開臨界區。
sem_identifier:信號機編號,由seg_get取得。
return:成功為TRUE,失敗為FALSE。
bool sem_remove ( resource $sem_identifier )
移除一個信號機。
sem_identifier:信號機編號,由seg_get取得。
return:成功為TRUE,失敗為FALSE。
resource shm_attach ( int $key [, int $memsize [, int $perm ]] )
呼叫shm_attach()時,會返回一個可以存取system V shere memory的ID,第一次呼叫會建立一memsize大小的共享記憶體。
使用相同的key做第二次呼叫時會返回不同的ID,但兩個ID都是存取相同的共享記憶體。
key:使用IPC key
memsize:單位為bytes,限制如下:
SHMMAX:最大值 131072 bytes。
SHMMIN:最小值 1 byte。
SHMMNI:共享記憶體的最大數量100。
SHMSEG:每個程序所能使用共享記憶體的最大數量6。
perm:設定權限,預設為0666。
bool shm_detach ( resource $shm_identifier )
中止對共享記憶體的連結。
shm_identifier:由shm_attach()取得。
return:TRUE。
mixed shm_get_var ( resource $shm_identifier , int $variable_key )
取得共享記憶體中指定的變數值。
shm_identifier:由shm_attach()取得。
variable_key:可變的鍵值。
return:變數值。
bool shm_has_var ( resource $shm_identifier , int $variable_key )
檢查共享記憶體裡是否存在該鍵值。
shm_identifier:由shm_attach()取得。
variable_key:可變的鍵值。
return:成功為TRUE,失敗為FALSE。
bool shm_put_var ( resource $shm_identifier , int $variable_key , mixed $variable )
增加或修改共享記憶體中的變數值。
shm_identifier:由shm_attach()取得。
variable_key:可變的鍵值。
variable:變數內容
return:成功為TRUE,失敗為FALSE。
bool shm_remove_var ( resource $shm_identifier , int $variable_key )
移除指定的變數名稱
shm_identifier:由shm_attach()取得。
variable_key:可變的鍵值。
return:成功為TRUE,失敗為FALSE。
bool shm_remove ( resource $shm_identifier )
移除共享記憶體。
shm_identifier:由shm_attach()取得。
return:成功為TRUE,失敗為FALSE。