中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP 如何實現守護進程

發布時間:2020-07-11 15:29:31 來源:億速云 閱讀:134 作者:Leah 欄目:編程語言

PHP 如何實現守護進程?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

守護進程

守護進程作為一種常駐進程服務,很常見,例如 PHP-FPM, NGINX,REDIS,都需要一個父進程來支持整個服務。但是用 PHP 編寫守護進程不多見,今天就來用 PHP 來實現一下。

步驟

● fork 子進程

● 父進程退出

● 設置新的會話

● 重置文件掩碼

● 關閉標準輸入輸出

實現

我們對著以上的步驟來實現,在這之前需要 pcntl 和 posix 擴展,請確保安裝了。

function daemon() {
    $pid = pcntl_fork();
    // fork 失敗
    if ($pid < 0) {
        exit('fork failed');
    } else if ($pid > 0) {
       // 退出父進程
        exit(0);
    }
    // 設置新的會員
    // setsid 有幾個注意點
    // 不能是進程組的組長調用
    // 對于進程組組員調用會產生新的會話和進程組,并成為該進程組的唯一成員,調用的進程將脫離終端
    if (posix_setsid() < 0) {
        exit('set sid failed');
    }
    // 重置文件掩碼
    umask(0);
    // 切換工作目錄
    chdir('/');
    // 關閉標準輸入輸出
    fclose(STDIN);
    fclose(STDOUT);
    fclose(STDERR);
}

細節

// 獲取進程ID
var_dump(posix_getpid());
// 獲取進程組ID
var_dump(posix_getpgid(posix_getpid()));
// 獲取進程會話ID    
var_dump(posix_getsid(posix_getpid()));

三者結果相同,說明了該進程即使進程組的組長,也是會話首領。

為什么需要 umask (0)

當你在 linux 調用 umask 的時候你會看到一個掩碼值,這個掩碼決定了你創建文件權限范圍,例如本人當前機器的 umask 為

0022

文件的最大權限是 0666,而目錄的最大權限是 0777, 那么當前用戶的創建的目錄權限就是 0755,對于當前用戶而言就是 rwx-rx-rx 權限。而文件則是 0644,對于當前用戶而言 rw-r-r 權限。所以如果沒有重置掩碼的話,那么對于目錄而言就是 0755,而文件則是 0644 了。

注意

如果你在進程使用了 echo var_dump 等函數,一定要把標準輸出等重定向到其他文件流中。新增加下面代碼就可以了。

global $stdin, $stdout, $stderr;
$stdin = fopen('/dev/null', 'r');
$stdout = fopen('/www/php/txt.txt','wb');
$stderr = fopen('/dev/null', 'wb');

因為在上面已經關閉了標準輸入輸出,此時文件描述符 fd 已經沒有,所有重新打開之后 fd 從非負開始依次是 0,1,2。正好作為標準輸入輸出的文件。當然重定向到那里需要你自己設置。

最后的二次 fork

這個問題需要好好斟酌,因為是非必須的。目前想不到有什么場景下必須兩次 Fork。

關于PHP 如何實現守護進程問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

溧阳市| 偏关县| 依安县| 夏津县| 浦北县| 丰顺县| 民县| 彭水| 新郑市| 耿马| 光泽县| 青河县| 嵊泗县| 高台县| 宝应县| 青神县| 黔西| 南汇区| 自贡市| 邯郸市| 安福县| 隆昌县| 金阳县| 祁连县| 禄劝| 金昌市| 呼玛县| 固安县| 尚义县| 清水河县| 五大连池市| 绥芬河市| 永吉县| 清徐县| 子洲县| 宜昌市| 张家港市| 淮南市| 泾源县| 襄樊市| 乌苏市|