我需要处理一个 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 服务器)