= 4.1.0, PHP 5, PHP 7, PHP 8)pcntl_signal — 安裝一個(gè)信號(hào)處理器說(shuō)明pcntl_signal(int $signo, callback $handler, bool $restart_syscalls = true):">
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — 安裝一個(gè)信號(hào)處理器
$signo
, callback $handler
, bool $restart_syscalls
= true): bool
函數(shù)pcntl_signal()為signo
指定的信號(hào)安裝一個(gè)新
的信號(hào)處理器。
signo
信號(hào)編號(hào)。
handler
信號(hào)處理器可以是用戶(hù)創(chuàng)建的函數(shù)或方法的名字,也可以是系統(tǒng)常量
SIG_IGN
(譯注:忽略信號(hào)處理程序)或SIG_DFL(默認(rèn)信號(hào)處理程序)
.
注意:
注意當(dāng)你使用一個(gè)對(duì)象方法的時(shí)候,該對(duì)象的引用計(jì)數(shù)回增加使得它在你改變?yōu)槠渌幚砘蚰_本結(jié)束之前是持久存在的。
restart_syscalls
指定當(dāng)信號(hào)到達(dá)時(shí)系統(tǒng)調(diào)用重啟是否可用。(譯注:經(jīng)查資料,此參數(shù)意為系統(tǒng)調(diào)用被信號(hào)打斷時(shí),系統(tǒng)調(diào)用是否從 開(kāi)始處重新開(kāi)始,但根據(jù)http://bugs.php.net/bug.php?id=52121,此參數(shù)存在bug無(wú)效。)
成功時(shí)返回 true
, 或者在失敗時(shí)返回 false
。
版本 | 說(shuō)明 |
---|---|
4.3.0 |
增加參數(shù)restart_syscalls 。
|
4.3.0 | 對(duì)象方法可以作為回調(diào)被使用。 |
4.3.0 | PCNTL現(xiàn)在使用了ticks作為信號(hào)處理的回調(diào)機(jī)制,ticks在速度上遠(yuǎn)遠(yuǎn)超過(guò)了之前的處理機(jī)制。 這個(gè)變化與“用戶(hù)ticks”遵循了相同的語(yǔ)義。您可以使用declare() 語(yǔ)句在程序中指定允許發(fā)生回調(diào)的位置。這使得我們對(duì)異步事件處理的開(kāi)銷(xiāo)最小化。在編譯PHP時(shí) 啟用pcntl將始終承擔(dān)這種開(kāi)銷(xiāo),不論您的腳本中是否真正使用了pcntl。 PHP 4.3.0使用ticks作為信號(hào)處理回調(diào)機(jī)制,這比以前的機(jī)制快了很多。這個(gè)變化與 "用戶(hù)ticks" 遵循了相同的語(yǔ)義。您可以使用declare() 語(yǔ)句在程序中指定允許發(fā)生回調(diào)的位置。 |
示例 #1 pcntl_signal()示例
<?php
//使用ticks需要PHP 4.3.0以上版本
declare(ticks = 1);
//信號(hào)處理函數(shù)
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// 處理SIGTERM信號(hào)
exit;
break;
case SIGHUP:
//處理SIGHUP信號(hào)
break;
case SIGUSR1:
echo "Caught SIGUSR1...\n";
break;
default:
// 處理所有其他信號(hào)
}
}
echo "Installing signal handler...\n";
//安裝信號(hào)處理器
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// 或者在PHP 4.3.0以上版本可以使用對(duì)象方法
// pcntl_signal(SIGUSR1, array($obj, "do_something");
echo "Generating signal SIGTERM to self...\n";
//向當(dāng)前進(jìn)程發(fā)送SIGUSR1信號(hào)
posix_kill(posix_getpid(), SIGUSR1);
echo "Done\n"
?>