在 PHP 中,實(shí)現(xiàn)單線程任務(wù)執(zhí)行的監(jiān)控有以下幾種方法:
在任務(wù)執(zhí)行的每個(gè)階段,將關(guān)鍵信息記錄到日志文件中。例如,記錄開始時(shí)間、結(jié)束時(shí)間、執(zhí)行結(jié)果等。這樣,你可以通過查看日志文件來了解任務(wù)的執(zhí)行情況。
// 示例日志記錄函數(shù)
function log_message($message) {
$timestamp = date('Y-m-d H:i:s');
file_put_contents('task_log.txt', "[$timestamp] $message\n", FILE_APPEND);
}
// 任務(wù)開始執(zhí)行
log_message("Task started.");
// 執(zhí)行任務(wù)邏輯...
// 任務(wù)執(zhí)行完畢
log_message("Task completed.");
將任務(wù)的執(zhí)行情況存儲(chǔ)在數(shù)據(jù)庫中,可以更方便地查詢和分析任務(wù)進(jìn)度。例如,創(chuàng)建一個(gè)名為 task_execution
的表,用于存儲(chǔ)任務(wù)的開始時(shí)間、結(jié)束時(shí)間、執(zhí)行結(jié)果等信息。
CREATE TABLE task_execution (
id INT AUTO_INCREMENT PRIMARY KEY,
task_name VARCHAR(255) NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
result TEXT,
status ENUM('pending', 'running', 'completed', 'failed') NOT NULL
);
在任務(wù)執(zhí)行過程中,將相關(guān)信息插入到 task_execution
表中。
// 連接數(shù)據(jù)庫
$db = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
// 任務(wù)開始執(zhí)行
$stmt = $db->prepare("INSERT INTO task_execution (task_name, start_time, status) VALUES (?, NOW(), 'running')");
$stmt->execute(['MyTask']);
// 執(zhí)行任務(wù)邏輯...
// 任務(wù)執(zhí)行完畢
$stmt = $db->prepare("UPDATE task_execution SET end_time = NOW(), result = ?, status = 'completed' WHERE id = ?");
$stmt->execute(['Task result', $taskId]);
如果你的任務(wù)需要與其他任務(wù)并發(fā)執(zhí)行,可以使用信號(hào)量或互斥鎖來確保同一時(shí)間只有一個(gè)任務(wù)在執(zhí)行。這可以通過 PHP 的 sem_acquire()
和 sem_release()
函數(shù)(使用信號(hào)量)或 mutex_lock()
和 mutex_unlock()
函數(shù)(使用 POSIX 互斥鎖)來實(shí)現(xiàn)。
// 使用信號(hào)量實(shí)現(xiàn)互斥鎖
$semaphore_id = ftok(__FILE__, 't');
$semaphore = sem_get($semaphore_id, 1, 0666, 1);
if (sem_acquire($semaphore)) {
// 獲取鎖,執(zhí)行任務(wù)
// ...
// 釋放鎖
sem_release($semaphore);
} else {
// 無法獲取鎖,跳過執(zhí)行任務(wù)
}
你還可以使用進(jìn)程監(jiān)控工具(如 Supervisor)來監(jiān)控 PHP 腳本的任務(wù)執(zhí)行情況。這些工具可以幫助你確保腳本始終在運(yùn)行,并在發(fā)生故障時(shí)自動(dòng)重啟。要使用 Supervisor,首先安裝并配置 Supervisor,然后創(chuàng)建一個(gè) Supervisor 配置文件(如 /etc/supervisor/conf.d/my_php_task.conf
),指定 PHP 腳本的路徑和參數(shù)。
[program:my_php_task]
command=/usr/bin/php /path/to/your/php/script.php
autostart=true
autorestart=true
stderr_logfile=/var/log/my_php_task_error.log
stdout_logfile=/var/log/my_php_task_output.log
保存配置文件后,使用 supervisord
命令啟動(dòng)并監(jiān)控你的 PHP 任務(wù)。
通過以上方法,你可以有效地監(jiān)控 PHP 單線程任務(wù)的執(zhí)行情況。