针对php脚本文件执行锁定的代码,避免脚本在同一时间重复运行

<?php
//针对php脚本文件执行锁定的代码,避免脚本在同一时间重复运行,http://ken.01h.net/
define('PHP_LOCK_FILE', dirname(__FILE__) . '/php.lock');
ini_set('display_errors', true);
ini_set('error_reporting', E_ALL);
 
global $php_lock_fp;
$php_lock_fp = @fopen(PHP_LOCK_FILE, "w+") or die("Couldn't open the lock file ! ");
 
if (flock($php_lock_fp, LOCK_EX + LOCK_NB)) {   //排它型锁定
 register_shutdown_function('php_release_lock');  //当脚本结束时执行该方法,用于解锁
 fwrite($php_lock_fp, getmypid());
} else {
 @fclose($php_lock_fp);
 exit("Couldn't lock the file ! ");
}
 
function php_release_lock()
{
 global $php_lock_fp;
 if(is_resource($php_lock_fp)){
  flock($php_lock_fp, LOCK_UN);  //释放锁定
  @fclose($php_lock_fp);
  printf("Release lock! ");
 }
 @unlink(PHP_LOCK_FILE);
 printf("php exit! ");
}
?>

将以上代码保存为phplock.php文件,在需要用到锁定功能的脚本代码中引入该文件即可,示例如下:

<?php

set_time_limit(0);
require(dirname(__FILE__) . '/phplock.php');  //引入脚本文件锁定代码
 
//test
for($i=0; $i<10; $i++){
 echo str_repeat(" ", 1024);  //照顾一下像Firefox这种有比较大的缓冲区的浏览器
 echo $i."<br> ";
 flush();
 sleep(5);
}
?> 

 需要注意的是,确保phplock.php文件所在目录具有写入权限!

原文地址:https://www.cnblogs.com/helloyb/p/3174035.html