テーブル A からテーブル B にレコードを保存する Joomla 拡張機能を作成しました。テーブル A に含まれるデータが少ない場合、スクリプトは正常に動作します。テーブル A に大量のデータが含まれている場合。この巨大なデータの実行を挿入しているときに、「致命的なエラー: 行 382 の /mysite/libraries/joomla/database/database/mysqli.php で最大実行時間が 30 秒を超えました」というエラーが表示されます。この問題は、ini ファイルを変更することで解決できますが、その Joomla 拡張機能はサイトで使用されるため、ini ファイルを変更するように指示することはできません。
3 に答える
これを見てください
http://davidwalsh.name/increase-php-script-execution-time-limit-ini_set
ini_set('max_execution_time', 300);
このように使用するか、
set_time_limit(0);
技術的には、 を使用して最大実行時間を増やすことができますset_time_limit
。個人的には、他の人がサーバーに設定した制限を台無しにすることはありません.理由(パフォーマンス、セキュリティ-特に、Joomla! のようなソフトウェアがよく見られる共有ホスティングのコンテキストで)のために設定したと仮定します。また、set_time_limit
PHP がセーフ モードで実行されている場合は機能しません。
残っているのは、タスクを複数のステップに分割することです。たとえば、テーブルに 100000 レコードがあり、妥当な時間内に約 5000 レコードを処理できると測定した場合、20 の個別のステップで操作を実行します。
各ステップの実行時間は、平均的なシステムで 30 秒未満です。ステップ数は動的であることに注意してください。実行時のステップ数を取得するには、プログラムでレコード数を定数で割ります (テスト中に有用な値を見つけます)。
スクリプトを 2 つの部分に分割する必要があります。1 つは、必要なステップ数を見つけてユーザーに表示し、AJAX リクエストを 2 番目のスクリプトに送信することによって (「プロセス レコード 5001 から 10000 ")、および適切なサーバー応答が到着したとき (つまり、要求が完了したとき) にステップを完了としてマークします (ユーザーが確認できるように)。
2 番目の部分は完全にサーバー側であり、AJAX 要求を受け入れます。このスクリプトは、サーバー上で実際の作業を行います。どのステップを処理する必要があるかを理解するために、何らかのパラメーター (「5001 から 10000 までのレコードを処理する」リクエスト) を受け取る必要があります。ステップが完了すると、クライアント スクリプトに "成功" (または "失敗") コードを返し、ユーザーに通知できるようにします。
このテーマにはバリエーションがあります。たとえば、ユーザーを自分自身にリダイレクトするスクリプトを作成できますが、パラメーターが異なるため、中断した場所を認識し、そこから次のステップに進むことができます。一般に、可能な限り多くの情報と制御をユーザーに提供するソリューションが必要です。
クエリ コードset_time_limit(0);を記述したページの先頭で、以下のコードを使用します 。