PHP如何實(shí)現(xiàn)守護(hù)進(jìn)程-創(chuàng)新互聯(lián)

PHP 如何實(shí)現(xiàn)守護(hù)進(jìn)程?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)公司長期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為湄潭企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站,湄潭網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

守護(hù)進(jìn)程

守護(hù)進(jìn)程作為一種常駐進(jìn)程服務(wù),很常見,例如 PHP-FPM, NGINX,REDIS,都需要一個父進(jìn)程來支持整個服務(wù)。但是用 PHP 編寫守護(hù)進(jìn)程不多見,今天就來用 PHP 來實(shí)現(xiàn)一下。

步驟

● fork 子進(jìn)程

● 父進(jìn)程退出

● 設(shè)置新的會話

● 重置文件掩碼

● 關(guān)閉標(biāo)準(zhǔn)輸入輸出

實(shí)現(xiàn)

我們對著以上的步驟來實(shí)現(xiàn),在這之前需要 pcntl 和 posix 擴(kuò)展,請確保安裝了。

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

細(xì)節(jié)

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

三者結(jié)果相同,說明了該進(jìn)程即使進(jìn)程組的組長,也是會話首領(lǐng)。

為什么需要 umask (0)

當(dāng)你在 linux 調(diào)用 umask 的時候你會看到一個掩碼值,這個掩碼決定了你創(chuàng)建文件權(quán)限范圍,例如本人當(dāng)前機(jī)器的 umask 為

0022

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

注意

如果你在進(jìn)程使用了 echo var_dump 等函數(shù),一定要把標(biāo)準(zhǔn)輸出等重定向到其他文件流中。新增加下面代碼就可以了。

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

因?yàn)樵谏厦嬉呀?jīng)關(guān)閉了標(biāo)準(zhǔn)輸入輸出,此時文件描述符 fd 已經(jīng)沒有,所有重新打開之后 fd 從非負(fù)開始依次是 0,1,2。正好作為標(biāo)準(zhǔn)輸入輸出的文件。當(dāng)然重定向到那里需要你自己設(shè)置。

最后的二次 fork

這個問題需要好好斟酌,因?yàn)槭欠潜仨毜?。目前想不到有什么場景下必須兩?Fork。

關(guān)于PHP 如何實(shí)現(xiàn)守護(hù)進(jìn)程問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)站欄目:PHP如何實(shí)現(xiàn)守護(hù)進(jìn)程-創(chuàng)新互聯(lián)
文章出自:http://muchs.cn/article48/dcoshp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航、網(wǎng)站策劃、搜索引擎優(yōu)化面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)