欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP实现发送异步请求方法

程序员文章站 2022-04-14 19:02:46
...
本文主要和大家分享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'));

相关推荐:

同步请求和异步请求的区别详解

JavaScript实现Ajax异步请求实例详解

原生JavaScript实现Ajax异步请求

以上就是PHP实现发送异步请求方法的详细内容,更多请关注其它相关文章!

相关标签: php 方法 请求