1

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

这是我尝试过的..

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
4

2 回答 2

0

PHP-FPM有一个专门用于此目的的功能,fastcgi_finish_request()

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

于 2013-08-07T09:45:00.537 回答
-1

php与apache请求系统相结合。它在收到请求时开始,当它完成时,请求被关闭。

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

在不减慢客户端速度的情况下执行计算密集型任务的最佳方法是使用延迟任务系统。我个人推荐 resque(谷歌搜索!)。它使您能够将您的操作添加到队列中,然后工作人员将获取所有排队的任务并计算它们。

有关有效的云托管且几乎免费的选项,请查看 Iron mq(来自 Iron.io)。它们的工作方式相同(您将任务添加到队列中,然后队列调用将触发任务计算的可配置 url)

于 2013-08-07T10:36:44.407 回答