如何在php中将一个巨大的进程分成多个步骤?

Posted

技术标签:

【中文标题】如何在php中将一个巨大的进程分成多个步骤?【英文标题】:How to divide a huge process into multiple steps in php? 【发布时间】:2012-11-20 12:55:52 【问题描述】:

我需要处理一个 xml 文件并将一些数据相应地插入到我的数据库中。由于 XML 文件包含接近 10000 行并且可能有几千行要插入到数据库中,我担心我的脚本会超过 max execution time

我见过一些脚本来防止这种情况发生,它们将整个过程分成更小的步骤,脚本每隔几秒钟刷新一次页面,它会继续它正在做的任何事情。

我只是想知道它是怎么做到的?

【问题讨论】:

【参考方案1】:

这是另一个使用缓冲区的解决方案:

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)调用脚本:

Windows (cmd.exe):php.exe -f \path\to\file.php Unix(终端):php -f /path/to/file.php

在这些情况下,缓冲区将不是必需的(它们会因为没有浏览器而引发错误)。在这两种情况下,您都可以通过 PHP 的 exec 启动该过程,但您需要将日志写入某个文件,因为它不会输出到浏览器。

【讨论】:

虽然我看不到如何,但这似乎有效!我想我只需要调整它来满足我的需求。 它会定期将缓冲区(存储的输出)发送到浏览器。【参考方案2】:

我成功地用一个连续的索引变量重新调用了 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. 

这将防止溢出最大执行时间,并告诉您它当前正在处理哪个部分。

【讨论】:

谢谢,但有没有更强大的方法可以做到这一点?【参考方案3】:

您有时可以在脚本中尝试 sleep()。 好像不算执行时间(for linux servers only)

【讨论】:

这根本没有帮助。即使不计入执行时间,也不会缩短执行时间。

以上是关于如何在php中将一个巨大的进程分成多个步骤?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中将大数组拆分为小数组? [复制]

如何在 Windows 中将 Git Bash 拆分为多个“视图”?

如何优化多个进程尝试写入同一个日志文件的过程

如何将一个巨大的zip文件拆分成多个卷?

在R中将大文件分成小文件

如何在Python中将图像分割成多个片段