1

オークションがさまざまな時間に終了するサイトがあります。オークション終了後、オークション終了と結果を知らせる自動メールを出品者と購入者に送信する必要があります。明らかに、誰かがページをロードしてスクリプトを実行するのを待つことはできません。現在の時間を確認し、それをオークション終了の時間と比較してそのスクリプトを実行することで、これを自動化する良い方法はありますか?

このサイトは UNIX サーバー上にあるため、cron ジョブはオプションですが、そのような cron ジョブを実行するとサーバーにかなりの負荷がかかることが懸念されます。

4

5 に答える 5

2

cron ジョブは、1 分間に最大 1 回実行されます。

サーバー上でどのような負荷が発生するかは、実行するスクリプトの種類によって異なります。ところで、私はあなたがcliスクリプトを実行するために使用していると仮定しています(curl http://mysite.com.

スクリプトに 1 分以上かかる場合 (これを監視する必要があります)、単純に次のいずれかを行います。

  • 実行間のインターバル時間を増やすか、
  • ロック ファイルを使用して、スクリプトの 2 つのインスタンスが同時に実行されないようにします。

    if (($fp = fopen('/tmp/mylockfile', "r+")) === false) {
        die("Could not open lock file");
    }
    if (!flock($fp, LOCK_EX | LOCK_NB)) {
        die("Could not obtain lock");
    }
    // run your code here
    
    // release the lock and close file
    fclose($fp);
    

OTOH スクリプトを 1 分間に複数回実行する必要がある場合は、まったく別のメカニズムが必要になります。

于 2013-02-28T01:53:20.903 に答える
1

クローンを使用します。毎分最大 1 回、任意のコマンドを実行できます: http://clickmojo.com/code/cron-tutorial.html

サーバーの負荷に関する限り、非常にローエンドのサーバーで非常に頻繁に大量のデータベース呼び出しを実行していない限り、通常は問題になりません。私は一般論で話しますが、その考えは健全です。

オークション タイマー メカニズムを実行するために何か他のもの (PHP 以外) を使用している場合は、そのタイマー メカニズムにコードを追加し、タイマーがゼロになったときにメール送信スクリプトを実行して勝者を決定することをお勧めします。

于 2013-02-28T01:53:31.793 に答える
1

Q: 特定の時間または間隔で PHP スクリプトを実行する最良の方法は何ですか?
A: cronを使用する

Q: cronjob はサーバーに大きな負荷をかけますか?
A: もちろんスクリプトによって異なります。しかし、オークションを終了する必要があるかどうかを確認し、終了して 2 つのメールを送信することは難しくありません。スクリプトが設定された間隔よりも長く実行された場合に、スクリプトが 2 回実行されないように、何らかのロックファイルを必ず作成してください。

Q: 1 分未満の間隔でスクリプトを実行する
A: これについてはお答えできません。ごめん :)

于 2013-02-28T02:02:53.487 に答える
0

PHPスクリプトをコマンドラインスクリプトとして実行します。これにより、Webサーバーに負荷がかかることはありません。サーバーに負荷がかかるだけで、CRONを介して簡単に実行できます。

スクリプトの先頭に追加#!/usr/bin/phpし、ファイルの実行ビットを変更するchmod +x scriptname.phpと、phpを経由せずにスクリプトを直接実行できます。

http://php.net/manual/en/features.commandline.php

于 2013-02-28T01:57:34.030 に答える
0

これを行うには、いくつかのことが必要です。

  1. この電子メールをまだ送信したかどうかを示す何かをオークション情報に保存します (ブール値または送信日で、null の可能性があります)。このメールを送る以外に何かする必要があると思いますが?オークションをクローズとしてマークして、それ以上の入札が行われないようにしますか?

  2. この電子メールの送信が必要なオークションを見つけるためのコード: たとえば、オークションは終了したが、まだ通知されていません。

  3. 2 のコードのビットを繰り返し実行するための何か。cron を使用できます。別の方法として、次のループで常に実行される UNIX 用の非常に単純なデーモンを作成することもできます (少なくとも数ミリ秒以上待機し、何かを実行します)。後者の方がはるかに手間がかかりますが、私の意見では、スケールははるかに優れています。このアプローチに興味がある場合は、http://pear.php.net/package/System_Daemonで便利なツールを参照してください。

考慮すべきことの 1 つは、この電子メールを誤って二重送信することにどの程度注意するかです。このコードを 1 つのスレッドでのみ実行する場合は非常に簡単ですが、これらの電子メールを作成して送信する複数の異なる分散マシンを構築する場合は、もう少し注意する必要があります。cron から実行している場合、別の実行が開始される前に 1 回の実行が常に終了することを保証できますか?

于 2013-02-28T02:06:11.583 に答える