摘要:本節主要講解常用函數和進程池的概念,也會涉及到守護進程的知識。所以任何時候,建議預先創建好進程,也就是使用進程池的方式實現。
本節主要講解Posix常用函數和進程池的概念,也會涉及到守護進程的知識。本節難度較低。
Posix常用函數 posix_kill向指定pid進程發送信號。成功時返回 TRUE , 或者在失敗時返回 FALSE 。
bool posix_kill ( int $pid , int $sig )
$sig=0,可以檢測進程是否存在,不會發送信號。
示例:
//向當前進程發送SIGUSR1信號 posix_kill ( posix_getpid (), SIGUSR1 );
注:通過 kill -l 可以看到Linux下所有的信號常量。posix_getpid
返回當前進程id。
posix_getppid返回父進程id。
posix_setsid設置新會話組長,脫離終端。成功時返回session id,失敗返回 -1。寫守護進程(Daemon) 用到該函數。下面引用Workerman源代碼里的一段示例:
function daemonize(){ umask(0); $pid = pcntl_fork(); if (-1 === $pid) { die("fork fail"); } elseif ($pid > 0) { exit(0); } if (-1 === posix_setsid()) { die("setsid fail"); } // Fork again avoid SVR4 system regain the control of terminal. $pid = pcntl_fork(); if (-1 === $pid) { die("fork fail"); } elseif (0 !== $pid) { exit(0); } }
如果程序需要以守護進程的方式執行,在業務代碼之前調用該函數即可。
防盜版聲明:本文系原創文章,發布于公眾號飛鴻影的博客(fhyblog)及博客園,轉載需作者同意。
什么是進程池? 其實是很簡單的概念,就是預先創建一組子進程,當有新任務來時,系統通過調配該組進程中的某個子進程完成此任務。
前面幾節的示例里我們都是使用這種方式,預先創建好進程,而不是動態創建。
引入《Linux高性能服務器編程》的一段話,描述動態創建進程的缺點:
動態創建進程(或線程)比較耗費時間,這將導致較慢的客戶響應。
動態創建的子進程通常只用來為一個客戶服務,這樣導致了系統上產生大量的細微進程(或線程)。進程和線程間的切換將消耗大量CPU時間。
動態創建的子進程是當前進程的完整映像,當前進程必須謹慎的管理其分配的文件描述符和堆內存等系統資源,否則子進程可能復制這些資源,從而使系統的可用資源急劇下降,進而影響服務器的性能。
所以任何時候,建議預先創建好進程,也就是使用進程池的方式實現。
像我們熟知的php-fpm還支持最大創建多少個進程、初始創建多少個進程這種方式,大家感興趣可以研究研究。
(未完待續)
歡迎關注公眾號及時獲取最新文章推送!
推薦!每月僅需$2.5,即可擁有配置SSD的VPS!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28924.html
摘要:消息隊列更常見的用途是主進程分配任務,子進程消費執行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內容直接退出。 前面幾節都是講解pcntl擴展實現的多進程程序。本節給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...
摘要:用于創建子進程。該函數阻塞當前進程,只到當前進程的一個子進程退出或者收到一個結束當前進程的信號。注意處需要注意子進程需要防止子進程也進入循環。如果沒有,最終創建的子進程不只個。 本系列文章將向大家講解pcntl_*系列函數,從而更深入的理解進程相關知識。 PCNTL在PHP中進程控制支持默認是關閉的。您需要使用 --enable-pcntl 配置選項重新編譯PHP的 CGI或CLI版本...
摘要:任何進程在退出前使用退出都會變成僵尸進程用于保存進程的狀態等信息,然后由進程接管。這時候就算手動結束腳本程序也無法關閉這個僵尸子進程了。那么子進程結束后,沒有回收,就產生僵尸進程了。本小節我們通過安裝信號處理函數來解決僵尸進程問題。 上一篇文章講解了pcntl_fork和pcntl_wait兩個函數的使用,本篇繼續講解PHP多進程相關新知識。 僵尸(zombie)進程 這里說下僵尸進程...
摘要:本節講解幾個多進程的實例。新開終端,我們使用命令查看進程可以看到個進程個主進程,個子進程。使用命令結束子進程,主進程會重新拉起一個新的子進程。 本節講解幾個多進程的實例。 多進程實例 Master-Worker結構 下面例子實現了簡單的多進程管理: 支持設置最大子進程數 Master-Worker結構:Worker掛掉,Master進程會重新創建一個
摘要:修復添加超過萬個以上定時器時發生崩潰的問題增加模塊,下高性能序列化庫修復監聽端口設置無效的問題等。線程來處理網絡事件輪詢,讀取數據。當的三次握手成功了以后,由這個線程將連接成功的消息告訴進程,再由進程轉交給進程。此時進程觸發事件。 本文示例代碼詳見:https://github.com/52fhy/swoo...。 簡介 Swoole是一個PHP擴展,提供了PHP語言的異步多線程服務器...
閱讀 3663·2021-11-24 09:38
閱讀 3150·2021-11-15 11:37
閱讀 788·2021-11-12 10:36
閱讀 3553·2021-10-21 09:38
閱讀 3223·2021-09-28 09:36
閱讀 2426·2021-09-22 16:01
閱讀 4999·2021-09-22 15:09
閱讀 1222·2019-08-30 15:55