防止PHP脚本运行两次通常是为了避免重复执行任务,特别是在使用CronJob进行定时任务调度时。这可以通过多种方法实现,例如使用锁文件、数据库记录或分布式锁等。
适用于所有需要定时执行且不希望重复执行的任务,例如:
可能的原因包括:
<?php
$lockFile = '/tmp/my_script.lock';
if (file_exists($lockFile)) {
exit('Script is already running.');
}
file_put_contents($lockFile, time());
// 执行任务
sleep(10); // 模拟任务执行时间
unlink($lockFile);
?>
假设使用MySQL数据库:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
$lockQuery = "SELECT GET_LOCK('my_script_lock', 10)";
$unlockQuery = "SELECT RELEASE_LOCK('my_script_lock')";
if ($pdo->query($lockQuery)->fetchColumn() === 1) {
try {
// 执行任务
sleep(10); // 模拟任务执行时间
} finally {
$pdo->query($unlockQuery);
}
} else {
exit('Script is already running.');
}
?>
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'my_script_lock';
$lockTimeout = 10;
if ($redis->set($lockKey, time(), ['nx', 'ex' => $lockTimeout])) {
try {
// 执行任务
sleep(10); // 模拟任务执行时间
} finally {
if ($redis->get($lockKey) == time()) {
$redis->del($lockKey);
}
}
} else {
exit('Script is already running.');
}
?>
通过以上方法,可以有效防止PHP脚本在使用CronJob时运行两次。
领取专属 10元无门槛券
手把手带您无忧上云