2011-01-12 7 views
8

Email-Queueデータベーステーブルを作成しました。 PHPアプリケーションがこのテーブルに送信する必要があるすべての電子メールを挿入します。1分に1回以上クロンジョブを実行するには?

別のPHPスクリプトは、未送信のメールをすべて探して送信します。

私はこのスクリプトをcronjobsで実行します。残念ながら、cronジョブは1分に最大1回しか実行できません。 最悪の場合、ユーザーは電子メールが実際に送信されるまで1分待たなければなりません。

現時点での回避策として、addtional sleepパラメータを指定してスクリプトを呼び出し、cronジョブを複製する方法があります。

例:

* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=10 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=20 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=30 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=40 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=50 >/dev/null 2>&1 

上記の例では、スクリプトが10秒ごとに実行します。 emails.phpスクリプトの最初の行は、次のようになります。

+1

superuser.stackexchange.comに詳しい方がいるかもしれません。 – EboMike

+1

あなたはPHPデーモンが必要で、cronスクリプトは必要ありません。 –

答えて

9

まず、スクリプトを呼び出すためにcurlを使用するのではなく、コマンドラインバージョンのPHPを使用することをお勧めします。その後、指定された期間内に応答を出力する必要がなくなり、賢明な有効期間を持つPHPスクリプトを作成できます。

このように、cronを不必要に使用するのではなく、単にPHPスクリプト内で電子メール/送信/スリープなどをスリープ/チェックすることができます。

さらに、複数のPHPスクリプトがpidファイルまたはデータベース設定アプローチを使用して(同時に指定されたファイル/設定が存在する場合)データベーステーブル上で同時に動作しないように注意します設定を中断したり、処理を中断したりすること)、またはcronジョブを賢明にタイミングさせて、スクリプトの最大処理時間を制限して、サイクルの「Eメールの確認」部分を開始する前に実行していた時間を確認します。

8

これはスクリプトレベルで実行する必要があります。

// cron.php running every 10 seconds 
// you need to setup this cron run every minute using `crontab` of cPanel etc 
<?php 

$expireTime = time() + 60; 
while (time() < $expireTime) { 
    // my php logic here 

    sleep(10); 
    // sleep for 10 seconds 
    // you may change the sleep time to change frequency 
} 
1

これを10秒ごとに実行すると、cronはジョブの正しいツールではありません。あなたが必要とするのは、Ishのように継続的に実行されるスクリプトです。

スクリプトをサービスとして登録するには、start/stopスクリプトを/etc/init.dに入れて有効にします。

ユーザーアカウントしかない場合は、画面セッションで実行することができます。次に、エラー診断の出力を見ることもできます。

14

ここでは、私が書いた簡単なbashスクリプトを使って、crontabで1分以上実行することができます。

あなたは〜/ binに/ runEvery.sh として保存し、その後のcrontabに5秒ごとにotherScript.sh実行するには、このような何かを書くことができます:

*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh

これはスクリプトです:

#!/bin/bash 

inputPeriod=$1 
runCommand=$2 
RUN_TIME=60 
error="no" 

if [ 'x'"$runCommand" != 'x' ] 
then 
    if [ 'x'$inputPeriod != 'x' ] 
    then 
     loops=$(($RUN_TIME/$inputPeriod)) 
     if [ $loops -eq 0 ] 
     then 
      loops=1 
     fi 

     for i in $(eval echo {1..$loops}) 
     do 
      $runCommand 
      sleep $inputPeriod 
     done 

    else 
     error="yes" 
    fi 
else 
    error="yes" 
fi 

if [ $error = "yes" ] 
then 
    echo "runEvery - runs a command every X seconds for a minute" 
    echo "Usage: runEvery.sh <# in seconds < 60> <command to run>" 
fi 
関連する問題