PHP的异步实现方式
2020-06-08 本文已影响0人
sorry510
[TOC]
方法
fastcgi_finish_request()
此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行,此函数需要fpm
,window
下无fpm
无法使用
ignore_user_abort(true)
设置此函数可以忽律客户端中断后,保证php脚本继续执行,此时需要解决另一个问题,如何通知客户端进行中断,可以设置header
主动通知客户端中断
ob_end_clean();
header("Connection: close\r\n");
ignore_user_abort(true); // optional
ob_start();
echo ('something');
$size = ob_get_length();
header("Content-Length: $size"); // 必须写这个长度,否则无效
ob_end_flush();
flush();
ob_end_clean();
// other thing
register_shutdown_function(function() {
sleep(10);
echo('Text user will never see');
file_put_contents('test.log', 'hello' . PHP_EOL, FILE_APPEND);
});
curl
利用curl
执行另一个脚本(另一个脚本需要设置set_time_limit()
),设置CURLOPT_CONNECTTIMEOUT_MS
为1,1毫秒超时
$ch = curl_init();
$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',
CURLOPT_RETURNTRANSFER, 1,
CURLOPT_CONNECTTIMEOUT_MS, 1);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
popen
打开一个新的命令,利用linux
的&
让它后台执行,window
无法使用
pclose(popen("php ./test.php &", 'r'));
任务投递
将任务序列号或参数投递给redis或数据库,然后开启一个轮训任务,不断的去执行被投递的任务
使用第三方框架的多进程模式
swoole
workerman