• <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年8月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910


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

            常用鏈接

            留言簿(1)

            隨筆分類(lèi)

            隨筆檔案

            相冊(cè)

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216769
            • 排名 - 118

            最新評(píng)論

            閱讀排行榜

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

            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 指獲取用戶(hù)進(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) , 具體的行為依賴(lài)于 $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: 用戶(hù)消耗時(shí)間
            c)         stime: 系統(tǒng)消耗時(shí)間
            d)        pid: 發(fā)送進(jìn)程 id
            e)        uid: 發(fā)送進(jìn)程的真實(shí)用戶(hù) 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)退出 ( 俗稱(chē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 類(lèi)系統(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è)稱(chēng)作僵尸的數(shù)據(jù)結(jié)構(gòu) , 等待由父進(jìn)程發(fā)起 wait 的操作來(lái)為它收尸 , 在子進(jìn)程結(jié)束 ( 邏輯結(jié)束 ) 到父進(jìn)程收尸前這一段時(shí)間子進(jìn)程就被稱(chēng)為僵尸進(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í)才有效 .

            您可能感興趣的文章:

            posted on 2016-08-18 10:59 思月行云 閱讀(200) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): PHP
            日韩精品久久久肉伦网站| 久久精品人人槡人妻人人玩AV| 精品国产91久久久久久久a| 国产成人精品久久亚洲高清不卡 | 久久一本综合| 2021精品国产综合久久| 国内精品久久久久久久久电影网| 亚洲国产天堂久久久久久| 7777久久亚洲中文字幕| 久久人搡人人玩人妻精品首页| 欧美亚洲国产精品久久| 国产精品99久久精品爆乳| 精品多毛少妇人妻AV免费久久 | 国内精品欧美久久精品| 久久亚洲AV无码精品色午夜| 久久久久四虎国产精品| 亚洲AV无码久久| 中文精品99久久国产| 99久久精品免费看国产| 久久精品国产亚洲AV嫖农村妇女| 激情久久久久久久久久| 99久久无码一区人妻a黑| 久久伊人五月丁香狠狠色| 久久国产精品波多野结衣AV| 久久91精品久久91综合| 日韩久久久久久中文人妻| 久久午夜免费视频| 国产香蕉久久精品综合网| 日韩影院久久| 久久影视国产亚洲| 亚洲国产精品成人久久蜜臀| 久久国产乱子伦精品免费午夜| 久久婷婷综合中文字幕| 国产精品久久久久久一区二区三区| 无码人妻久久一区二区三区免费 | 国内精品久久久久久久coent| 国产精品久久久久久福利漫画 | 岛国搬运www久久| 久久天堂电影网| 久久99精品久久久久久水蜜桃| 国产精品va久久久久久久|