【问题标题】:Importing csv timeout issue导入 csv 超时问题
【发布时间】:2011-11-15 21:27:15
【问题描述】:

我正在尝试修改导入 60 秒后超时的 csv 导入函数。对于每一行,都有调整大小的图像并执行一些其他代码。

我知道 vps 可以分批处理这个问题,因为我在同一台服务器上有另一个网站,它运行不同的 csv 程序但做同样的事情。该程序还可以导入 8000 行并调整图像大小。设置有:处理 10 行并等待 3 秒,重复。

我提出的设置:

  • 设置时间限制
  • max_execution_time
  • 浏览器 http 保持活动超时

我已经为每 10 行尝试了 sleep(),但这只会使进程导入更少的行

if( (($current_line % 10) == 0) && ($current_line != 0) )
{
  sleep(3);
}

这就是脚本循环文件的方式

for ($current_line = 0; $line = fgetcsv($handle, MAX_LINE_SIZE, Tools::getValue('separator')); $current_line++)
{
//code here
}

服务器:

  • 阿帕奇
  • PHP 5.3.3
  • MYSQL
  • 清漆缓存

我可以做些什么来完成这项工作?

【问题讨论】:

  • 请更新您的问题,并添加有关您尝试从命令行运行脚本的更多详细信息。

标签: php csv import timeout


【解决方案1】:

当您的脚本超时时,首先要尝试的是使用php-cli 运行它。通过命令行运行的脚本没有执行时间限制。

如果这不能解决您的问题,那么您知道这不是执行时间限制。

要尝试的第二件事是打印出常规状态消息,包括来自memory_get_usage() 的消息,这样您就可以消除内存泄漏作为脚本崩溃的原因。这可以帮助您确定您的脚本是否因某些输入而死亡。

【讨论】:

  • 我用 memory_get_usage() 在每一行都做了一个 file_put_contents(),使用量在 8.25 mb 到 8.75mb 之间。尝试 2 小时后,我无法执行我放弃的命令行导入
【解决方案2】:

您可以覆盖默认超时时间。 set_time_limit (0) ;

使用 sleep 会减少导入的行数,基本上脚本会超时,因为它需要超过 60 秒。通过添加睡眠,它在 60 秒内完成的时间更少。

如果这是一个关键脚本,我会考虑将其转移到另一种可以更快执行的编程语言。如果它只是一次性的,或者不是关键任务,请尝试 set_time_limit(0) 这使它永远不会超时。也可以尝试在浏览器中输入 php scriptname 以在命令行中运行脚本。

【讨论】:

    【解决方案3】:

    尝试向浏览器输出一些内容以使浏览器保持活动状态。如果不活动 FF 为 3 分钟,则 IE 在 1 分钟后超时。

    <?
    if( (($current_line % 10) == 0) && ($current_line != 0) )
    {
      sleep(3);
      echo '. ';
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2014-10-17
      • 2011-09-08
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多