繁体   English   中英

防止同时出现多个脚本实例

[英]prevent multiple instances of script in same time

PHP 默认没有为我们的应用程序提供多线程,但有可能 2 个或更多用户同时单击同一个链接,或者在我的情况下,同时发送多个 API 请求。

我有脚本,当第一个用户做某事时会创建相当大的文件。

这是我的代码中的内容:

if (!file_exists($tmp_file)){
   write_file();
}

但有时该脚本的多个实例会在 2 个单独的 Apache 线程中同时启动。 在这种情况下,它可能会发生,file_exists() 将返回 false,但 0.00001 秒后,当我尝试写入该文件时,它已经存在,因为它是通过同时运行的脚本创建的。

有没有办法检测这种情况并防止它?

我知道我可以捕捉到错误并且只是不向用户显示它,但我根本不想有任何错误。

您可以将 fopen 与模式 'x' 一起使用,如果文件存在,fopen 将返回 false 和警告。

$f = @fopen($tmp_file, 'x');
if($f !== false)
{
    fwrite($f, ....);
    fclose($f);
}

如果您甚至不喜欢警告,请使用 flock

$f = fopen($tmp_file, 'a');
if($f !== false && flock($f, LOCK_EX|LOCK_NB) && ftell($f) === 0)
{
   fwrite($f, ....);
   fflush($f);
   flock($f, LOCK_UN);
}
fclose($f);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM