4

関数を定期的に実行する方法はありますか?

データベース テーブルがあり、エントリがいつ追加または削除されたかを知る必要があります。使用しようとしているロジックは、Ajax がサーバーに呼び出しを行いますが、すぐに応答するのではなく、サーバーはデータベースが更新されているかどうかを 30 秒間継続的にチェックし、更新されている場合はそれから応答し、それ以外の場合は 30 秒後に応答します。このようにして、毎秒 Ajax リクエストを呼び出すことで、サーバーの負荷を最小限に抑えようとしています。

どうすればいいですか?whileループの使用は理にかなっていますか? このようなものかもしれません-

while (SomeCondition)
{
   if (CheckIfDatabaseChanged())
   {
      echo "System Updated";
      break;
   }
}

これが無意味な解決策である場合、ループが 30 秒間だけ実行されて中断されるようにするにはどうすればよいでしょうか。または、より良い解決策はありますか?

4

2 に答える 2

7

あなたが考えているのは、ロングポーリングと呼ばれるものであり、特にブロッキング IO を使用する場合、PHP では適切にスケーリングされません。

詳細については、 https://stackoverflow.com/a/6488569/11926を参照してください。

しかし、あなたのコードは次のようになります

set_timeout_limit(31);
$i=0;
while ($i<30) {
    // poll database for changes which is a bad idea.
    i = i + 1;
    sleep(1); // sleep 1 second
}

これらの多くを同時に実行することはできないでしょう。私のアドバイスは、redis pubsub ようなものを使用してデータベースの変更を通知し、代わりにある種のロングポーリング/Websocket ソリューションを使用することです。

可能であれば、バックグラウンド プロセスをsubscribeデータベースの変更に生成してから、変更を公開する必要がありますpusher。これは、複数の実行時間の長いプロセスがあるとパフォーマンスが非常に悪いためです。

両方を自分でホストするか、次のようなホストされたサービスを使用できます。

レディス:

ロングポーリング / Websocket:

どちらにも小さな無料プランがあり、すぐに始められます。これらのプランが大きくなりすぎた場合は、これらのソリューションを自分でホストすることを考えることができます.


PS : PHP でReactと呼ばれるノンブロッキング ソリューションも見つけました。このソリューションは、PHP でスケーリングする (より良い) 可能性があります。

于 2012-06-22T10:03:14.347 に答える
0

これを使って:

set_timeout_limit(0)

http://se.php.net/manual/ru/function.set-time-limit.php

于 2012-06-22T09:42:50.877 に答える