16

ParallelPLESKパネルを備えたCentOSを実行している専用サーバーがあります。データベースを更新するには、毎秒PHPスクリプトを実行する必要があります。これらは時間的に代替の方法ではなく、毎秒更新する必要があります。

URLを使用してスクリプトを見つけることができますhttp://www.somesite.com/phpfile.php?key=123

ファイルは毎秒ローカルで実行できますか?のようにphpfile.php

アップデート:

この質問を追加してから数か月が経ちました。私は次のコードを使用することになりました:

#!/user/bin/php
<?php
$start = microtime(true);
set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
    doMyThings();
    time_sleep_until($start + $i + 1);
}
?>

私のcronジョブは毎分に設定されています。私はこれをしばらくの間テスト環境で実行してきましたが、うまく機能しました。非常に高速で、CPUやメモリの使用量の増加は見られません。

4

6 に答える 6

31

実際にはPHPでそれを行うことができます。59 秒間実行され、毎秒チェックを行ってから終了するプログラムを 1 つ作成します。これを、そのプロセスを毎分実行する cron ジョブと組み合わせてください。

1 つのアプローチは次のとおりです。

set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
    doMyThings();
    sleep(1);
}

おそらく注意しなければならない唯一のことは、doMyThings()関数の実行時間です。たとえそれがほんの一瞬であっても、60 回を超える反復では、いくつかの問題が発生する可能性があります。PHP >= 5.1 (または Windows では >= 5.3) を実行している場合は、次を使用できます。time_sleep_until()

$start = microtime(true);
set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
    doMyThings();
    time_sleep_until($start + $i + 1);
}
于 2009-11-12T23:27:27.417 に答える
24

「時計」の使い方を考えたことはありますか?

watch -n 1 /path/to/phpfile.php

一度始めるだけで、それは続きます。これにより、PHP のクラッシュの影響を受けなくなります (発生するわけではありませんが、わかりません)。この inittab を追加して、完全に防弾にすることもできます。

于 2012-01-13T08:38:14.663 に答える
3

これを行うためにcronを実行し、phpファイルループで60回実行して、短いスリープ状態にしてみませんか。これを克服して、1分間に5回phpスクリプトを実行する方法です。

スクリプトとして実行するようにファイルを設定するには、perlスクリプトなどの最初の行にPHPへのパスを追加します

#!/user/bin/php
<?php
    while($i < 60) {
      sleep(1);
      //do stuff
      $i++;
    }
?>
于 2009-11-12T23:26:13.737 に答える
2

nickfこれは、実行時間内の各実行間の目的の間隔を秒単位で指定できるようにする 2 番目のソリューション ウィッチの単純なアップグレード バージョンです。

$duration = 60; // Duration of the loop in seconds
$sleep = 5; // Sleep beetween each execution (with stuff execution)

for ($i = 0; $i < floor($duration / $sleep); ++$i) {
    $start = microtime(true);

    // Do you stuff here

    time_sleep_until($start + $sleep);
}
于 2014-10-29T15:57:22.507 に答える
1

OPが回答を編集して解決策を提供していることに気付きました。このソリューションは私のボックスでは機能しませんでした (PHP へのパスが正しくなく、PHP 構文が正しくありません)。

このバージョンは機能しました(実行できるようにwhatever.shおよびchmod +Xwhatever.shとして保存します)

#!/usr/bin/php
<?php
$start = microtime(true);
set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
    echo $i;
    time_sleep_until($start + $i + 1);
}
?>
于 2010-10-27T00:15:21.620 に答える