【问题标题】:How to check if php script is already running如何检查 php 脚本是否已经在运行
【发布时间】:2012-05-05 16:55:32
【问题描述】:

如何创建不可停止的while循环, 如果它已经在运行,请不要再次运行它,我假设如果脚本运行它将更新数据库中的最后一个 cron 时间,并且脚本将检查当前时间 - 40 秒是否小于最后一个 cron 时间。我所拥有的示例,但那是过度循环(一次又一次运行过程)谢谢!

<?php
ignore_user_abort(1); // run script in background 
set_time_limit(0);    // set limit to 0


function processing()
{
//some function here
setting::write('cron_last_time', $time); // write cron last time to database
}

$time = current_timestamp();  // current time
$time_before = $time - 20;   //

$settings = setting::read('module_cron_email'); // Get last cron time from database ( in array )
$time_last = $settings['setting_value'];     // Last cron time get value from array



if ($time_before < $time_last) // check if time before is less than last cron time
{ 
   do{
   processing(); //run our function
   sleep(7);    // pause for 7 seconds
   continue;   // continue
   }
   while(true); // loop
}else{

echo "already running";
die();
}
?> 

【问题讨论】:

    标签: php cron while-loop


    【解决方案1】:

    启动脚本时,检查锁定文件。如果确实存在,则退出或跳过循环。如果不存在,则创建文件并让它运行。

    【讨论】:

    • 一个“锁定文件”可以是任何旧文件,只有它的存在才能锁定另一个脚本的运行。当之前运行的脚本结束时,它会在清理过程中删除锁定文件。
    • 你是对的,但是如果进程终止了怎么办?它不会再次运行,所以这就是我尝试这样做的原因
    • 终止是什么意思?我忘了提到你必须在脚本完成后删除文件。
    • 标准技巧是将 pid 存储在锁定文件中,当存在时执行 kill -0 &lt;pid&gt; 并使用生成的错误代码。 (要么不存在,要么属于其他uid,要么为零)如果错误为零,则(以我们的uid和相同的进程号运行的另一个进程的进程)仍然存在。可以通过对 ps 的输出进行 grepping 来获得额外的信息。
    • 为什么没有一个只代表锁的文件。当循环开始时,您尝试为文件请求锁定。如果不可能,是否意味着另一个脚本正在运行该过程?
    【解决方案2】:

    PHP PCNTL 是你需要的!你可以用它 fork PHP 进程。

                     while(true) { // Infinite
    
                         $pid = pcntl_fork();
    
                            switch (pcntl_fork($pid)) {
    
                                    case -1:
    
                                            die('Fork failed');
    
                                            break;
    
                                    case 0: // Child
    
                                            processing();
    
                                            exit(0);
    
                                            break;
    
                                    default: // Parent
    
                                            pcntl_waitpid($pid, $status);
    
                                            break;
    
                            }
    
            }
    

    【讨论】:

    • 该功能已在我的主机上禁用
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2017-10-05
    • 2010-09-12
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多