目前手上做一个邮件群发系统,基于 CRM系统资料基础上 群发邮件,当要发送的客户数量大的时候就超时了。通过上网查资料,使用了 ignore_user_abort(); 和 set_time_limit(0);  用sleep(40)测试 依然会超时。请问要如何解决这个问题呢? 先感谢大家帮助了。

解决方案 »

  1.   


    PHP有30秒的超时限制,当执行一些数据交互的时候超过30秒会自动断开,资料说使用set_time_limit(0)以后可以临时设置这个方法的超时限制。问题是我用了以后依然是超时了,不知道是什么问题。
      

  2.   


    代码中写set_time_limit(0)只是暂时改变运行环境,不需要重启apache.
      

  3.   

    why设置了还会超时。关键代码贴出来凉凉...
      

  4.   


    测试的代码如下:
    function sendAction()
    {
                    /验证post
    if (!$this->getRequest()->isPost()){
    return;
    }
    //post数据获取
    $post = $this->getRequest()->getPost();

    if ($post['type'] == 'mass'){
    ignore_user_abort();
    set_time_limit(60);

    sleep(40);
    echo '40sec HelloWorld!';

    }
             }
      

  5.   


    调用了一次ZF框架的。ZendServer配的环境
      

  6.   

    ignore_user_abort()是处理发送邮件的页面吗?
    set_time_limit(0);这句放到处理发送邮件的页面中,你发出的这个方法,没有长时间做处理操作,不涉及超时,你把ignore_user_abort();
    set_time_limit(60);这两行注释掉试试,应该不会有超时
      

  7.   


    已经将set_time_limit(0)直接放进页面中,依然过不了30秒的超时限制。理论上放在调用的方面里面应该一样的吧,当方法结束后,超时限制恢复正常。因为这里我想是只针对这个发送的方法作临时的处理。想不通。。
      

  8.   

    set_time_limit(60)放在页面最上面试一试
      

  9.   

    set_time_limit(0)
      

  10.   

    如果代码中set_time_limit(0)无效,那很可能是因为你的php开启了安全模式。
    这样的话,除非关闭安全模式或者更改php.ini中的时间设置,否者没有办法不超时
      

  11.   

    安全模式下只能通过修改php.ini来控制交互时间的限制
      

  12.   


    首先感谢朋友热心的帮助啊,心头暖暖的,哈哈。
    刚刚看了一下 php.ini 安全模式是关着的, safe_mode = Off 等几个位置都是关着的。
    十分感谢给我提供了头绪,马上去尝试一下。
      

  13.   

    问题已经解决!
    尝试单独在一个页面使用 set_time_limit(0) ,用sleep(40)测试,成功通过。
    发现不是PHP的问题,最后看了一下ExtJS的问题,发现Ajax里面用timeout设置(默认30秒),
    修改以后就成功通过了。这里注意的是 ExtJS 和 JQuery 都有这个timeout的属性,小白了。