PHP脚本应该在失败时继续工作

时间:2010-12-06 15:59:44

标签: php mysql

我知道人们通常会抱怨脚本无法正常工作,但是即使我希望它停止工作,它也会继续工作。

我有一个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已关闭(默认行为),因此应考虑用户中止..

2 个答案:

答案 0 :(得分:2)

我很确定这是标准的PHP行为 - 仅仅因为浏览器消失并不意味着它不会停止处理脚本。 (虽然重启Apache等会实现这个目标。)

要更改此行为,您可以使用ignore_user_abort

那就是说,“ PHP将不会检测到用户在尝试向客户端发送信息之前已中止连接”,我怀疑这可能是您遇到的问题。

有关详细信息,请参阅上面的链接和PHP runtime configuration information

答案 1 :(得分:0)

没错。您的尝试无效,因为:

  • ESCape - 因为它与页面的工作完全无关 - 大多数浏览器实际上并没有对它做出反应
  • 关闭(或刷新)页面 - 再次,不相关 - SERVER正在做某事,当客户端停止时PHP不会停止 - 服务器实际上无法知道客户端是关闭还是刷新页面
  • Apache重新加载 - 不会杀死PHP分叉进程

重新启动WOULD这样做 - 这会杀死PHP进程和东西。虽然有点麻烦。

执行此操作的方法(如果长时间执行是不合需要的),实际上是使用PHP函数 set_time_limit()设置执行时间限制,或者使解析更加优化(如果是不是)。