48

Webホテルに、スケジュールされたタスクを実行したいサイトがあります。これを達成するためにどのような方法をお勧めしますか?

これまで私が考えていたのは、すべてのページの上部にスクリプトを含めてから、このスクリプトにこのジョブを実行する時間かどうかをチェックさせることです。

これは私が考えていたことの簡単な例です。

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
   runTask();
   $timeToRunMaintainance = time() + $interval;
} 

他に考慮すべきことはありますか、それともこれよりも優れた方法はありますか?

4

13 に答える 13

35

それがcronjobの目的です。 man crontabLinuxサーバーを実行していると仮定します。シェルアクセスがない場合、またはcronjobを設定する方法がない場合は、外部サーバーでcronjobを設定し、URLの1つにpingを実行する無料のサービスがあります。

于 2008-09-23T10:28:34.357 に答える
18

誰もこの正確な解決策について言及していないように見えるので、私は今これに答えています。

私が現在取り組んでいるサイトでは、cPanel を使用して cron ジョブをセットアップしましたが、PHP インタープリターを直接実行する代わりに (CodeIgniter を使用しており、コードがコントローラー関数にマップされているため、おそらくそうではありません) t 素晴らしいアイデア) を使用していますwget

wget -q -O cron_job.log http://somehost/controller/method

-qwget が出力を生成しないようにするためです (そのため、電子メールを受信し続けることはありません)。-O cron_job.logコントローラーが生成する内容をログ ファイルに保存します (毎回上書きされるため、大きくなりません)。

これが「適切な」cronを機能させる最も簡単な方法であることがわかりました。

于 2008-12-16T14:32:57.867 に答える
15

cPanel ホストをお持ちの場合は、Web インターフェースから cron ジョブを追加できます。Advanced -> Cron Jobs に移動し、非高度なフォームを使用して cron 頻度を設定します。次のようなコマンドが必要です。

/usr/bin/php /path/to/your/php/script.php
于 2008-09-23T16:36:36.483 に答える
6

ATriggerを見たことがありますか?PHP ライブラリを使用して、オーバーヘッドなしでスケジュールされたタスクの作成を開始することもできます。

免責事項: 私は彼らのチームの一員です。

于 2013-08-26T11:28:52.413 に答える
5

cronからPHPスクリプトを実際に実行する方法がわからない場合は、2つのオプションがあります。PHPインタープリターを直接呼び出す(つまり、「php /foo/myscript.php」)か、lynx(lynx http:// mywebsite)を使用します。 com / myscript.php)。どちらを選択するかは、主にスクリプトで環境を構成する方法によって異なります。パスとファイルアクセス許可は、シェルまたはWebブラウザーのどちらから呼び出すかによって異なります。lynxの使用をお勧めします。

副作用の1つは、実行するたびに電子メールを受信することです。これを回避するために、cron PHPスクリプトが正常に完了した場合は何も出力せず(空白でさえも何も出力しないようにする必要があります)、失敗した場合はエラーメッセージを出力します。次に、cronの小さなPHPスクリプトを使用してそれらを呼び出します。このように、私はそれが失敗した場合にのみ電子メールを受け取ります。これは基本的にlynxメソッドと同じですが、シェルスクリプトがlynxではなくHTTPリクエストを作成する点が異なります。

このスクリプトを「docron」などと呼び(chmod + xを忘れないでください)、crontabでコマンド「docronhttp://mydomain.com/myscript.php」を使用します。ページが何かを返す場合は、ページの出力をHTML電子メールとして電子メールで送信します。

#!/usr/bin/php
<?php

$h = @file_get_contents($_SERVER['argv'][1]);

if ($h === false)
{
        $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1];
}

if ($h != '')
{
        @mail("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>
于 2008-09-23T10:36:57.147 に答える
4

Cronは、問題をスケジュールするための汎用ソリューションです。しかし、大きくなり、スケジュールの頻度が高くなると、信頼性/重複の問題が発生する可能性があります。このような問題が発生した場合は、監視やより洗練された監視などを検討してください

于 2010-06-23T02:28:26.637 に答える
4

cron ジョブなどの設定を避けたい場合 (より良い方法をお勧めしますが)、あなたが提供した解決策はかなり良いものです。多くのプロジェクトで、更新を実行する時期かどうかを確認するために、PHP スクリプト自体にチェックを行わせました。

マイナス面 (マイナス面の1つ) は、特定の期間中に誰もアプリを使用していない場合、スクリプトが実行されないことです。

利点は、特定の期間中に誰もアプリを使用していない場合、スクリプトが実行されないことです。私が設定したタスクは、「キャッシュファイルの更新」、「毎日のバックアップの実行」などです。誰かがアプリを使用していない場合、キャッシュ ファイルを更新する必要はなく、バックアップするデータベースの変更も必要ありません。

私が提案する方法への唯一の変更は、誰かが正常にログインしたときにのみこれらのチェックを実行することです。すべてのページの読み込みをチェックする必要はありません。

于 2008-10-11T13:48:12.353 に答える
1

cronjobs や外部のものを使用したくない場合は、使用している方法で問題ありませんが、これらはページが読み込まれるたびにチェックするのが面倒になる可能性があります。

最初は、おそらくいくつかの cronjobs を置き換えることができます。たとえば、Web サイトに登録したユーザー数のカウンターがある場合、ユーザーが登録したときにこの数を更新するだけでよいため、cronjob やスケジュールされたタスクを使用する必要はありません。

スケジュールされたタスクを使用する場合は、現在使用している方法を少し変更して使用することをお勧めします。サイトに 1 日に十分なヒットがある場合は、すべてのヒットではなく、ヒットの 1% または 0.01% に対してのみタスクを実行 (またはタスク チェック機能を実行) することができます。使用するパーセンテージは依存します。ページのヒット数と、タスクを実行する回数。したがって、ランダマイザーを追加するだけでこの機能を実現できます。

このような関数を簡単に使用できます。

if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent.
    // Run the tasks system
}
于 2013-03-01T12:05:42.937 に答える
0

コマンドライン PHP + cron は、私が行く方法です。シンプルで、法案に合うはずです。当然のことながら、通常は PHP とともにインストールされます。

于 2008-09-23T16:32:36.587 に答える
0

cronjob をセットアップするオプションがない場合は、cUrl を使用してスクリプトを呼び出すことができます (wget の代わりに - 同じ機能)。cUrl 関数を実行するローカル マシンでスケジュールされたタスクを実行するだけです。

于 2012-06-27T22:41:01.637 に答える