首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

使用 PHP 守護另一個 PHP 進程的實作範例

     編輯:PHP 相關知識

使用 PHP 守護另一個 PHP 進程的實作範例

本文介紹如何使用 PHP 腳本監控並守護另一個獨立運行的 PHP CLI 進程(不適用於 Apache 模組或 Nginx + PHP-FPM 模式)。核心思路是讓被守護進程將自身 PID 寫入檔案,守護進程定期讀取 PID 檔案並透過系統指令檢查進程是否存活。

核心機制說明

被守護腳本 b.php 啟動時,呼叫 getmypid() 取得目前進程 ID,寫入 c.pid 檔案;正常結束時清空或刪除該檔案。守護腳本 a.php 讀取 PID 檔案,若存在且非空,則執行 ps -p <PID> | grep b.php 確認進程是否仍在運行。為何不直接用 ps aux | grep b.php?因為檔案名稱重複時會誤判,指定 PID 查詢更精準。

a.php 守護腳本實作

<?php
$id = intval($argv[1]);
$pidFile = 'pid' . $id . '.pid';

if (!file_exists($pidFile)) {
    echo "not run";
    exit;
}

$content = file_get_contents($pidFile);
if (empty($content)) {
    echo "not run";
    exit;
}

exec("ps p {$content} | grep b.php", $pids);
if (count($pids) > 0) {
    echo 'running';
} else {
    echo 'not run';
}
?>

b.php 被守護腳本實作

<?php
$id = intval($argv[1]);
if (empty($id)) exit;

$pidFile = 'pid' . $id . '.pid';
file_put_contents($pidFile, getmypid());

while (true) {
    // 定期更新 PID 檔案,防止被誤判為異常
    file_put_contents($pidFile, getmypid());
    sleep(100); // 模擬長時間運行任務
}
?>

部署建議

  • 使用 nohup php b.php 1 > /dev/null 2>&1 & 在背景啟動被守護進程
  • 透過 crontab 定時執行 php a.php 1 檢查狀態,若回傳 not run 則重啟
  • 生產環境建議加入日誌記錄與告警機制

此方案輕量、無外部依賴,適合中小型專案的進程自動化管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved