0

一意のコードを作成してテキストファイルに書き込むスクリプトを作成しようとしています。私はなんとかコードを生成し、それらをファイルに書き込むことができました。

私の問題は、ループが実行され続け、サーバーがタイムアウトする前に92,000を超えるコードがファイルに書き込まれるという事実です。

いくつかのロギングを実行しましたが、すべてが正常に機能しているようです。一定の秒数が経過すると、すべての変数がリセットされ、すべてが最初から開始されます。これが発生するまでの時間間隔は、時々異なります。

ini_set('memory_limit', '200M'); ini_set('max_execution_time',0);スクリプトの先頭に設定しました。たぶん、私が見逃しているphpタイムアウト設定がありますか?

スクリプトはコントローラーの関数です。この関数の最初にini_setを設定しました。これは私が経験しているループです:

public function generateAction() { 
    ini_set('memory_limit', '200M');
    ini_set('max_execution_time',0);

    $codeArray = array();
    $numberOfCodes = 78000;
    $codeLength = 8;

    $totaalAantal = 0;

    $file = fopen("codes.txt","a+");

    while(count($codeArray)<$numberOfCodes){
        $code = self::newCode($codeLength);
        if(!in_array($code,$codeArray))
        {
            $totaalAantal++;
            $codeArray[] = $code;
            fwrite($file,'total: '.$totaalAantal."\r\n");
        }
    }
    fclose($file);
}

ファイルでは、これは次のようなものになります。

total: 1
total: 2
total: ...
total: 41999
total: 42000
total: 1
total: 2
total: ...
total: 41999
total: 42000

ありがとう。

編集:これまでのところ、generateAction()は、スクリプトが終了する前に2〜3回呼び出されますが、1回だけ呼び出す必要があります。

4

2 に答える 2

1

私はすでにこの問題の解決策を見つけました。ホストのスクリプト制限は90秒に設定されていましたが、このスクリプトは長時間実行する必要があったため、コマンドラインから実行する必要がありました。

于 2012-04-30T09:54:59.087 に答える
0

uniqid()を使用したテストを考慮すると、変数はリセットされていないと言えますが、メソッドgenerateAction()が数回呼び出されます。

コードはおそらく同期しているので、メインスクリプトが数回呼び出されるため、generateAction()が数回呼び出されると言えます。

詳細はどうなりますか?

アルゴリズムの性質上、ループ内の各パスは前のパスよりも遅くなります。したがって、generateAction()の実行時間は非常に長くなる可能性があります。

おそらく終了を待たずに、プロセスを停止したり、新しいページからプロセスを開始したりすることもできます。それでも、プロセスはそれほどすぐには停止せず、バックエンドで実行され続けます。ローカルのWAMP/LAMPインストールでこのような動作を確認しました。ページを停止したり、ページを閉じたり、ナビゲーターを閉じたり、Apacheを再起動したりしても、スクリプトは実際には停止しません。

そのため、複数のスクリプトプロセスがファイルに同時に書き込んでいることがありcodes.txtます。

これを回避するために、たとえば、関数flock()を使用してループ中にファイルをロックすることができます。

于 2012-04-27T14:39:11.000 に答える