xmlファイルを処理し、データベースに応じていくつかのデータを挿入する必要があります。XMLファイルには10000行近くが含まれており、データベースに挿入する行が数千行になる可能性があるため、スクリプトがを超えるのではないかと心配していますmax execution time
。
これを防ぐために、プロセス全体を小さなステップに分割し、スクリプトが数秒ごとにページを更新し、実行中の処理を続行するスクリプトを見てきました。
私はそれがどのように行われるのだろうか?
xmlファイルを処理し、データベースに応じていくつかのデータを挿入する必要があります。XMLファイルには10000行近くが含まれており、データベースに挿入する行が数千行になる可能性があるため、スクリプトがを超えるのではないかと心配していますmax execution time
。
これを防ぐために、プロセス全体を小さなステップに分割し、スクリプトが数秒ごとにページを更新し、実行中の処理を続行するスクリプトを見てきました。
私はそれがどのように行われるのだろうか?
バッファを使用する別の解決策は次のとおりです。
set_time_limit(0);
header('Content-type: text/html; charset=utf-8');
echo 'Starting... <br />';
for ($i = 0; $i < 10; $i++) {
echo $i . '<br />';
ob_flush();
flush();
sleep(1);
}
echo 'Finished. <br />';
念のためにset_time_limit(0)
(タイムアウトを「無限」に設定)しました。これheader('Content-type: text/html; charset=utf-8')
が機能するために必要です。これはFirefoxとChromeで機能しましたが、IEでは機能しませんでした。IEで動作するようになったら更新します。
更新1:コマンドライン(CLI)からスクリプトを呼び出すこともできます。
php.exe -f \path\to\file.php
php -f /path/to/file.php
このような場合、バッファは必要ありません(ブラウザがない場合はエラーがスローされます)。どちらの場合も、PHPを介してプロセスを開始できexec
ますが、ブラウザに出力されないため、ログをファイルに書き込む必要があります。
以前、インデックス変数を継続してphpページを再呼び出しすることでこれに成功しました。
手順は次のとおりです。
1. start the script with no querystring. it will insert 1000 rows for this time.
(insert_bulk.php)
2. recall the script with data start index 1001.
(insert_bulk.php?start=1001)
3. when the data finishes, stop recalling the script.
これにより、最大実行時間のオーバーフローが防止され、現在処理中の部分がわかります。
スクリプトで sleep() を試すことができます。実行時間としてカウントされないようです(Linuxサーバーのみ)