register_shutdown_function和fastcgi_finish_request实现异步操作,提高响应

1. register_shutdown_function

register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )

  • callback:待注册的中止回调
  • parameter:可以通过传入额外的参数来将参数传给中止函数

调用条件(PHP中止):

  1. 执行完成
  2. exit/die导致的中止
  3. 发生致命错误中止

2.fastcgi_finish_request

//服务器使用了PHP-FPM(FastCGI进程管理器)(兼容非php-fpm)
if(function_exists('fastcgi_finish_request')){
	fastcgi_finish_request();
}

只要代码运行到这个位置,就已经断开请求返回参数给客户端了。 接下来的代码都和客户端没有关系了。

public function a(){
	//执行完成后调用
	register_shutdown_function([$this, 'b'], $c,$d);  
	......
	return true;
}

public function b($c,$d){
	//响应数据给客户端并结束请求
	if (function_exists('fastcgi_finish_request')) {
		fastcgi_finish_request();
	};
	//剩余代码异步执行
	.......
	
}

fastcgi_finish_reques()函数的缺点:

  1. PHP FastCGI 进程数有限,正在处理异步操作的php-cgi进程,无法处理新请求;
  2. 如果并发访问量较大,php-cgi进程数用满,新访问请求,将没有php-cgi去处理。Nginx服务器会出现: 502 Bad Gateway。

zed
请先登录后发表评论
  • latest comments
  • 总共0条评论