溫馨提示×

溫馨提示×

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

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

swoole常駐進(jìn)程的方法

發(fā)布時(shí)間:2020-12-19 11:26:26 來源:億速云 閱讀:159 作者:小新 欄目:編程語言

這篇文章主要介紹了swoole常駐進(jìn)程的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

后端經(jīng)常會有類似這樣的場景,某個(gè)腳本,需要不斷的重復(fù)運(yùn)行,這個(gè)時(shí)候,最好有一個(gè)守護(hù)程序,幫助我們不斷地自動(dòng)地拉起這些腳本進(jìn)程,讓它自動(dòng)地重復(fù)運(yùn)行。

swoole 的進(jìn)程管理模塊就提供了進(jìn)程間通信的功能,可以實(shí)現(xiàn)對子進(jìn)程的自動(dòng)重啟功能。在swoole中我們可以通過進(jìn)程守護(hù)實(shí)現(xiàn)常駐進(jìn)程。

要實(shí)現(xiàn)對子程序的守護(hù),需要做到兩點(diǎn):

1、程序需要監(jiān)聽到子進(jìn)程的結(jié)束信號,以便于重新拉起新的子進(jìn)程。

2、子進(jìn)程的運(yùn)行環(huán)境需要獨(dú)立于父進(jìn)程。

swoole 進(jìn)程管理模塊提供了一個(gè) bool Process->exec(string $execfile, array $args) 方法,讓子進(jìn)程蛻變成另一個(gè)系統(tǒng)調(diào)用程序,同時(shí)還能保證父進(jìn)程與當(dāng)前進(jìn)程仍然是父子進(jìn)程關(guān)系。

再通過 array Process::wait(bool $blocking = true) 方法,來等待子進(jìn)程的退出信號。

下面是使用 swoole 啟動(dòng)子進(jìn)程,并回收子進(jìn)程資源的示例代碼:

<?phpuse Swoole\Process;

$php = "/usr/bin/env php";
$script = dirname(__DIR__) . "/task.php";
$command = "{$php} {$script}";

$process = new Process(function (Process $worker) use ($command) {
    $worker->exec('/bin/sh', ['-c', $command]);
});
$pid = $process->start();

printf("啟動(dòng)子進(jìn)程 {$pid}\n");while ($ret = Process::wait()) {
    $pid = intval($ret["pid"] ?? 0);
    printf("子進(jìn)程 {$pid} 結(jié)束\n");
}

代碼解析:

$command 變量表示需要子進(jìn)程腳本,通過 exec() 方法來啟動(dòng)成一個(gè)子進(jìn)程的方式運(yùn)行,再通過 Process::wait() 訪求來等待 $command 這個(gè)子進(jìn)程腳本結(jié)束,并回收進(jìn)程資源。

那么,只要在收到子進(jìn)程的結(jié)束信號后,再起一個(gè)相同的子進(jìn)程腳本,即可實(shí)現(xiàn)對子進(jìn)程的守護(hù)了。于是,第一個(gè)守護(hù)子進(jìn)程的程序?qū)崿F(xiàn)代碼:

<?php
use Swoole\Process;

$php = "/usr/bin/env php";
$script = dirname(__DIR__) . "/task.php";
$command = "{$php} {$script}";

do {
    $process = new Process(function (Process $worker) use ($command) {
        $worker->exec('/bin/sh', ['-c', $command]);
    });
    $pid = $process->start();

    printf("啟動(dòng)子進(jìn)程 {$pid}\n");
} while (Process::wait());

代碼解析:

這段代碼只將啟動(dòng)子進(jìn)程的邏輯加到一個(gè)死循環(huán)中,好讓這個(gè)子進(jìn)程腳本能夠不斷的重啟。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享swoole常駐進(jìn)程的方法內(nèi)容對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI