Maison  >  Article  >  développement back-end  >  PHP implémente l'envoi de la méthode de requête asynchrone

PHP implémente l'envoi de la méthode de requête asynchrone

小云云
小云云original
2018-03-27 10:35:1511811parcourir

Cet article partage principalement avec vous la méthode d'envoi de requêtes asynchrones en PHP. Récemment, j'ai rencontré de nombreux problèmes qui nécessitent l'utilisation de requêtes asynchrones PHP au travail, j'ai donc recherché des informations pertinentes sur Internet. Après de nombreux tests et modifications, deux solutions généralement réalisables ont été résumées :

1. Solution 1 : utilisez CURL, mais CUROPT_TIMEOUT doit être défini sur 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. Option 2 : utilisez fsockopen, mais vous devez épeler vous-même la partie de l'en-tête HTTP

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'));

Recommandations associées :

Explication détaillée de la différence entre les requêtes synchrones et les requêtes asynchrones

Explication détaillée d'exemples d'implémentation de JavaScript des requêtes asynchrones Ajax

JavaScript natif implémente la requête asynchrone Ajax

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn