PHP实现发送异步请求方法

2019-8-2 dingshangchao php开发

本文主要和大家分享PHP实现发送异步请求方法,最近在工作中多次碰到需要用到PHP异步请求的问题,所以在网上查找了相关的资料。经过多次的测试和修改,总结了两种普遍可行的的方案:

1、方案一:使用CURL,但必须设置CUROPT_TIMEOUT为1。


function _curl($url, $data=null, $timeout=0, $isProxy=false){

    $curl = curl_init();

    if($isProxy){   //是否设置代理

        $proxy = "127.0.0.1";   //代理IP

        $proxyport = "8001";   //代理端口

        curl_setopt($curl, CURLOPT_PROXY, $proxy.":".$proxyport);

    }

    curl_setopt($curl, CURLOPT_URL, $url);

    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

    if(!empty($data)){

        curl_setopt($curl, CURLOPT_POST, 1);

        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

        curl_setopt($curl, CURLOPT_HTTPHEADER, array(

                "cache-control: no-cache",

                "content-type: application/json",)

        );

    }

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

    if ($timeout > 0) { //超时时间秒

        curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);

    }

    $output = curl_exec($curl);

    $error = curl_errno($curl);

    curl_close($curl);

    if($error){

        return false;

    }

    return $output;

}

_curl('http://localhost/index.php',null,1);


2、方案二:使用fsockopen,但需要自己拼出HTTP的header部分

function _fsockopen($url,$post_data=array(),$cookie=array()){

    $url_arr = parse_url($url);

    $port = isset($url_arr['port'])?$url_arr['port']:80;

    if($url_arr['scheme'] == 'https'){

        $url_arr['host'] = 'ssl://'.$url_arr['host'];

    }

    $fp = fsockopen($url_arr['host'],$port,$errno,$errstr,30);

    if(!$fp) return false;

    $getPath = isset($url_arr['path'])?$url_arr['path']:'/index.php';

    $getPath .= isset($url_arr['query'])?'?'.$url_arr['query']:'';

    $method = 'GET';  //默认get方式

    if(!empty($post_data)) $method = 'POST';

    $header = "$method  $getPath  HTTP/1.1\r\n";

    $header .= "Host: ".$url_arr['host']."\r\n";

    if(!empty($cookie)){  //传递cookie信息

        $_cookie = strval(NULL);

        foreach($cookie AS $k=>$v){

            $_cookie .= $k."=".$v.";";

        }

        $cookie_str = "Cookie:".base64_encode($_cookie)."\r\n";

        $header .= $cookie_str;

    }

    if(!empty($post_data)){  //传递post数据

        $_post = array();

        foreach($post_data AS $_k=>$_v){

            $_post[] = $_k."=".urlencode($_v);

        }

        $_post = implode('&', $_post);

        $post_str = "Content-Type:application/x-www-form-urlencoded; charset=UTF-8\r\n";

        $post_str .= "Content-Length: ".strlen($_post)."\r\n";  //数据长度

        $post_str .= "Connection:Close\r\n\r\n";

        $post_str .= $_post;  //传递post数据

        $header .= $post_str;

    }else{

        $header .= "Connection:Close\r\n\r\n";

    }

    fwrite($fp, $header);

    //echo fread($fp,1024);

    usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功

    fclose($fp);

    return true;

}

_fsockopen('http://localhost/index.php'));

网站备案号:京ICP备11043289号-1 北京市公安局网络备案 海1101084571
版权所有 北京育灵童科技发展有限公司 Copyright © 2002-2024 www.elight.cn, All Rights Reserved