我知道人们通常会抱怨脚本无法正常工作,但是即使我希望它停止工作,它也会继续工作。
我有一个CSV解析器,用于分析行并在DB表中插入条目。我正在为项目使用PDO和Zend Framwork。代码工作正常..实际上太精细了。
public function save()
{
$memory_limit = ini_get('memory_limit');
ini_set('memory_limit', '512M');
$sql = "
INSERT INTO my_table (
date_start,
timeframe,
type,
country_to,
country_from,
code,
weight,
value
) VALUES (?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
weight = VALUES(weight),
value = VALUES(value)
";
if ($this->test_mode) {
echo $sql;
return;
}
$stmt = new Zend_Db_Statement_Pdo($this->_db, $sql);
foreach($this->parsed_data as $entry){
$stmt->execute(array_values($entry));
$affected_rows = $stmt->rowCount();
if ($affected_rows){
$this->_success = true;
}
}
unset($this->parsed_data, $stmt, $sql);
ini_set('memory_limit', $memory_limit);
}
在解析大文件时,脚本需要几秒钟才能完成。当我尝试使用ESC或甚至关闭页面来尝试停止脚本时,会出现问题。在完成插入所有条目之前,脚本不会停止。甚至没有Apache重新加载也没有解决这个问题,重启可能会这样做。
我认为这不是正常的行为,也许我做错了所以我在寻求建议。
感谢。
更新 ignore_user_abort已关闭(默认行为),因此应考虑用户中止..
答案 0 :(得分:2)
我很确定这是标准的PHP行为 - 仅仅因为浏览器消失并不意味着它不会停止处理脚本。 (虽然重启Apache等会实现这个目标。)
要更改此行为,您可以使用ignore_user_abort。
那就是说,“ PHP将不会检测到用户在尝试向客户端发送信息之前已中止连接”,我怀疑这可能是您遇到的问题。
有关详细信息,请参阅上面的链接和PHP runtime configuration information。
答案 1 :(得分:0)
没错。您的尝试无效,因为:
重新启动WOULD这样做 - 这会杀死PHP进程和东西。虽然有点麻烦。
执行此操作的方法(如果长时间执行是不合需要的),实际上是使用PHP函数 set_time_limit()设置执行时间限制,或者使解析更加优化(如果是不是)。