如何防止 PHP 脚本多次运行?

2024-04-13php开发问题
3

本文介绍了如何防止 PHP 脚本多次运行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

目前,我试图阻止 onlytask.php 脚本多次运行:

Currently, I tried to prevent an onlytask.php script from running more than once:

$fp = fopen("/tmp/"."onlyme.lock", "a+");
if (flock($fp, LOCK_EX | LOCK_NB)) {
  echo "task started
";
  //
    while (true) {
      // do something lengthy
      sleep(10);
    }
  //
  flock($fp, LOCK_UN);
} else {
  echo "task already running
";
}
fclose($fp);

并且有一个cron作业每分钟执行一次上述脚本:

and there is a cron job to execute the above script every minute:

* * * * * php /usr/local/src/onlytask.php

它工作了一段时间.几天后,当我这样做时:

It works for a while. After a few day, when I do:

ps auxwww | grep onlytask

我发现有 两个 实例正在运行!不是三个或更多,不是一个.我杀死了其中一个个体.几天后,又有两个实例.

I found that there are two instances running! Not three or more, not one. I killed one of the instances. After a few days, there are two instances again.

代码有什么问题?是否有其他替代方法可以限制 onlytask.php 的一个实例正在运行?

What's wrong in the code? Are there other alternatives to limit only one instance of the onlytask.php is running?

附言我的 /tmp/ 文件夹未清理.ls -al/tmp/*.lock 显示锁定文件是在第一天创建的:

p.s. my /tmp/ folder is not cleaned up. ls -al /tmp/*.lock show the lock file was created in day one:

-rw-r--r--  1 root root    0 Dec  4 04:03 onlyme.lock

推荐答案

现在我通过 ps 检查进程是否正在运行,并通过 bash 脚本扭曲 php 脚本:

Now I check whether the process is running by ps and warp the php script by a bash script:

 #!/bin/bash

 PIDS=`ps aux | grep onlytask.php | grep -v grep`
 if [ -z "$PIDS" ]; then
     echo "Starting onlytask.php ..."
     php /usr/local/src/onlytask.php >> /var/log/onlytask.log &
 else
     echo "onlytask.php already running."
 fi

并通过 cron 每分钟运行一次 bash 脚本.

and run the bash script by cron every minute.

这篇关于如何防止 PHP 脚本多次运行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

PHP实现DeepL翻译API调用
DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以...
2025-08-20 php开发问题
168

PHP通过phpspreadsheet导入Excel日期数据处理方法
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的...
2024-10-23 php开发问题
287

mediatemple - 无法使用 codeigniter 发送电子邮件
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)...
2024-08-23 php开发问题
11

Laravel Gmail 配置错误
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)...
2024-08-23 php开发问题
16

将 PHPMailer 用于 SMTP 的问题
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)...
2024-08-23 php开发问题
4

关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)...
2024-08-23 php开发问题
17