2010-12-06 30 views
0

我知道人们通常会抱怨脚本无法正常工作,但是即使我希望脚本停止工作,它仍然可以继续工作。PHP脚本在应该失败时继续工作

我有一个CSV分析器,其分析线和在DB表中插入条目。我正在为项目使用PDO和Zend框架。代码工作正常..实际上太好了。

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重新加载也没有解决这个问题,可能重启会执行。

我认为这是不正常的行为,也许是我做错了什么,所以我要求的建议。

谢谢。

UPDATE ignore_user_abort关闭(默认行为),因此用户中止,应考虑..

+0

一个正在运行的线程,是一个正在运行的线程。考虑一下:如果我开始将一个大文件从一个文件夹复制到另一个文件夹,并确定它耗时过长,并终止查找器/资源管理器窗口,我开始复制,文件传输是否会停止?我希望你在这里也有同样的问题。 – DampeS8N 2010-12-06 16:04:59

+0

这听起来像你正在尝试使用PHP作为脚本语言。您可能想从命令行解释器运行此代码,而不是通过浏览器来获取更多控制权。 – 2010-12-06 16:05:21

回答

2

我敢肯定这是标准的PHP行为 - 只是因为浏览器消失并不意味着它赢得了”不要停止处理脚本。 (虽然重启动Apache等将实现这一目标。)

要改变这种行为,你可以使用ignore_user_abort

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

见上面的链接和PHP runtime configuration information以获得更多信息。

0

这没有错。您尝试将无法工作,因为:

  • 逃避 - 因为它是完全无关的网页的工作 - 大多数浏览器实际上并不反应,因此
  • 关闭(或刷新)的页面 - 再次,没有关系 - 服务器正在做的事情,而当客户端停止PHP不会停止 - 服务器无法真正知道,如果客户端关闭或刷新页面
  • 阿帕奇重装 - 不会杀了PHP分叉过程

重启会做到这一点 - 这会杀了PHP程序和东西。虽然它有点麻烦。

方式做到这一点(如果长时间执行是不可取的),是实际设置执行时间限制,使用PHP函数set_time_limit()函数,或使分析更优化的(如果不是)。