从 csv 文件循环数组导致致命错误:超出最大执行时间 30 秒

问题描述 投票:0回答:2

我正在尝试循环遍历 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>';
    }

  }

}
php arrays csv
2个回答
2
投票

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

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

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

所以:

  • 使用 cli 命令而不是浏览器请求
  • 将 CSV 分割成更小的文件
  • 每次循环迭代时减少

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


0
投票

添加到 Tom J Nowells 答案,如果使用 CLI 和/或将 CSV 分割成更小的文件不可行,您也可以增加 增加 PHP 执行时间限制

© www.soinside.com 2019 - 2024. All rights reserved.