【PHP】异步请求实现方式

复制代码
<?php
/**
 * 异步 执行程序
 * @param string $path 异步url 地址
 * @param array $postData 传递的参数
 * @param string $method 请求方式
 * @param string $url 请求地址
 * @return bool
 */
function request_asynchronous($path, $method = "POST", $postData = array(), $url = ''){
    set_time_limit(0);  //设置不限执行时间
    ignore_user_abort(true);  //忽略客户端中断
    if(empty($path)){
        return false;
    }

    if(!$url){
        $host = $_SERVER['HTTP_HOST'];
    }else{
        $arr = parse_url($url);
        $host = $arr['host'];
    }


    $port = 443;//80
    $host = $port == 443 ? 'ssl://'.$host : $host;
    $errNo = 0;
    $errStr = '';
    $timeout = 120;
    $fp = '';
    if(function_exists('fsockopen')) {
        $fp = fsockopen($host, $port, $errNo, $errStr, $timeout);
    } elseif(function_exists('pfsockopen')) {
        $fp = pfsockopen($host, $port, $errNo, $errStr, $timeout);
    } elseif(function_exists('stream_socket_client')) {
        $fp = stream_socket_client($host.':'.$port, $errNo, $errStr, $timeout);
    }

    if (!$fp) {
        return false;
    }

    stream_set_blocking($fp, 0); //开启非阻塞模式
    stream_set_timeout($fp,  3); //设置超时时间(s)

    $date = [];
    if($postData) {
        //处理参数
        foreach ($postData as $key => $value) {
            if(is_array($value)){
                $date[$key] = serialize($value);
            }else{
                $date[$key] = $value;
            }
        }
    }

    $query = $date ? http_build_query($date) : '';
    if ($method == "GET") {
       $path .= "?".$query;
    }
    //http消息头
    $out = $method." ".$path." HTTP/1.1\r\n";
    $out .= "HOST: ".$host."\r\n";
    if ($method == "POST") {
        $out .= "Content-Length:".strlen($query)."\r\n";
    }
    $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out .= "Connection: Close\r\n\r\n";
    //$out .= "Cookie: ".$cookie."\r\n\r\n";
    if ($method == "POST") {
        $out .= $query;
    }

    fputs($fp, $out);
    //忽略执行结果
    /*while (!feof($fp)) {
        echo fgets($fp, 128);
    }*/
    usleep(5000);
    fclose($fp);

    return true;
}

//调用方式
request_asynchronous("/api/files/index",'GET');
?>
复制代码

 

posted @   bug毁灭者  阅读(970)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示