PHP关闭连接并继续执行后台

时间:2013-08-07 09:39:03

标签: php iis codeigniter-2 output-buffering connection-close

我希望在关闭连接后继续执行脚本。

这是我试过的......

log_message('debug','Test started' );

//Show all errors   
error_reporting(E_ALL); 

//Configurations 
@ini_set("output_buffering", "Off");
//@ini_set('implicit_flush', 1);
@ini_set('zlib.output_compression', 0);

//User abort & maximum time
ignore_user_abort(true);
set_time_limit(0);

//check the level       
if (ob_get_level() == 0) {
    ob_start();
}

//Actual output
echo('hello world ...'); 

// get buffer length        
$size = ob_get_length(); 

// set content length
header("Content-Length:$size"); 

//close the connection 
header("Connection:close");  

// content encoding 
header("Content-Encoding: none"); 

//content type
header("Content-Type: text/html; charset=utf-8"); 

//Release buffer
ob_flush();
ob_end_flush();  
flush(); 

// Continue on background
// never gonna execute from here ...
sleep(20); 

//There is no aliens (class) exists , expecting error on log
$alien = new alienEncoder(); 

$alien->get_aliens( new alienDecoder() );

log_message('debug','End Test'); 

一切运行良好,执行CONTINUE部分(在FLUSH之后停止),服务器上没有错误日志。

相同的代码适用于其他主机,但不在此处。

请帮忙。

服务器:IIS 7.5共享,使用Codeigniter

备注

  1. 没有alienEncoder()或类似的东西,所以我是 期待服务器上的一些错误日志,但没有错误
  2. ResponceBufferLimit设置为零
  3. 使用CGI / FastCgi

2 个答案:

答案 0 :(得分:0)

PHP-FPM特别为此目的提供了一项功能,fastcgi_finish_request()

虽然我不知道如何使用IIS运行它

答案 1 :(得分:-1)

Php与apache请求系统相结合。 它在收到请求时启动 完成后,请求将被关闭。

Flush只是向客户端发送部分响应,但不终止此响应,因此浏览器仍会挂起,等待更多内容。它将消耗带宽,apache和php ressources不必要。 此外,我不得不说这是一个非常糟糕的实践。

在不降低客户端速度的情况下执行计算密集型任务的最佳方法是使用延迟任务系统。 Personnaly我推荐resque(google it!)。它允许您将操作添加到队列,然后工作人员将执行所有排队的任务并计算它们。

对于云托管且几乎免费的选项,请查看iron mq(来自iron.io)。它们以相同的方式工作(您向队列添加任务,然后队列调用将触发任务计算的可配置URL)