|
導(dǎo)讀網(wǎng)頁的本質(zhì)就是超級(jí)文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級(jí)文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立... 網(wǎng)頁的本質(zhì)就是超級(jí)文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級(jí)文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語言之所以稱為超文本標(biāo)記語言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。 注意:pcntl這個(gè)擴(kuò)展僅在cli/cgi模式下可用。mod_php和php-fpm中不可以使用。在web server環(huán)境中不要使用這組函數(shù),因?yàn)闀?huì)導(dǎo)致不可預(yù)料的結(jié)果。另,windows作為非類unix系統(tǒng),沒有這些函數(shù)。 PCNTL 使用ticks來作為信號(hào)處理機(jī)制(signal handle callback mechanism),可以最小程度地降低處理異步事件時(shí)的負(fù)載。何謂ticks?Tick 是一個(gè)在代碼段中解釋器每執(zhí)行 N 條低級(jí)語句就會(huì)發(fā)生的事件,這個(gè)代碼段需要通過declare來指定。 下面是一個(gè)隔5秒發(fā)送一個(gè)SIGALRM信號(hào),并由signal_handler函數(shù)獲取,然后打印一個(gè)“Caught SIGALRM”的例子: <?php
declare(ticks = 1);
function signal_handler($signal) {
print "Caught SIGALRM/n";
pcntl_alarm(5);
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(5);
while(true){
}
?>其實(shí)官方的pcntl_signal性能極差,主要是PHP的函數(shù)無法直接注冊到操作系統(tǒng)信號(hào)設(shè)置中,所以pcntl信號(hào)需要依賴tick機(jī)制來完成。 pcntl_signal的實(shí)現(xiàn)原理是,觸發(fā)信號(hào)后先將信號(hào)加入一個(gè)隊(duì)列中。然后在PHP的ticks回調(diào)函數(shù)中不斷檢查是否有信號(hào),如果有信號(hào)就執(zhí)行PHP中指定的回調(diào)函數(shù),如果沒有則跳出函數(shù)。 ticks=1表示每執(zhí)行1行PHP代碼就回調(diào)此函數(shù)。實(shí)際上大部分時(shí)間都沒有信號(hào)產(chǎn)生,但ticks的函數(shù)一直會(huì)執(zhí)行。 比較好的做法是去掉ticks,轉(zhuǎn)而使用pcntl_signal_dispatch,在代碼循環(huán)中自行處理信號(hào)。 pcntl_signal_dispatch的實(shí)現(xiàn)<?php
// 定義一個(gè)處理器,接收到SIGINT信號(hào)后只輸出一行信息
function signalHandler($signo) {
switch ($signo) {
case SIGUSR1: echo "SIGUSR1\n"; break;
case SIGUSR2: echo "SIGUSR2\n"; break;
default: echo "unknow"; break;
}
}
//安裝信號(hào)觸發(fā)器器
pcntl_signal(SIGINT, 'signalHandler');
while (true) {
sleep(1);
posix_kill(posix_getpid(), SIGUSR1);///向當(dāng)前進(jìn)程發(fā)送SIGUSR1信號(hào)
pcntl_signal_dispatch(); //接收到信號(hào)時(shí),調(diào)用注冊的signalHandler()
}PCNTL的函數(shù):信號(hào)處理int pcntl_alarm ( int $seconds ) 設(shè)置一個(gè)$seconds秒后發(fā)送SIGALRM信號(hào)的計(jì)數(shù)器 bool pcntl_signal(int $signo ,callback $handler [,bool $restart_syscalls=true]) 為$signo設(shè)置一個(gè)處理該信號(hào)的回調(diào)函數(shù) 第一個(gè)參數(shù)是信號(hào)編號(hào) 第二個(gè)參數(shù)是信號(hào)發(fā)生時(shí)回調(diào)的PHP函數(shù)。 第三個(gè)參數(shù)是是否restart,是否重新注冊此信號(hào)。這個(gè)參數(shù)如果為false,那此信號(hào)只注冊處理一次。 注意:每次對 pcntl_alarm()的調(diào)用都會(huì)取消之前設(shè)置的alarm信號(hào)和sleep()函數(shù)。 下面是一個(gè)隔5秒發(fā)送一個(gè)SIGALRM信號(hào),并由signal_handler函數(shù)獲取,然后打印一個(gè)“Caught SIGALRM”的例子: <?php
declare(ticks = 1);
function signal_handler($signal) {
print "Caught SIGALRM/n";
pcntl_alarm(5);
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(5);
for(;;) {
}
?>執(zhí)行程序void pcntl_exec ( string $path [, array $args [, array $envs ]] ) 在當(dāng)前的進(jìn)程空間中執(zhí)行指定程序,類似于c中的exec族函數(shù)。所謂當(dāng)前空間,即載入指定程序的代碼覆蓋掉當(dāng)前進(jìn)程的空間,執(zhí)行完該程序進(jìn)程即結(jié)束。 <?php
$dir = '/home/test/';
$cmd = 'ls';
$option = '-l';
$pathtobin = '/bin/ls';
$arg = array($cmd, $option, $dir);
pcntl_exec($pathtobin, $arg);
echo '123'; //不會(huì)執(zhí)行到該行
?>創(chuàng)建進(jìn)程int pcntl_fork ( void ) 為當(dāng)前進(jìn)程創(chuàng)建一個(gè)子進(jìn)程 int pcntl_wait ( int &$status [, int $options ] ) 阻塞當(dāng)前進(jìn)程,只到當(dāng)前進(jìn)程的一個(gè)子進(jìn)程退出或者收到一個(gè)結(jié)束當(dāng)前進(jìn)程的信號(hào)。 int pcntl_waitpid ( int $pid , int &$status [, int $options ] ) 功能同pcntl_wait,區(qū)別為waitpid為等待指定pid的子進(jìn)程。當(dāng)pid為-1時(shí)pcntl_waitpid與pcntl_wait一樣。 在 pcntl_wait和pcntl_waitpid兩個(gè)函數(shù)中的$status中存了子進(jìn)程的狀態(tài)信息,這個(gè)參數(shù)可以用于 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、 pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid這些函數(shù)。 舉個(gè)例子 <?php
$pid = pcntl_fork();
if($pid) {
pcntl_wait($status);
$id = getmypid();
echo "parent process,pid {$id}, child pid {$pid}/n";
} else {
$id = getmypid();
echo "child process,pid {$id}/n";
sleep(2);
}
?>子進(jìn)程在輸出child process等字樣之后sleep了2秒才結(jié)束,而父進(jìn)程阻塞著直到子進(jìn)程退出之后才繼續(xù)運(yùn)行。 進(jìn)程優(yōu)先級(jí)int pcntl_getpriority ([ int $pid [, int $process_identifier ]] ) 取得進(jìn)程的優(yōu)先級(jí),即nice值,默認(rèn)為0。不同的系統(tǒng)類型以及內(nèi)核版本下 優(yōu)先級(jí)可能不同(手冊中為-20到20) bool pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] ) 設(shè)置進(jìn)程的優(yōu)先級(jí) 以上就是php如何處理進(jìn)程信號(hào)(附實(shí)例)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章! 網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語,涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!