10

私は、非常に重い PHP タスクを 1 日に何千回も実行するための最も効率的な方法を見つけようとしています。Gmail への IMAP 接続を作成し、電子メールをループして、この情報をデータベースに保存し、画像をローカルに保存する必要があります。

cron を使用してこのタスクを頻繁に実行することはそれほど大したことではありませんが、毎分実行する必要があり、最終的には cron が相互に重なって実行を開始し、メモリの問題が発生することがわかっています。

タスクを 1 分間に複数回効率的に実行する必要がある場合、次のステップは何ですか? 私はbeanstalkとpheanstalkについて読んできましたが、それが私が必要とすることをするかどうかは完全にはわかりません. 感想???

4

4 に答える 4

10

私は PHP の専門家ではありませんが、スクリプトをデーモンとして実行できない理由は何ですか? 私はまさにそれを行う多くの perl スクリプトを書いてきました。

于 2010-04-21T06:15:26.853 に答える
7

スクリプトが重複しないように、ロック メカニズムを作成します。スクリプトは毎分しか実行されないため、これは非常に単純です。単純な .lock ファイルで十分です。

<?php
  if (file_exists("foo.lock")) exit(0);
  file_put_contents("foo.lock", getmypid());

  do_stuff_here();

  unlink("foo.lock");
?>

これにより、スクリプトが並行して実行されないようになります。プログラムの終了時に .lock ファイルが削除されていることを確認するだけでよいため、単一の終了ポイントが必要です (最初の終了を除く)。

Brian Roach が提案したように、適切な代替手段は、常に実行され、IMAP サーバーへの接続を維持する専用サーバー プロセスです。これにより、オーバーヘッドが大幅に削減され、通常の php スクリプトを作成するよりもそれほど難しくありません。

<?php
  connect();
  while (is_world_not_invaded_by_aliens())
  {
    get_mails();
    get_images();
    sleep(time_to_next_check());
  }
  disconnect();
?>
于 2010-04-21T06:28:23.777 に答える
3

私はこれらのようなスクリプトをいくつか持っていますが、スタックアップした場合に備えて cron から実行したくありません。

#!/bin/sh
php -f fetchFromImap.php
sleep 60
exec $0

パーツはスクリプトのexec $0実行を再開し、メモリ内でそれ自体を置き換えるため、問題なく永久に実行されます。PHP スクリプトが使用するメモリは、終了するたびにクリーンアップされるため、これも問題ではありません。

簡単な行で開始し、バックグラウンドに入れます:

cd /x/y/z ; nohup ./loopToFetchMail.sh &

または、マシンがさまざまな手段 (Cron の '@reboot ....' など) で起動したときに、同様に起動することもできます。

于 2010-04-21T19:50:03.500 に答える
0

fcron http://fcron.free.fr/は、古いジョブがまだ実行されている場合、新しいジョブを開始@ 1 commandしません。競合状態を気にせずに使用できます。

于 2010-06-16T10:36:12.703 に答える