搜尋
首頁後端開發php教程如何使用PHP中pcntl和libevent實現Timer功能

如何使用PHP中pcntl和libevent實現Timer功能

Jun 15, 2018 pm 03:28 PM
pcntlphp擴展

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&#39;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(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 鎖定) 那麼用來向呼叫者回傳等待得到的訊號的資訊, 此資訊包含以下內容:
1.       所有訊號所包含以下三個資訊:##a)        signo: 訊號編號
b)        signo: 訊號編號##b)        signo: 訊號編號# : ##c)         code: 訊號代碼
2.       SIGCHLD 訊號特有的資訊
a)        記憶  stime: 系統消耗時間
d)        pid: 發送進程id
e)        uid: 傳送程序的真實使用者id
3.       SIGILL #4.       SIGPOLL 獨特的資訊:
a)        band: band event, 意義未知
#b)        fd:2102_$D
b)        fd:2102_$poffffpfpffpfpfpfpfpfpfpfp

掛起當前程序直到一個子程序退出或直到一個信號要求終止當前進程或調用一個信號處理函數. 如果子進程在調用時已經退出( 俗稱成為了殭屍進程), 此函數會馬上回傳, 所有的系統資源都將被釋放.
$status 用來保存子進程的狀態資訊, 此狀態資訊由下列函數產生: pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntlms, pcntlms,p .
$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.##cxitoptions:ffpfpfid未來#ffpffp未來的意義> (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 時才有效.

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:


PHP取整函數之ceil,floor,round,intval的區別解析

如何使用PHP中curl模擬post上傳及接收檔案

#########################################

以上是如何使用PHP中pcntl和libevent實現Timer功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何在PHP中設置會話cookie參數?如何在PHP中設置會話cookie參數?Apr 22, 2025 pm 05:33 PM

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會議的主要目的是什麼?在PHP中使用會議的主要目的是什麼?Apr 22, 2025 pm 05:25 PM

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

您如何在子域中分享會議?您如何在子域中分享會議?Apr 22, 2025 pm 05:21 PM

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。

使用HTTP如何影響會話安全性?使用HTTP如何影響會話安全性?Apr 22, 2025 pm 05:13 PM

HTTPS通过加密数据传输、防止中间人攻击和提供身份验证,显著提升了会话的安全性。1)加密数据传输:HTTPS使用SSL/TLS协议加密数据,确保数据在传输过程中不被窃取或篡改。2)防止中间人攻击:通过SSL/TLS握手过程,客户端验证服务器证书,确保连接合法性。3)提供身份验证:HTTPS确保连接的是合法服务器,保护数据完整性和机密性。

繼續使用PHP:耐力的原因繼續使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python:探索他們的相似性和差異PHP和Python:探索他們的相似性和差異Apr 19, 2025 am 12:21 AM

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

PHP和Python:解釋了不同的範例PHP和Python:解釋了不同的範例Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python:深入了解他們的歷史PHP和Python:深入了解他們的歷史Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具