2012-05-05 12 views
3

ループを止めないで作成する方法 既に実行している場合はもう一度実行しないでください。実行中のスクリプトがデータベースの最後のcron時間を更新し、時間 - 40秒は最後のcron時間よりも短くなります。私が何をしているかのサンプルですが、それはオーバールーピングです(何度も繰り返し実行しています)ありがとう!PHPスクリプトがすでに実行されているかどうかを確認する方法

<?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(); 
} 
?> 

答えて

5

スクリプトを開始するときは、ロックファイルを確認してください。存在する場合は、終了するか、ループをスキップします。存在しない場合は、ファイルを作成して実行します。

+1

「ロックファイル」には、別のスクリプトの実行をロックしているだけの古いファイルを使用できます。以前実行していたスクリプトが終了すると、クリーンアップ手順の一部としてロックファイルが削除されます。 – Lix

+0

あなたは正しいですが、プロセスが終了したらどうなりますか?それは再び実行されませんので、私はこのようにしようとしている理由です –

+0

終了によって何を意味するのですか?私はあなたのスクリプトが終了した後にファイルを削除する必要があることを言及することを忘れてしまった。 – Ahatius

-2

PHP PCNTLが必要です。あなたはそれを使って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; 

         } 

     } 
+0

私のホストでこの機能が無効になっています –

1

スクリプトの最初に次の行を追加してください。

<?php 
    // Ensures single instance of script run at a time. 
    $fileName = basename(__FILE__); 
    $output = shell_exec("ps -ef | grep -v grep | grep $fileName | wc -l"); 
    //echo $output; 
    if ($output > 2) 
    { 
     echo "Already running - $fileName\n"; 
     exit; 
    } 

    // Your php script code. 
?> 
関連する問題