2

私はデーモンをいじくり回しており、PHPを使用してこれを行うことがどれほど実現可能か(メモリとCPUの使用量、および信頼性の観点から)疑問に思いました:

<?php
// Ignore user aborts and allow the script
// to run forever
ignore_user_abort(true);
set_time_limit(0);

$fp = fopen('loop.log', 'w');
fwrite($fp, date('Y-m-d H:i:s') . ' Started' . PHP_EOL);
while(1) {
    fwrite($fp, date('Y-m-d H:i:s') . ' Looped' . PHP_EOL);
    if (file_exists('loop.stop')) {
        break;
    }
    // Sleep for 100 seconds
    sleep(100);
}
fwrite($fp, date('Y-m-d H:i:s') . ' Stopped' . PHP_EOL);
fclose($fp);

この単純な例 ( ignore_user_abortの PHP マニュアルから改作) は単なるコンテナー スクリプトです。実際の機能はwhileループ内に配置されます。

このスクリプトをラップトップで 7 時間実行しましたが、問題ないように見えますが、あまり効果がありません。他の誰かがこれを試しましたか?

4

3 に答える 3

3

PHP リソースが定期的にクリーンアップされるように、ループを BASH スクリプトに入れる傾向があります。

#!/bin/bash
clear
date

php -f doChecksAndAct.php
sleep 100
# rerun myself
exec $0

PHP スクリプトで特に負荷の高いセットアップ タスクを実行している場合は、そこに小さな (ish) ループを配置することもできます (たとえば、50 ~ 100 回の反復、それらの間に数秒の一時停止がない場合)。実行間のオーバーヘッド時間。

追加: Bash/PHP (または他の言語) のペアリングについてブログを書いたので、PHP スクリプトを非常に簡単にループし、終了してすぐに再起動するか、しばらく一時停止することができます。労働者

于 2009-06-17T18:20:00.423 に答える
1

私はそれに対してお勧めします。

4 年前に、オブジェクト メソッドで作成されたオブジェクトに割り当てられたメモリが解放されないというバグが公開されています。

開発者はこれを機能要求と見なしていますが、長時間実行されるプロセスを使用している場合、これを回避するのは非常に困難です。しようとしましたが、アプリケーションを廃止できたときは非常に安心しました。

于 2009-06-17T13:18:59.463 に答える
0

ソニックサーバーデーモンもチェックアウトする価値があるかもしれません

http://dev.pedemont.com/sonic

于 2010-02-23T21:40:05.927 に答える