function newChild($func_name) { echo "enter newChild/n"; $args = func_get_args(); unset($ " /> 波多野结衣与公中出中文字幕,黄色天堂网,亚洲欧美日韩国产综合

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP 使用pcntl和libevent 實(shí)現(xiàn)Timer功能

php 使用pcntl和libevent 實(shí)現(xiàn)Timer功能,先看例子,pcntl(php線程)解釋在下面。
復(fù)制代碼 代碼如下:
<?php 

function newChild($func_name) { 
    echo "enter newChild/n"; 
    $args = func_get_args(); 
    unset($args[0]); 
    $pid =  pcntl_fork(); 
    if ($pid == 0) { 
        function_exists($func_name) and exit(call_user_func_array($func_name, $args)) or exit(-1); 
    } else if($pid == -1) { 
        echo "Couldn't create child process"; 
    } else { 
        return $pid; 
    } 


(PS:^_^不錯(cuò)的php開(kāi)發(fā)交流群:256271784,驗(yàn)證:csl,有興趣的話可以加入進(jìn)來(lái)一起討論)
function on_timer() { 
    echo "timer called/n"; 


  
/**
 * @param $func string, function name
 * @param $timeouts int, microtimes for time delay
 */
function timer($func, $timeouts){ 

  
    echo "enter timer/n"; 
    $base = event_base_new(); 
    $event = event_new(); 

  
    event_set($event, 0, EV_TIMEOUT, $func); 
    event_base_set($event, $base); 
    event_add($event, $timeouts); 

  
    event_base_loop($base); 


  
$pid = newChild("timer", "on_timer", 5000000); 

  
if ($pid > 0) { 
    echo "master process exit/n"; 
}

php 擴(kuò)展pcntl 實(shí)現(xiàn) ” 多線程 ”( 進(jìn)程 )
pcntl 與 ticks
ticks 是通過(guò) declare(ticks = n) {statement} 語(yǔ)法定義的 , declare 語(yǔ)法目前只能接受 ticks, 他定義的 ticks = n 的意義是當(dāng) declare 指定的語(yǔ)句塊中執(zhí)行了 N 條低級(jí)語(yǔ)句去發(fā)生一個(gè)事件 , 這個(gè)事件可以通過(guò) register_tick_function($function_name) 來(lái)注冊(cè) .
pcntl 的信號(hào)機(jī)制是基于 ticks 機(jī)制實(shí)現(xiàn)的 . 因此 , 我們使用 pcntl 族函數(shù)中信號(hào)相關(guān)的函數(shù)時(shí) , 需要在前面增加 declare(ticks = n) 語(yǔ)法結(jié)構(gòu) .
int pcntl_alarm(int $seconds):
$seconds 秒后向進(jìn)程發(fā)送一個(gè) SIGALRM 信號(hào) , 每次調(diào)用 pcntl_alarm 方法都會(huì)取消之前設(shè)置的時(shí)鐘 .
void pcntl_exec(string $path[, array $args[, array $env]]):
在當(dāng)前進(jìn)程空間執(zhí)行一個(gè)程序 .
$path: 必須是二進(jìn)制可執(zhí)行文件 , 或具有有效腳本頭信息 (#!/usr/local/bin/php) 的腳本文件路徑 .
$args: 將要傳遞給該程序的字符串參數(shù)列表 ( 數(shù)組形式 )
$envs: 環(huán)境變量 . 以數(shù)組 (key => value 形式 ) 方式傳遞給要執(zhí)行程序的環(huán)境變量 .
int pcntl_for k (void):
創(chuàng)建一個(gè)子進(jìn)程 , 該子進(jìn)程與父進(jìn)程僅僅是 PID( 進(jìn)程號(hào) ) 和 PPID( 父進(jìn)程號(hào) ) 不同 .
在父線程執(zhí)行時(shí)返回創(chuàng)建的子進(jìn)程 pid, 在子線程執(zhí)行時(shí)返回 0, 創(chuàng)建子進(jìn)程失敗時(shí)會(huì)在父進(jìn)程上下文返回 -1, 并引發(fā) php 錯(cuò)誤 .
理解這里的 fork 需要知道 : pcntl_fork 創(chuàng)建的是一個(gè)分支節(jié)點(diǎn) , 相當(dāng)于一個(gè)標(biāo)記 , 父進(jìn)程完成后 , 子進(jìn)程會(huì)從標(biāo)記處繼續(xù)執(zhí)行 , 也就是說(shuō) pcntl_fork 后面的代碼分別被父進(jìn)程和子進(jìn)程執(zhí)行了兩遍 , 而兩個(gè)進(jìn)程在執(zhí)行過(guò)程中得到的返回值是不同的 . 因此 , 才可以分離父子進(jìn)程執(zhí)行不同的代碼 .
int pcntl_getpriority([int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]):
獲取給定 $pid 對(duì)應(yīng)的進(jìn)程的優(yōu)先級(jí) , 默認(rèn)是通過(guò) getmypid() 獲取到的值也就是當(dāng)前進(jìn)程 .
$pid: 如果沒(méi)有指定 , 默認(rèn)是當(dāng)前進(jìn)程 .
$process_identifier: PRIO_PGRP, PRIO_USER, PRIO_PROCESS 三者之一 , 默認(rèn) PRIO_PROCESS. 其中 PRIO_PGRP 指獲取進(jìn)程組的優(yōu)先級(jí) , PRIO_USER 指獲取用戶進(jìn)程的優(yōu)先級(jí) , PRIO_PROCESS 指獲取特定進(jìn)程優(yōu)先級(jí) .
返回進(jìn)程的優(yōu)先級(jí) , 或者在發(fā)生錯(cuò)誤時(shí)返回 false, 值越小說(shuō)明越優(yōu)先
bool pcntl_setpriority(int $priority[, int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]:
設(shè)置進(jìn)程的優(yōu)先級(jí) .
$priority: 優(yōu)先級(jí)值 , -20 到 20 的范圍內(nèi) , 默認(rèn)優(yōu)先級(jí)為 0.   值越小說(shuō)明越優(yōu)先 .
$pid: 如果沒(méi)有指定 , 指當(dāng)前進(jìn)程
$process_identifier: 意義同 pcntl_getpriority 的 $process_identifier.
設(shè)置成功返回 TRUE, 失敗返回 FALSE.
bool pcntl_signal_dispatch(void):
調(diào)用通過(guò) pcntl_signal() 安裝的即將發(fā)生的信號(hào)的處理器 .
調(diào)用成功返回 TRUE, 失敗返回 false.
php 5.3.3 加入
bool pcntl_signal(int $signo, callback $handler[, bool $restart_syscalls = true]):
為指定的信號(hào) $signo 安裝一個(gè)新的信號(hào)處理器 $handler.
最后一個(gè)參數(shù)不明白意義 .
bool pcntl_sigprocmask(int $how, array $set[, array &$oldset]):
增加 , 刪除或設(shè)置鎖信號(hào) , 具體的行為依賴于 $how 參數(shù)
$how: SIG_BLOCK 用于把信號(hào)增加到當(dāng)前鎖信號(hào)中 , SIG_UNBLOCK 用于把信號(hào)從當(dāng)前鎖信號(hào)中移除 , SIG_SETMASK 用于用給定的信號(hào)列表替換當(dāng)前鎖信號(hào) .
$set: 要增加 , 移除或設(shè)置的信號(hào)列表 .
$oldset: 用于向調(diào)用者返回舊的鎖定信號(hào) .
成功返回 TRUE, 失敗返回 FALSE.
int pcntl_sigtimedwait(array $set[, array &$siginfo[, int $seconds = 0[, int $nanoseconds = 0]]]):
pcntl_sigtimedwait 實(shí)際上和 pcntl_sigwaitinfo() 所做的是同樣的事情 , 不過(guò) pcntl_sigtimedwait 多了兩個(gè)增強(qiáng)的參數(shù) $seconds 和 $nanoseconds, 這樣就允許腳本的停留時(shí)間有一個(gè)上限而不是無(wú)限制等待 .
$set: 需要等待的信號(hào)列表
$siginfo: 用來(lái)向調(diào)用者返回等待得到的信號(hào)的信息 , 信息內(nèi)容見(jiàn) pcntl_sigwaitinfo
$seconds: 超時(shí)的秒數(shù)
$nanoseconds: 超時(shí)的納秒數(shù)
成功后 , pcntl_sigtimedwiat() 返回信號(hào)編號(hào)
int pcntl_sigwaitinfo(array $set[, array &$siginfo]):
掛起當(dāng)前腳本的執(zhí)行 , 直到接受到 $set 中的某個(gè)信號(hào) , 如果其中的一個(gè)信號(hào)將要到達(dá) ( 比如被 pcntl_sigprocmask 鎖定 ) 那么 pcntl_sigwaitinfo 將會(huì)立刻返回
$set: 等待的信號(hào)列表
$siginfo: 用來(lái)向調(diào)用者返回等待得到的信號(hào)的信息 , 該信息包含以下內(nèi)容 :
1.       所有信號(hào)都有以下三個(gè)信息 :
a)        signo: 信號(hào)編號(hào)
b)        errno: 錯(cuò)誤號(hào)
c)         code: 信號(hào)代碼
2.       SIGCHLD 信號(hào)特有的信息
a)        status: 退出的值或信號(hào)
b)        utime: 用戶消耗時(shí)間
c)         stime: 系統(tǒng)消耗時(shí)間
d)        pid: 發(fā)送進(jìn)程 id
e)        uid: 發(fā)送進(jìn)程的真實(shí)用戶 id
3.       SIGILL, SIGFPE, SIGSEGV, SIGBUS 擁有的信息
a)        addr: 產(chǎn)生故障的內(nèi)存位置
4.       SIGPOLL 特有的信息 :
a)        band: band event, 意義未知
b)        fd: 文件描述符
函數(shù)成功運(yùn)行返回信號(hào)編號(hào)
int pcntl_wait(int &$status[, int *options = 0]):
掛起當(dāng)前進(jìn)程直到一個(gè)子進(jìn)程退出或直到一個(gè)信號(hào)要求終止當(dāng)前進(jìn)程或調(diào)用一個(gè)信號(hào)處理函數(shù) . 如果子進(jìn)程在調(diào)用時(shí)已經(jīng)退出 ( 俗稱成為了僵尸進(jìn)程 ), 此函數(shù)會(huì)馬上返回 , 所有的系統(tǒng)資源都將被釋放 .
$status 用來(lái)保存子進(jìn)程的狀態(tài)信息 , 該狀態(tài)信息由以下函數(shù)產(chǎn)生 : pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig.
$options: 如果你的系統(tǒng)允許 wait3( 大多數(shù)的 BSD 類系統(tǒng) ), 你可以提供一個(gè)可選的 options 參數(shù) , 如果不提供這個(gè)參數(shù) , wait 將會(huì)使用系統(tǒng)調(diào)用 , 如果系統(tǒng)不允許 wait3, 提供這個(gè)參數(shù)不會(huì)有任何影響 , $options 的值可以是 0 或者 WNOHANG 和 WUNTRACED 兩個(gè)常數(shù) .
函數(shù)返回退出的子進(jìn)程的 PID, 或在錯(cuò)誤時(shí)返回 -1, 或者如果提供 WNOHANG 作為 option(wait3 不可用的系統(tǒng) ) 并且無(wú)有效子進(jìn)程返回 0
僵尸進(jìn)程 : 由于父進(jìn)程在 fork 之后 , 無(wú)法預(yù)知子進(jìn)程什么時(shí)候結(jié)束 , 所以子進(jìn)程為了要留給父進(jìn)程一些信息 , 會(huì)留下一個(gè)稱作僵尸的數(shù)據(jù)結(jié)構(gòu) , 等待由父進(jìn)程發(fā)起 wait 的操作來(lái)為它收尸 , 在子進(jìn)程結(jié)束 ( 邏輯結(jié)束 ) 到父進(jìn)程收尸前這一段時(shí)間子進(jìn)程就被稱為僵尸進(jìn)程 , 在父進(jìn)程結(jié)束后 , 所有的子進(jìn)程會(huì)交由 Init 來(lái)負(fù)責(zé) , 因此 , 如果父進(jìn)程結(jié)束 , 僵尸進(jìn)程都會(huì)被回收 , 但是 , 如果父進(jìn)程永遠(yuǎn)不結(jié)束 , 這些僵尸進(jìn)程就一直占用進(jìn)程號(hào) , 如果系統(tǒng)進(jìn)程號(hào)耗盡 , 那么將導(dǎo)致無(wú)法啟動(dòng)新進(jìn)程 , 因此 , 安全的做法是在父進(jìn)程中為自己產(chǎn)生的子進(jìn)程去收尸 .
int pcntl_waitpid(int $pid, int &$status[, int $options = 0]):
掛起當(dāng)前進(jìn)程直到給定 $pid 的子進(jìn)程退出 , 或者當(dāng)前進(jìn)程接受到一個(gè)退出信號(hào) , 或者接受到一 ige 信號(hào)去調(diào)用一個(gè)信號(hào)處理器 .
如果給定 $pid 對(duì)應(yīng)的子進(jìn)程在調(diào)用此函數(shù)時(shí)已經(jīng)退出 ( 僵尸態(tài) ), 函數(shù)立刻返回 , 所有的系統(tǒng)資源被釋放 .
$pid: 進(jìn)程號(hào) , 小于 -1 表明等待的是進(jìn)程組中的任何子進(jìn)程 , 進(jìn)程組號(hào)就是 $pid 的絕對(duì)值 . 等于 -1 表明等待任意紫禁城 , 與 pcntl_wait 函數(shù)行為一致 . 等于 0 代表等待與調(diào)用進(jìn)程在同一組的子進(jìn)程 , 大于 0 代表是特定的進(jìn)程 .
$status: 用來(lái)由函數(shù)返回子進(jìn)程狀態(tài) . 該狀態(tài)信息由以下函數(shù)產(chǎn)生 : pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig.
$options: 與 pcntl_wait 的 $options 意義相同
int pcntl_wexitstatus(int $status):
返回一個(gè)已經(jīng)中斷的子進(jìn)程返回代碼 , 此函數(shù)僅在 pcntl_wifexited 函數(shù)返回 TRUE 時(shí)有用 .
$status 參數(shù)是 pcntl_waitpid 產(chǎn)生的狀態(tài)信息 .
bool pcntl_wifexited(int $status):
檢查給定狀態(tài)是否表明子進(jìn)程是正常退出的 .
bool pcntl_wifsignaled(int $status):
檢查給定狀態(tài)是否表明子進(jìn)程是由于收到某個(gè)信號(hào)退出的 .
bool pcntl_wifstopped(int $status):
檢查 $status 是否能表明子進(jìn)程當(dāng)前已經(jīng)停止 , 這個(gè)函數(shù)只有在作用于 pcntl_waitpid 函數(shù)使用的 WUNTRACED 作為 $options 參數(shù)的值時(shí)產(chǎn)生的 $status 上才有效 .
int pcntl_wstopsig(int $status):
通過(guò)分析 $status 返回使得子進(jìn)程停止的信號(hào)的編號(hào) , 這個(gè)函數(shù)只有在 pcntl_wifsignaled 返回 TRUE 時(shí)才有效 .
int pcntl_wtermsig(int $status):
返回使進(jìn)程中斷的信號(hào)編號(hào) . 這個(gè)函數(shù)只有在 pcntl_wifsignaled 返回 TRUE 時(shí)才有效 .

