首页 > 解决方案 > 来自 csv 文件的循环数组导致致命错误:超过 30 秒的最大执行时间

问题描述

我正在尝试遍历 csv 文件中的数组以插入新信息。但是,一旦程序到达循环,它就会抛出一个时间异常。我完全迷失了这个......任何帮助将不胜感激。先感谢您。

function readAndWriteToCsv(String $fullDirectory, Array $images, String $pageTitle)
{
  //echo '<br>';

  $newDirectoryPath = $fullDirectory . '\\CSVproducts.csv';
  $lines2 = file($newDirectoryPath);
  echo 'Directory string made: ' . $newDirectoryPath;
  echo '<br>';

  //$lines = file('D:\\Dropbox (Personal)\\white-performance\\scrap\\1-PAIR-OF-BBC-HEAD-GASKET-GASKETS-MULTI-LAYERED-STEEL-4.585\\pageTitle.txt');


  $csvTests = array_map('str_getcsv', $lines2);

  var_dump($csvTests);
  echo '<br>';
  echo '<h2>'.$csvTests[1][3].'</h2>';
  echo '<br>';
  echo '<h2>'. sizeof($csvTests).'</h2>';
  echo '<br>';
  echo '<h2>'.$csvTests[1][28].'</h2>';
  echo '<br>';
  echo '<h2>'.$csvTests[2][3].'</h2>';
  echo '<br>';
  echo '<h2>'.$csvTests[2][28].'</h2>';
  echo '<br>';
  echo '<h2>'.$csvTests[3][3].'</h2>';
  echo '<br>';
  echo '<h2>'.$csvTests[3][28].'</h2>';
  echo '<br>';

  $arraySize = sizeof($csvTests);
  echo $arraySize;

  for($i = 0; i < $arraySize; $i++)
  {
    $productName = $csvTests[i][3];

    if($productName == $pageTitle)
    {
      //array_fill_keys('images', 'TESTING YOUR MOMA');
      $csvTests[i][3][28] = implode(", ", $images);
      //array_push($csvTests[1][28], $image);
      echo '<br>';
      echo 'Images put in key value: ';
      echo $csvTests[i][28];
      echo '<br>';
    }

  }

}

标签: arrayscsv

解决方案


您的脚本运行时间太长!你最多只有 30 秒的时间来完成你正在做的事情。这里没有抛出异常,这是 PHP 的计时器超时运行程序。没有这个,损坏的 PHP 脚本将永远运行并削弱您的服务器

如果您要输入真正庞大的 CSV,则需要将其拆分为较小的文件,或使用 CLI 命令,这将为您提供无限时间。

此外,您希望在循环内尽可能少地执行操作。也很有可能,对于一个巨大的文件,您可能会用完存储所有这些数据的内存空间。

所以:

  • 使用 cli 命令而不是浏览器请求
  • 将您的 CSV 拆分为较小的文件
  • 在每次循环迭代中做更少的事情

请记住,浏览器请求应该很快!如果你用了 10 秒,那么你就在做你不应该做的事情,如果 30 秒还不够,那你就大错特错了!可能在慢速服务器上处理一个巨大的 CSV 文件,尽管即使在超快的高端专用主机上,你也不应该这样做,尤其是在前端


推荐阅读