• <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>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2016年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678


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

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 215702
            • 排名 - 118

            最新評論

            閱讀排行榜

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

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

            您可能感興趣的文章:

            posted on 2016-08-18 10:59 思月行云 閱讀(194) 評論(0)  編輯 收藏 引用 所屬分類: PHP
            国产精品一区二区久久国产| 中文字幕一区二区三区久久网站| 高清免费久久午夜精品| 亚洲婷婷国产精品电影人久久| 国产午夜精品久久久久九九| 国产精品久久久久影院色| 国产精品中文久久久久久久| 久久国产欧美日韩精品免费| 亚洲人成电影网站久久| 7777久久久国产精品消防器材| 91麻豆国产精品91久久久| 久久免费视频1| 久久久久久久97| 久久综合香蕉国产蜜臀AV| 狠狠色婷婷久久一区二区三区| 少妇精品久久久一区二区三区| 久久丫精品国产亚洲av| 久久精品成人国产午夜| 国产成人99久久亚洲综合精品| 久久国产香蕉视频| 亚洲欧美精品一区久久中文字幕| 午夜天堂av天堂久久久| 久久96国产精品久久久| 国产精品久久久久一区二区三区| 久久亚洲精品无码播放| 久久精品成人欧美大片| 四虎国产永久免费久久| 亚洲欧美成人久久综合中文网| 伊人久久大香线蕉亚洲五月天| 久久久精品午夜免费不卡| 久久久久九国产精品| 99久久精品免费看国产一区二区三区 | 亚洲午夜久久久精品影院| 很黄很污的网站久久mimi色| 久久亚洲精品无码VA大香大香| 精品精品国产自在久久高清 | 久久无码精品一区二区三区| 国产成人综合久久精品红| 国产一级做a爰片久久毛片| 午夜精品久久久内射近拍高清| 无码AV中文字幕久久专区|