php技術(shù)PHP 使用pcntl和libevent 實(shí)現(xiàn)Timer功能,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 91超级碰| 国语自产精品视频在线区 | 狠狠做狠狠做综合日日 | 手机成人在线视频 | 涩涩涩综合在线亚洲第一 | 色综久久天天综合绕视看 | 91蝌蚪视频在线观看 | 国产精品免费_区二区三区观看 | 国产精品久久久亚洲456 | 亚洲一区二区在线视频 | 精品伊人久久香线蕉 | 97久久精品国产成人影院 | 亚洲日本1区2区3区二区 | 一色屋成人免费精品网站 | 一本伊人 | 久久er国产精品免费观看8 | 在线视频 一区二区 | 中文字幕在线观看一区二区三区 | 一级做a爰片性色毛片男 | 五月天婷婷久久 | 麻豆一区二区 | 国产美女精品三级在线观看 | 国产成人一区 | 91中文| 777色淫网站女女免费 | 黄色在线免费观看网址 | 久久久久久久91精品免费观看 | 亚洲国产精品久久久久秋霞小 | 欧美视频在线观 | 亚洲视频黄色 | 久久密| 精品资源在线 | 天天影视亚洲 | 91在线播放视频 | 久久精品国内一区二区三区 | 欧美午夜性刺激在线观看免费 | 国产一区福利 | 国产精品欧美亚洲韩国日本不卡 | 国内精品久久久久久野外 | 色吧亚洲欧美另类 | 91在线视频免费观看 |