在 PHP 中,实现单线程任务执行的监控有以下几种方法:
在任务执行的每个阶段,将关键信息记录到日志文件中。例如,记录开始时间、结束时间、执行结果等。这样,你可以通过查看日志文件来了解任务的执行情况。
// 示例日志记录函数
function log_message($message) {
$timestamp = date('Y-m-d H:i:s');
file_put_contents('task_log.txt', "[$timestamp] $message\n", FILE_APPEND);
}
// 任务开始执行
log_message("Task started.");
// 执行任务逻辑...
// 任务执行完毕
log_message("Task completed.");
将任务的执行情况存储在数据库中,可以更方便地查询和分析任务进度。例如,创建一个名为 task_execution
的表,用于存储任务的开始时间、结束时间、执行结果等信息。
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
);
在任务执行过程中,将相关信息插入到 task_execution
表中。
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
// 任务开始执行
$stmt = $db->prepare("INSERT INTO task_execution (task_name, start_time, status) VALUES (?, NOW(), 'running')");
$stmt->execute(['MyTask']);
// 执行任务逻辑...
// 任务执行完毕
$stmt = $db->prepare("UPDATE task_execution SET end_time = NOW(), result = ?, status = 'completed' WHERE id = ?");
$stmt->execute(['Task result', $taskId]);
如果你的任务需要与其他任务并发执行,可以使用信号量或互斥锁来确保同一时间只有一个任务在执行。这可以通过 PHP 的 sem_acquire()
和 sem_release()
函数(使用信号量)或 mutex_lock()
和 mutex_unlock()
函数(使用 POSIX 互斥锁)来实现。
// 使用信号量实现互斥锁
$semaphore_id = ftok(__FILE__, 't');
$semaphore = sem_get($semaphore_id, 1, 0666, 1);
if (sem_acquire($semaphore)) {
// 获取锁,执行任务
// ...
// 释放锁
sem_release($semaphore);
} else {
// 无法获取锁,跳过执行任务
}
你还可以使用进程监控工具(如 Supervisor)来监控 PHP 脚本的任务执行情况。这些工具可以帮助你确保脚本始终在运行,并在发生故障时自动重启。要使用 Supervisor,首先安装并配置 Supervisor,然后创建一个 Supervisor 配置文件(如 /etc/supervisor/conf.d/my_php_task.conf
),指定 PHP 脚本的路径和参数。
[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
命令启动并监控你的 PHP 任务。
通过以上方法,你可以有效地监控 PHP 单线程任务的执行情况。