Php 脚本死了,我';我不知道为什么
我正在尝试将一个6000行500 KB的文件解析成一个数组,以便将数据导入到我们的系统中。问题是脚本在第3000-4000行之间的某个位置停止执行。代码中没有中断,我们在其他导入中使用它。关于为什么会发生这种情况,以及我能做些什么来防止它,有什么想法吗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
/**
* 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);