亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP 使用pcntl和libevent 實現Timer功能

2024-05-04 23:19:03
字體:
來源:轉載
供稿:網友

PHP 使用pcntl和libevent 實現Timer功能,先看例子,pcntl(PHP線程)解釋在下面。

復制代碼 代碼如下:


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产丝袜视频一区| 尤物精品国产第一福利三区| 91色视频在线导航| 亚洲精品视频免费| 琪琪亚洲精品午夜在线| 最近日韩中文字幕中文| 久久夜色撩人精品| 日韩精品黄色网| 国产小视频国产精品| 欧美性xxxxhd| 欧美重口另类videos人妖| 久久中文精品视频| 中文字幕亚洲综合| 欧美成人国产va精品日本一级| 日韩不卡在线观看| 国产精品自拍偷拍| 亚洲精品久久久久久久久久久久久| 在线精品国产欧美| 欧美精品激情视频| 久久国产精彩视频| 国产视频欧美视频| 成人欧美一区二区三区在线| 欧美性在线观看| 亚洲欧美国产一区二区三区| 日韩在线中文字| 国外成人在线播放| 欧美视频专区一二在线观看| 久久久久久国产精品三级玉女聊斋| 亚洲天堂av在线免费| 91精品国产色综合| 中文字幕精品久久久久| 亚洲xxx自由成熟| 亚洲国产精品系列| 亚洲成人精品视频| 国产精品免费电影| 亚洲伊人久久大香线蕉av| 欧美激情成人在线视频| 欧美成人性生活| 亚洲人成网站999久久久综合| 日韩欧中文字幕| 韩国视频理论视频久久| 91精品免费视频| 亚洲精品久久久久久下一站| 亚洲bt欧美bt日本bt| 美女av一区二区三区| 中国日韩欧美久久久久久久久| 一本大道香蕉久在线播放29| 亚洲午夜女主播在线直播| 亚洲综合大片69999| 日韩性xxxx爱| 国产亚洲精品高潮| 国产在线视频不卡| 国产日韩在线视频| 69av在线播放| 国产国语videosex另类| 国产精品久久久久aaaa九色| 久久久久久久久久久av| 国产精品日韩专区| 精品一区二区三区四区在线| 日韩精品有码在线观看| 成人免费淫片aa视频免费| 国产91久久婷婷一区二区| 国产成人综合一区二区三区| 国产亚洲一区二区精品| 国产精品视频久久久久| 91久久精品国产91久久| 欧美日韩国产色| 亚洲国产成人精品电影| 亚洲第一福利在线观看| 久久久亚洲影院你懂的| 久热在线中文字幕色999舞| 在线观看亚洲区| 日韩高清欧美高清| 久久亚洲精品一区二区| 欧美尺度大的性做爰视频| 国产成人精品电影久久久| 久久久久久有精品国产| 久久久噜久噜久久综合| 国产精品偷伦免费视频观看的| 久久精品国产69国产精品亚洲| 精品国产一区二区三区四区在线观看| 国产精品免费小视频| 国产不卡一区二区在线播放| 亚洲午夜精品久久久久久久久久久久| 欧美乱大交xxxxx另类电影| 日本精品视频在线播放| 九九视频直播综合网| 国产精品999| 成人写真福利网| 精品一区电影国产| 国内精品一区二区三区| 57pao成人永久免费视频| 欧美在线性爱视频| 国产日韩欧美视频在线| 色综合天天狠天天透天天伊人| 久久久精品视频在线观看| 国外成人在线直播| 97在线视频免费播放| 国产亚洲精品成人av久久ww| 国产欧美亚洲精品| 欧美一级视频一区二区| 欧洲精品在线视频| 久久久精品视频在线观看| 亚洲视频在线免费观看| 亚洲国产精久久久久久久| 蜜月aⅴ免费一区二区三区| 91精品啪aⅴ在线观看国产| 欧美最猛性xxxxx亚洲精品| 国产精品久久久| 精品国产精品自拍| 成人免费视频在线观看超级碰| 色综合久久天天综线观看| 亚洲最新中文字幕| 国产一区二区三区中文| 成人h片在线播放免费网站| 欧美极品美女视频网站在线观看免费| 色妞在线综合亚洲欧美| 91丝袜美腿美女视频网站| 日韩在线视频国产| 国产成人精品在线观看| 国产精品国产三级国产aⅴ9色| 日韩免费在线免费观看| 久久精品国产2020观看福利| 98精品国产高清在线xxxx天堂| 国产精品av电影| 国产精品一区二区在线| 国外日韩电影在线观看| 黄色一区二区在线观看| 91沈先生作品| 91久久精品久久国产性色也91| 亚洲天堂男人天堂女人天堂| 欧美日韩精品国产| 国产精品入口夜色视频大尺度| 国内精品模特av私拍在线观看| 日本精品久久久久影院| 亚洲精品日韩激情在线电影| 久久高清视频免费| 992tv成人免费视频| 久久精品视频va| 91免费的视频在线播放| 久久久亚洲国产天美传媒修理工| 久久免费国产精品1| 亚洲国产精品视频在线观看| 国产精品一区二区电影| 亚洲精品videossex少妇| 国产91色在线免费| 日韩欧美视频一区二区三区| 成人高清视频观看www| 国产91精品视频在线观看| 亚洲一区中文字幕在线观看| 综合国产在线观看| 亚洲综合中文字幕68页| 欧美激情一区二区三区成人| 91免费欧美精品| 日本精品一区二区三区在线播放视频| 国产精品毛片a∨一区二区三区|国| 亚洲精品在线观看www| 国产精品丝袜一区二区三区| 91免费看视频.| 久久久综合av| 亚洲伊人久久大香线蕉av| 色香阁99久久精品久久久| 亚洲国产精久久久久久久| 国产成人一区二区在线|