2010-05-14 47 views
0

我试图解析一个6000行500 KB文件到一个数组中,以便我可以将数据导入到我们的系统中。问题是脚本停止在3000-4000行之间的某处执行。代码没有中断,我们在其他进口上使用它。任何想法,为什么这可能会发生,我可以做些什么来防止它?脚本死亡,我不知道为什么

/** 
* Takes a seperated value string and makes it an array 
* @param $delimiter string The delimiter to be seperated by, usually a comma or tab 
* @param $string string The string to seperate 
* @return array The resulting array 
*/ 
public function svToArray ($delimiter, $string) { 
    $x = 0; 
    $rowList = array(); 
    $splitContent = preg_split("#\n+#", trim($string)); 
    foreach ($splitContent as $key => $value) { 
     $newData = preg_split("#".$delimiter."#", $value); 
     if ($x == 0) { 
      $headerValues = array_values($newData); 
     } else { 
      $tempRow = array(); 
      foreach ($newData as $rowColumnKey => $rowColumnValue) {             
       $tempRow[$headerValues[$rowColumnKey]] = $rowColumnValue; 
      } 
      $rowList[] = $tempRow; 
     } 
     $x++; 
    } 
    return $rowList; 
} 

UPDATE: 错误报告已启用。我使用的文件只有130KB在1500线开始,它做同样的事情...

当我添加调试代码,如下面的例子什么,除非我把一个出口echo "test<br/>";

后呼应,在所有
public function svToArray ($delimiter, $string) { 
    $x = 0; 
    $rowList = array(); 
    $splitContent = preg_split("#\n+#", trim($string)); 
    echo "test<br/>"; 
    foreach ($splitContent as $key => $value) { 
     $newData = preg_split("#".$delimiter."#", $value); 
     if ($x == 0) { 
      $headerValues = array_values($newData); 
     } else { 
      $tempRow = array(); 
      foreach ($newData as $rowColumnKey => $rowColumnValue) {             
       $tempRow[$headerValues[$rowColumnKey]] = $rowColumnValue; 
      } 
      $rowList[] = $tempRow; 
     } 
     $x++; 
    } 
    echo "test"; 
    $this->tru->debug($rowList); 
    exit; 
    return $rowList; 
} 

UPDATE 如果我注释掉$tempRow[] = $rowColumnValue;则呼应样样精....

+2

什么是错误信息? 您是否启用了错误报告? – 2010-05-14 14:04:29

+0

最新的错误?检查display_errors是否打开,并将error_reporting设置为E_ALL。 – AlfaTeK 2010-05-14 14:04:54

+0

你有没有用不同的(也许更小的)文件试过你的代码? – nico 2010-05-14 14:05:17

回答

0

看起来好像有太多的输出到输出缓冲区,导致页面什么也没有显示。

1

也许它只是超时。它会在X秒后停止吗?

尝试设置页面顶部的最大执行时间更高:set_time_limit(900)。

您可以查看最长执行时间在你的phpinfo(): 1. 2.搜索的max_execution_time

+0

它几乎立即加载......我现在试着用一个130KB的文件,它不工作。 – Webnet 2010-05-14 14:10:02

+0

@Webnet - 脚本超时是脚本运行的总时间量,即加载文件,解析记录和准备响应并将响应发送到客户端的时间。你确定你没有跳过这个限制吗? – Paolo 2010-05-14 14:17:16

+0

100%正面。脚本完全加载并在3-5秒内完成。它也不输出任何回声。什么可以防止输出显示在页面上? – Webnet 2010-05-14 14:27:09

0

创建一个新的PHP页面你看着的文件吗?是否有太多分隔符?另外,关于“#”的是什么?

我最好的猜测是你打了一条线,其中$headerValues[$rowColumnKey]没有定义。

0

$ rowColumnKey和$ rowColumnValue呢?

它们没有在函数中定义。

0

确定您正在遍历返回的数组而不是简单地尝试打印它吗? (该问题可能是功能之外,而不是在它。)

也...

`exit; 
return $rowList;` 

尝试删除“退出;”行,看看是否改变任何东西。

此外,$ splitContent在使用前未定义为数组,但preg_split将返回一个数组。 (这不应该影响你的结果,但这样做是安全的。)

为什么你使用$ key => $ value对时,你不能确定字符串中的内容?如果我们可以看到$ string内容的一个小例子,我们可能可以调整这个函数以更好地工作。

#应该被替换为/,但这可能只是一个格式问题。

$ newData应该被定义为一个数组,然后才能使用,即使这不会导致您的问题。

0

请确保您有错误报告集,把这个在你的PHP文件的顶部:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

您也可以扩展脚本的执行时间:

ini_set('max_execution_time', 50000); 
0

关于我唯一一次有一个PHP脚本死亡,没有输出,没有错误是当它耗尽内存。它看起来不像你的脚本会使用很多内存,但我会检查以确保php的内存限制足够高。

0

如果可以的话,请增加php.ini中的最大执行时间..还会增加每个实例的最大内存量..检查Web服务器的错误日志也可能有所帮助。