pcntl_signal
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — 安裝一個訊號處理器
說明
   pcntl_signal(int 
  $signo, callback $handler, bool $restart_syscalls = true): bool
   函式pcntl_signal()為signo指定的訊號安裝一個新
   的訊號處理器。
  
參數
- 
signo
- 
      訊號編號。 
- 
handler
- 
      訊號處理器可以是使用者建立的函式或方法的名字,也可以是系統常量 SIG_IGN(譯註:忽略訊號處理程式)或SIG_DFL(預設訊號處理程式).注意: 注意當你使用一個對像方法的時候,該對象的引用計數回增加使得它在你改變為其他處理或指令碼結束之前是持久存在的。 
- 
restart_syscalls
- 
      指定當訊號到達時系統呼叫重啟是否可用。(譯註:經查資料,此參數意為系統呼叫被訊號打斷時,系統呼叫是否從 開始處重新開始,但根據http://bugs.php.net/bug.php?id=52121,此參數存在bug無效。) 
返回值
   成功時返回 true, 或者在失敗時返回 false。
  
更新日誌
| 版本 | 說明 | 
|---|---|
| 4.3.0 | 增加參數 restart_syscalls。 | 
| 4.3.0 | 對像方法可以作為回撥被使用。 | 
| 4.3.0 | PCNTL現在使用了ticks作為訊號處理的回撥機制,ticks在速度上遠遠超過了之前的處理機制。 這個變化與「使用者ticks」遵循了相同的語義。您可以使用declare() 語句在程式中指定允許發生回撥的位置。這使得我們對非同步事件處理的開銷最小化。在編譯PHP時 啟用pcntl將始終承擔這種開銷,不論您的指令碼中是否真正使用了pcntl。 PHP 4.3.0使用ticks作為訊號處理回撥機制,這比以前的機制快了很多。這個變化與 "使用者ticks" 遵循了相同的語義。您可以使用declare() 語句在程式中指定允許發生回撥的位置。 | 
範例
示例 #1 pcntl_signal()示例
<?php
//使用ticks需要PHP 4.3.0以上版本
declare(ticks = 1);
//訊號處理函式
function sig_handler($signo)
{
     switch ($signo) {
         case SIGTERM:
             // 處理SIGTERM訊號
             exit;
             break;
         case SIGHUP:
             //處理SIGHUP訊號
             break;
         case SIGUSR1:
             echo "Caught SIGUSR1...\n";
             break;
         default:
             // 處理所有其他訊號
     }
}
echo "Installing signal handler...\n";
//安裝訊號處理器
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// 或者在PHP 4.3.0以上版本可以使用對像方法
// pcntl_signal(SIGUSR1, array($obj, "do_something");
echo "Generating signal SIGTERM to self...\n";
//向當前程序發送SIGUSR1訊號
posix_kill(posix_getpid(), SIGUSR1);
echo "Done\n"
?>
參見
- pcntl_fork() - 在目前程序目前位置產生分支(子程序)。譯註:fork是建立了一個子程序,父程序和子程序 都從fork的位置開始向下繼續執行,不同的是父程序執行過程中,得到的fork返回值為子程序 號,而子程序得到的是0。
- pcntl_waitpid() - 等待或返回fork的子程序狀態