青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2016年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 220951
  • 排名 - 117

最新評論

閱讀排行榜

http://www.jb51.net/article/42447.htm
PHP 中實現Timer功能,中間使用到了php多線程,本文給出來pcntl的解釋。

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 時才有效 .

您可能感興趣的文章:

posted on 2016-08-18 10:59 思月行云 閱讀(215) 評論(0)  編輯 收藏 引用 所屬分類: PHP
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲日本激情| 麻豆国产va免费精品高清在线| 欧美黑人一区二区三区| 亚洲国产欧美不卡在线观看| 欧美a级大片| 亚洲欧洲一区二区在线播放| 亚洲一区日本| 狠狠久久婷婷| 欧美色偷偷大香| 久久精品国产亚洲a| 国产精品嫩草99av在线| 欧美激情自拍| 欧美在线综合视频| 91久久香蕉国产日韩欧美9色| 欧美激情一区二区在线| 先锋影音久久久| 亚洲麻豆一区| 久久这里只有| 欧美一区二区三区视频免费| 亚洲区在线播放| 99精品国产热久久91蜜凸| 国产精品久久久久毛片软件 | 正在播放亚洲一区| 久久免费99精品久久久久久| 亚洲综合日韩| 久久久久国产精品人| 亚洲午夜久久久久久久久电影网| 伊人成人网在线看| 国产精品热久久久久夜色精品三区| 久久综合伊人77777| 亚洲欧美一区二区激情| 99精品视频一区二区三区| 欧美高清在线视频观看不卡| 久久久久高清| 亚洲国产日日夜夜| 亚洲影院在线观看| 亚洲一区二区三区在线看| 久久精品一区二区国产| 久久久久久久一区| 欧美黄污视频| 亚洲欧美在线播放| 欧美精品自拍| 欧美成人午夜激情在线| 欧美xart系列在线观看| 国产精品久久久对白| 欧美三级免费| 亚洲第一福利社区| 亚洲欧洲日产国产综合网| 亚洲欧美日韩另类| 欧美在线观看视频在线| 亚洲国产精品小视频| 欧美一区二区三区视频免费播放 | 久久九九精品99国产精品| 欧美精彩视频一区二区三区| 国产自产女人91一区在线观看| 国产精品美女久久| 日韩一级大片| 欧美激情第10页| 久久精品国产99国产精品澳门| 国产精品白丝jk黑袜喷水| 国产精品入口| 亚洲午夜三级在线| 亚洲免费观看| 欧美日在线观看| 亚洲国产mv| 99re6热在线精品视频播放速度| 久久嫩草精品久久久精品一| 一本色道久久综合亚洲91| 亚洲天堂成人在线观看| 欧美呦呦网站| 欧美福利一区| 亚洲二区在线视频| 欧美激情视频在线免费观看 欧美视频免费一 | 精品不卡一区二区三区| 亚洲福利一区| 欧美ed2k| 亚洲一区久久| 国产日韩欧美精品综合| 亚洲三级电影全部在线观看高清| 欧美成人免费全部观看天天性色| 老司机凹凸av亚洲导航| 亚洲成色999久久网站| 亚洲福利免费| 久久激情网站| 亚洲国产精品毛片| 日韩午夜av| 免费不卡在线观看| 一本色道久久精品| 美女国产一区| 亚洲视频在线观看网站| 国产精品影音先锋| 亚洲天堂网在线观看| 美女视频网站黄色亚洲| 免费亚洲电影在线观看| 亚洲视屏一区| 久久狠狠婷婷| 亚洲性色视频| 麻豆国产精品777777在线| 宅男在线国产精品| 亚洲人被黑人高潮完整版| 久久久久久综合网天天| 亚洲欧美日韩国产综合精品二区| 久久国产精品免费一区| 尤妮丝一区二区裸体视频| 久久综合影音| 久久精品视频免费| 亚洲国产专区| 欧美一区二区三区在| 亚洲欧美成人在线| 欧美日韩一区二区三区在线视频 | 亚洲在线观看视频| 亚洲激情不卡| 夜夜嗨av一区二区三区免费区| 欧美视频在线免费| 久久精品成人| 欧美色中文字幕| 午夜日韩在线| 亚洲丝袜av一区| 久久成人这里只有精品| 亚洲精品中文字幕有码专区| 亚洲视频综合| 亚洲国产精品va在线看黑人| 欧美大片免费看| 狠狠色丁香久久婷婷综合丁香| 欧美激情一区二区三区在线视频 | 欧美日韩综合一区| 久久久免费精品| 欧美日韩xxxxx| 国产欧美日韩精品专区| 亚洲乱亚洲高清| 亚洲免费影院| 亚洲精品国久久99热| 亚洲影院色无极综合| 亚洲区一区二区三区| 欧美一区二区三区另类| 在线亚洲电影| 久久网站热最新地址| 红杏aⅴ成人免费视频| 亚洲三级视频| 黄色工厂这里只有精品| 中文久久精品| 午夜精品在线看| 亚洲欧美成人精品| 亚洲欧洲日产国产网站| 久久av一区二区三区亚洲| 一本色道久久综合精品竹菊 | 久久午夜羞羞影院免费观看| 久久九九精品| 国产日韩精品一区| 亚洲一区二区在线| 亚洲国产日本| 欧美日韩色综合| 亚洲第一网站| 在线电影欧美日韩一区二区私密| 亚洲欧美视频| 亚洲女爱视频在线| 国产欧美日韩一区二区三区在线| 亚洲美女一区| 亚洲日本中文字幕| 免费成人av资源网| 欧美刺激午夜性久久久久久久| 亚洲精品国精品久久99热一| 久久这里有精品15一区二区三区 | 久久人人爽人人爽爽久久| 国产美女精品一区二区三区| 一本一道久久综合狠狠老精东影业 | 国产日韩综合| 先锋影音一区二区三区| 亚洲激情午夜| 国产亚洲综合精品| 欧美亚洲色图校园春色| 欧美巨乳在线观看| 亚洲全部视频| 亚洲一区久久| 永久久久久久| 欧美激情一区二区久久久| 亚洲日韩中文字幕在线播放| 一本久久综合亚洲鲁鲁五月天| 欧美香蕉大胸在线视频观看| 亚洲五月六月| 久久久精品网| 亚洲国产一成人久久精品| 久久成人精品| 亚洲另类自拍| 午夜精品视频一区| 国产一区二区三区高清播放| 久久高清国产| 亚洲高清视频一区二区| 一区二区三区日韩在线观看| 国产精品久久久久影院亚瑟| 亚洲欧美国产高清| 欧美成人国产va精品日本一级| 亚洲欧美激情视频| 黄色精品网站| 欧美三级视频在线播放| 欧美一级欧美一级在线播放| 亚洲国产激情| 欧美激情国产精品| 午夜精品国产精品大乳美女| 亚洲精品网址在线观看|