Php 脚本死了,我';我不知道为什么

Php 脚本死了,我';我不知道为什么,php,Php,我正在尝试将一个6000行500 KB的文件解析成一个数组,以便将数据导入到我们的系统中。问题是脚本在第3000-4000行之间的某个位置停止执行。代码中没有中断,我们在其他导入中使用它。关于为什么会发生这种情况,以及我能做些什么来防止它,有什么想法吗 /** * Takes a seperated value string and makes it an array * @param $delimiter string The delimiter to be seperated by, u

我正在尝试将一个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;
}
更新: 已启用错误报告。我已经开始使用一个1500行只有130KB的文件,它做同样的事情

当我像下面的例子那样添加调试代码时,除非我在
echo“test
”之后放了一个出口,否则什么都不会回显

公共函数svToArray($delimiter,$string){
$x=0;
$rowList=array();
$splitContent=preg#u split(“#\n+#”,trim($string));
回声“测试
”; foreach($splitContent as$key=>$value){ $newData=preg#u split(“#”。$delimiter.”,$value); 如果($x==0){ $headerValues=数组_值($newData); }否则{ $tempRow=array(); foreach($rowColumnKey=>$rowColumnValue的新数据){ $tempRow[$headerValue[$rowColumnKey]]=$rowColumnValue; } $rowList[]=$tempRow; } $x++; } 回声“测试”; $this->tru->debug($rowList); 出口 返回$rowList; }
更新
如果我注释掉
$tempRow[]=$rowColumnValue然后它会很好地回显一切….

可能只是超时了。它总是在X秒后停止吗

尝试将最大执行时间设置得更高:在页面顶部设置时间限制(900)

您可以在phpinfo()中检查最大执行时间: 1.使用创建新的php页面
2.搜索最大执行时间你看过这些文件了吗?是否有一行分隔符太多?还有,这些“#”是关于什么的


我的最佳猜测是,您遇到了一个未定义
$headerValues[$rowColumnKey]
的行。

那么$rowColumnKey和$rowColumnValue呢


它们没有在函数中定义。

您确定要遍历返回的数组而不是简单地打印它吗?(问题可能在职能范围之外,而不是在职能范围内。)

还有

`exit;
 return $rowList;`
尝试删除“退出;”排好队,看看有没有什么变化

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

当您无法确定字符串中的内容时,为什么要使用$key=>$value对?如果我们可以看到$string内容的一个小示例,我们可能可以调整此函数以更好地工作

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


$newData在使用前应定义为数组,以确保安全,即使这不会引起您的问题。

请确保已设置错误报告,将其放在php文件的顶部:

ini_set('display_errors', true);
error_reporting(E_ALL);
您还可以延长脚本的执行时间:

ini_set('max_execution_time', 50000);

大约我唯一一次有一个php脚本死亡,没有输出,没有错误是当它耗尽内存。看起来您的脚本不会占用太多内存,但我会检查以确保php的内存限制足够高。

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

似乎输出缓冲区的输出太多,导致页面完全不显示任何内容。

错误消息是什么?您是否启用了错误报告?错误是什么?检查是否已打开“显示错误”并且“错误报告”设置为“全部”。是否已使用其他(可能更小)文件尝试代码?是否已打开错误报告<代码>错误报告(E_全部)在回显后抛出一些flush()语句。这可能会有帮助。同时查看你的错误日志,看看那里是否记录了致命错误。它几乎立即加载。。。我正在尝试使用一个130KB的文件,但它不起作用。@Webnet-脚本超时是脚本必须运行的总时间,即加载文件、解析记录、准备响应并将其发送给客户端的时间。你确定你没有超过这个极限吗?100%肯定。脚本完全加载并在3-5秒内完成。它也不会输出任何回声。什么可以阻止输出显示在页面上?
ini_set('max_execution_time', 50000);