查看完整版本: 什麼是 PHP semaphore 信號機?


lancer 2011-7-29 16:25

什麼是 PHP semaphore 信號機?

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