字體:  

什麼是 PHP semaphore 信號機?

lancer 發表於: 2011-7-29 16:25 來源: ADJ網路控股集團


多程序程式設計一定會遇到的問題就是:不同的程序間在兢爭相同的資源。

 

資源可能是螢幕的輸出或是資料庫的連線。

我們不希望兩個以上的程序兢爭螢幕輸出資源,到時可能演變成一個程序輸出兩行而另一個程序再輸出兩行,這樣的輸出是不能看的。

 

為了解決這個問題,我們必須引入互斥機制,就要有關鍵區域(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。