美文网首页
PHP的异步实现方式

PHP的异步实现方式

作者: sorry510 | 来源:发表于2020-06-08 16:40 被阅读0次

    [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

    相关文章

      网友评论

          本文标题:PHP的异步实现方式

          本文链接:https://www.haomeiwen.com/subject/qvbrtktx.html