PHP多進程系列筆記(四)

本節主要講解Posix經常使用函數和進程池的概念,也會涉及到守護進程的知識。本節難度較低。php

Posix經常使用函數

posix_kill

向指定pid進程發送信號。成功時返回 TRUE , 或者在失敗時返回 FALSE編程

bool posix_kill ( int $pid , int $sig )

$sig=0,能夠檢測進程是否存在,不會發送信號。服務器

示例:session

//向當前進程發送SIGUSR1信號
posix_kill ( posix_getpid (),  SIGUSR1 );
注:經過 kill -l 能夠看到Linux下全部的信號常量。

posix_getpid

返回當前進程id。函數

posix_getppid

返回父進程id。php-fpm

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);
    }
}

若是程序須要以守護進程的方式執行,在業務代碼以前調用該函數便可。spa


防盜版聲明:本文系原創文章,發佈於公衆號飛鴻影的博客(fhyblog)及博客園,轉載需做者贊成。線程


進程池

什麼是進程池? 實際上是很簡單的概念,就是預先建立一組子進程,當有新任務來時,系統經過調配該組進程中的某個子進程完成此任務。code

前面幾節的示例裏咱們都是使用這種方式,預先建立好進程,而不是動態建立。

引入《Linux高性能服務器編程》的一段話,描述動態建立進程的缺點:

  • 動態建立進程(或線程)比較耗費時間,這將致使較慢的客戶響應。
  • 動態建立的子進程一般只用來爲一個客戶服務,這樣致使了系統上產生大量的細微進程(或線程)。進程和線程間的切換將消耗大量CPU時間。
  • 動態建立的子進程是當前進程的完整映像,當前進程必須謹慎的管理其分配的文件描述符和堆內存等系統資源,不然子進程可能複製這些資源,從而使系統的可用資源急劇降低,進而影響服務器的性能。

因此任什麼時候候,建議預先建立好進程,也就是使用進程池的方式實現。

像咱們熟知的php-fpm還支持最大建立多少個進程、初始建立多少個進程這種方式,你們感興趣能夠研究研究。

(未完待續)


歡迎關注公衆號及時獲取最新文章推送!
clipboard.png


推薦!每個月僅需$2.5,便可擁有配置SSD的VPS

相關文章
相關標籤/搜索