当前位置: 首页 > 面试题库 >

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

慕容宏毅
2023-03-14
问题内容

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

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

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

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

它可以工作一段时间。几天后,当我这样做时:

ps auxwww | grep onlytask

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

代码有什么问题?还有其他替代方法来限制onlytask.php的一个实例正在运行吗?

PS我的/tmp/文件夹没有清理。ls -al /tmp/*.lock显示锁定文件是在第一天创建的:

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

问题答案:

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

 #!/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

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



 类似资料:
  • 问题内容: 防止Linux程序/守护程序在给定时间多次执行的最佳方法是什么? 问题答案: 最常见的方法是创建PID文件:定义文件将要到达的位置(在/ var / run内部很常见)。成功启动后,您会将PID写入此文件。在决定是否启动时,请阅读文件并检查以确保所引用的进程不存在(或者如果存在,则它不是守护程序的实例:在Linux上,您可以查看)。关机时,您可以删除文件,但这不是绝对必要的。 有一些脚

  • 背景: 我有一个运行的python脚本。它包含许多在循环中调用。 如果我按ctrlC,它只是停止执行当前的并传递到下一个。 问题: 如何停止整个脚本的执行,而不仅仅是当前调用的可执行文件的执行? 请注意,我已经仔细阅读了这里的问题/答案,但是即使使用,我也可以杀死可执行文件,但不能杀死整个脚本(我无法使用找到)。 我必须停止脚本(不重新启动系统)的唯一方法是继续在循环中按ctrl C,直到所有测试

  • 问题内容: 我想防止在php应用程序中多次登录。 首先,我在用户表中创建登录状态(活动,非活动)。 当用户A登录时,用户状态将设置为“活动”,如果用户注销,则状态将设置为“非活动”。当另一个客户端尝试使用相同的用户帐户登录时,我检查用户表。如果用户仍处于活动状态,则将错误登录发送给用户。 发生问题,如果用户关闭浏览器,则可以更新用户表中的状态,因为用户没有单击注销。 您对此有什么建议吗? 问题答案

  • 本文向大家介绍在PHP中提交表单时如何防止多次插入?,包括了在PHP中提交表单时如何防止多次插入?的使用技巧和注意事项,需要的朋友参考一下 提交表单时,PHP会话可用于防止多次插入。PHP会话设置一个会话变量(例如$ _SESSION ['posttimer']),该变量设置POST上的当前时间戳。在PHP中处理表单之前,请检查$_SESSION ['posttimer']变量是否存在,并检查特定

  • 我写了一个程序在IDLE令牌化文本文件,它开始令牌349文本文件!我怎样才能阻止它?如何停止正在运行的Python程序?

  • 问题内容: 我用IDLE编写了一个程序来标记文本文件,然后开始标记349个文本文件!我该如何阻止它?如何停止正在运行的Python程序? 问题答案: 要停止程序,只需按 + 。