PHP有關守護進程,以及流程控制和信號處理函數

 守護進程(Daemon)是運行在後臺的一種特殊進程。它獨立於控制終端而且週期性地執行某種任務或等待處理某些發生的事件。守護進程是一種頗有用的進程。PHP也能夠實現守護進程的功能。php

 

一、基本概念編程

    進程服務器

            每一個進程都有一個父進程,子進程退出,父進程能獲得子進程退出的狀態。併發

    進程組函數

            每一個進程都屬於一個進程組,每一個進程組都有一個進程組號,該號等於該進程組組長的PID性能

二、守護編程要點spa

    1. 在後臺運行。     
         爲避免掛起控制終端將Daemon放入後臺執行。方法是在進程中調用fork使父進程終止,讓Daemon在子進程中後臺執行。 if($pid=pcntl_fork()) exit(0);//是父進程,結束父進程,子進程繼續
    2. 脫離控制終端,登陸會話和進程組 
       有必要先介紹一下Linux中的進程與控制終端,登陸會話和進程組之間的關係:進程屬於一個進程組,進程組號(GID)就是進程組長的進程號(PID)。登陸會話能夠包含多個進程組。這些進程組共享一個控制終端。這個控制終端一般是建立進程的登陸終  端。 控制終端,登陸會話和進程組一般是從父進程繼承下來的。咱們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,調用setsid()使進程成爲會話組長: posix_setsid();
        說明:當進程是會話組長時setsid()調用失敗。但第一點已經保證進程不是會話組長。setsid()調用成功後,進程成爲新的會話組長和新的進程組長,並與原來的登陸會話和進程組脫離。因爲會話過程對控制終端的獨佔性,進程同時與控制終端脫離。
    3. 禁止進程從新打開控制終端
        如今,進程已經成爲無終端的會話組長。但它能夠從新申請打開一個控制終端。能夠經過使進程再也不成爲會話組長來禁止進程從新打開控制終端: if($pid=pcntl_fork()) exit(0);//結束第一子進程,第二子進程繼續(第二子進程再也不是會話組長)
    4. 關閉打開的文件描述符
        進程從建立它的父進程那裏繼承了打開的文件描述符。如不關閉,將會浪費系統資源,形成進程所在的文件系統沒法卸下以及引發沒法預料的錯誤。按以下方法關閉它們:
        fclose(STDIN),fclose(STDOUT),fclose(STDERR)關閉標準輸入輸出與錯誤顯示。
    5. 改變當前工做目錄
        進程活動時,其工做目錄所在的文件系統不能卸下。通常須要將工做目錄改變到根目錄。對於須要轉儲核心,寫運行日誌的進程將工做目錄改變到特定目錄如chdir("/")
    6. 重設文件建立掩模
        進程從建立它的父進程那裏繼承了文件建立掩模。它可能修改守護進程所建立的文件的存取位。爲防止這一點,將文件建立掩模清除:umask(0);
    7. 處理SIGCHLD信號
        處理SIGCHLD信號並非必須的。但對於某些進程,特別是服務器進程每每在請求到來時生成子進程處理請求。若是父進程不等待子進程結束,子進程將成爲殭屍進程(zombie)從而佔用系統資源。若是父進程等待子進程結束,將增長父進程的負擔,影  響服務器進程的併發性能。在Linux下能夠簡單地將SIGCHLD信號的操做設爲SIG_IGN。 signal(SIGCHLD,SIG_IGN);日誌

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------繼承

1、流程控制函數:
(1)declare(ticks = 1);
  通常用法是 declare(ticks=N);
  declare(ticks=1)來講,這句主要做用有兩種:
  一、Zend引擎每執行1條低級語句就去執行一次 register_tick_function() 註冊的函數。
      能夠粗略的理解爲每執行一句php代碼(例如:$num=1;)就去執行下已經註冊的tick函數。
      一個用途就是控制某段代碼執行時間,例以下面的代碼雖然最後有個死循環,可是執行時間不會超過5秒。
  二、declare(ticks=1);每執行一次低級語句會檢查一次該進程是否有未處理過的信號
(2)register_tick_function()
  在每一個 tick 中出現的事件是由 register_tick_function() 來指定的
(3)register_shutdown_function
  也就是說當咱們的腳本執行完成或意外死掉致使PHP執行即將關閉時,咱們的這個函數將會 被調用
(4)umask函數改變文件的文件權限。
2、進程處理函數:
(1)pcntl_signal - 安裝一個信號處理器
(3)pcntl_fork - 在當前進程當前位置產生分支(子進程)。譯註:fork是建立了一個子進程,父進程和子進程 都從fork的位置開始向下繼續執行,不一樣的是父進程執行過程當中,獲得的fork返回值爲子進程 號,而子進程獲得的是0。
(4)posix_setsid - 一個進程組之間(父進程和子進程)調用這個函數的進程會被選舉爲進程組的leader 【1 fork出一個子進程;2 在子進程posix_setsid();3 退出父進程】
(5)posix_getpid - 返回當前進程的標識
(6)posix_kill -  向進程發送信號
  

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------進程

相關文章
相關標籤/搜索