Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中将一个巨大的过程划分为多个步骤?_Php_Database_Execution Time_Multi Step - Fatal编程技术网

如何在php中将一个巨大的过程划分为多个步骤?

如何在php中将一个巨大的过程划分为多个步骤?,php,database,execution-time,multi-step,Php,Database,Execution Time,Multi Step,我需要处理一个xml文件,并相应地将一些数据插入数据库。由于XML文件包含近10000行,并且可能有数千行要插入到数据库中,我担心我的脚本将超过最大执行时间 我见过一些脚本,为了防止出现这种情况,它们将整个过程分成更小的步骤,脚本每隔几秒钟刷新一次页面,并继续执行它正在执行的任何操作 我只是想知道它是如何完成的?你可以尝试在脚本中使用sleep()。 似乎它不算作执行时间()我成功地用一个连续的索引变量重新调用了php页面 这些步骤是: 1. start the script with no q

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

我见过一些脚本,为了防止出现这种情况,它们将整个过程分成更小的步骤,脚本每隔几秒钟刷新一次页面,并继续执行它正在执行的任何操作

我只是想知道它是如何完成的?

你可以尝试在脚本中使用sleep()。
似乎它不算作执行时间()

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

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

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

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 />';
设置时间限制(0);
标题('Content-type:text/html;charset=utf-8');
“回声”开始
; 对于($i=0;$i<10;$i++){ 回显$i。“
”; ob_flush(); 冲洗(); 睡眠(1); } “回声”结束了
我把
设置时间限制(0)
(将超时设置为“无限”)以防万一。
标题('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
启动该过程,但您需要将日志写入某个文件,因为它不会输出到浏览器。

这一点都没有帮助。即使它不计入执行时间,也不会使执行时间缩短。谢谢,但是有没有更稳健的方法来实现这一点?虽然我不知道如何实现,但这似乎有效!我想我只需要调整它以满足我的需要。它定期将缓冲区(存储的输出)发送到浏览器。