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

PHP 守護進程實作:監控另一個 PHP 腳本運行狀態

     編輯:PHP 綜合知識

在 CLI 模式下,透過 PID 檔案與 ps 指令實現 PHP 守護另一個 PHP 進程的監控機制。適用於長期運行的背景任務、佇列消費者、WebSocket 服務等場景。

架構設計

  • 被監控腳本 (b.php):啟動時將 PID 寫入檔案,定期更新心跳
  • 監控腳本 (a.php):讀取 PID 檔案,透過 ps -p PID 驗證進程存活

被監控腳本 b.php

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

$pidFile = "pid{$id}.pid";

// 寫入當前 PID
file_put_contents($pidFile, getmypid());

// 模擬長期運行任務(實際替換為你的業務邏輯)
while (true) {
    // 更新心跳時間戳(可選)
    file_put_contents($pidFile, getmypid() . "\n" . time());
    
    // 你的業務邏輯:處理佇列、WebSocket 循環等
    sleep(100); // 示例:休眠 100 秒
}
?>

監控腳本 a.php

<?php
$id = intval($argv[1] ?? 0);
$pidFile = "pid{$id}.pid";

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

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

// 取得第一行 PID
$pid = trim(explode("\n", $content)[0]);

// 使用 ps 指令精確檢查進程(避免同名檔案誤判)
exec("ps p {$pid} | grep b.php", $output);

if (count($output) > 0) {
    echo "running\n";
} else {
    echo "not run\n";
    // 可選:自動重啟邏輯
    // exec("php b.php {$id} > /dev/null 2>&1 &");
}
?>

進階強化建議

  1. 心跳機制:b.php 定期更新時間戳,a.php 檢查心跳是否過期(如超過 5 分鐘)判定異常
  2. 訊號處理:在 b.php 註冊 pcntl_signal 優雅關閉,清理 PID 檔案
  3. 系統級守護:生產環境強烈建議使用 Systemd、Supervisor 或 PM2 管理進程,具備自動重啟、日誌輪轉、資源限制等企業級功能
  4. 多進程管理:使用 pcntl_fork 或 Symfony Process 元件管理子進程

Systemd 服務範例(推薦生產環境使用)

# /etc/systemd/system/php-worker@.service
[Unit]
Description=PHP Worker %i
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/app
ExecStart=/usr/bin/php b.php %i
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

啟用:systemctl enable --now php-worker@1

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