1

サイトの読み込みをブロックせずに、継続的に実行したいコードがあります。データベース内のレコードを毎秒程度更新する必要があります。誰でもこれを行う方法を手伝ってもらえますか?

コードは次のとおりです。

while(true){
    $hits++;
    $db =& JFactory::getDBO();
    $query = "UPDATE u32lb_mt_links SET link_hits='".$hits."' WHERE link_id='".$firma_id."'";
    $db->setQuery( $query );
    $db->query();
    sleep(1);
}
4

4 に答える 4

4

PHP はマルチスレッドをサポートしていません。

pcntl_forkリクエストが入ったときにバックグラウンドプロセスを生成する必要がある場合は、次のようなものを調べるのが最善の策です.

それ以外の場合は、cronjob を使用するか、phpコマンドライン インタープリターを使用してスクリプトを手動で実行します。


そうは言っても、あなたのスクリプトが何をしているのかわかりません。リクエストごとではなく、毎秒値を 1 ずつインクリメントするだけの意図ですか?

使用するのに最適な方法は (アイデアがクレイジーではないと仮定して)、毎分実行される cronjob でありwhile(true)、代わりにタスクを 60 回実行するだけです。または、1 分ごとに cron を実行して、ヒット数を 60 増やします。

もう 1 つの方法は、無限にループするバッチ スクリプトを作成することです (PHP ではなく、簡単にバッチ ファイルを強制終了できます)。完了するまで PHP コマンドライン インタープリターを実行します。しかし、私はまだ要点がわかりません。

于 2013-03-10T14:07:16.003 に答える
1

まあ、CRON JOBが最善の方法です。ただし、何らかの理由でホスティングが cron ジョブの追加をサポートしておらず、pcntl_forkを使用したくない場合は、Rudi Visserがもう 1 つのオプションがあると述べています (実際にはロジックのようなものです)。

代替オプション;

レコードを更新する (または必要なことを行う) ページを作成します。このページは、次のような URL からアクセスできる必要があります。http://yourwebsite.com/update_records.php

URLを渡すことができるcURL関数を作成し、代わりにタイムアウトパラメータも作成します。タイムアウト パラメータは非常に短くする必要があります。

ここでのロジックは、スクリプトを実行するだけで、返された結果を待たないことです。実行して続行するだけです。このようにして、ページをすばやく開くことができ、記録を更新することもできます.

これが役立つことを願っています。

PS didiercと考えを共有した後、考えられるセキュリティの提案にも注意する必要があることに気付きました。

  • 誰がページにアクセスできるかを決定するための .htaccess ルールを追加できます。
  • キーを生成してデータベースに追加し、クエリ文字列を介してこのキーを投稿することができます。クエリ文字列から値を保護していることを確認してください。また、レコードの更新に進む前に、キー (または必要に応じてトークンと呼ぶ) を確認して確認する必要があります。
  • 訪問者がページにアクセスするたびに実行されたくない場合は、最後に実行されたときを (少なくとも) 記録することをお勧めします。このようにして、実行する必要があるかどうかを確認できます。

レコードの機密性と所有しているコードの種類によっては、追加のセキュリティ対策を講じる場合があります。

于 2013-03-10T14:21:22.303 に答える
0

やりたいことを何でも含むphpスクリプトファイルを作成し、同じものにCRON JOBを設定します。

CRON JOB を設定するには、http: //www.thegeekstuff.com/2009/06/15-practical-crontab-examples/を参照してください。

これが役立つことを願っています。

于 2013-03-10T14:09:55.763 に答える