PHP的异步实现方式

2020-06-08  本文已影响0人  sorry510

[TOC]

方法

fastcgi_finish_request()

此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行,此函数需要fpmwindow下无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

上一篇下一篇

猜你喜欢

热点阅读