您好,登錄后才能下訂單哦!
這篇文章主要介紹了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í)!
免責(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)容。