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