php使用fsockopen实现异步

/* php使用fsockopen实现异步
 *
 * @parem $url 网页地址 host 主机地址  * @parem $port 网址端口 默认80 * @parem $t 脚本请求时间 默认30s
 * @parem $post_data post 请求参数
 * @parem $exetime 异步任务执行时间(单位秒)
 * @parem $debug 是否开启调试模式
 *
 *
 */
function request_by_fsockopen($url,$post_data=array(),$exetime = 1, $debug=false){

    $url_array = parse_url($url);
    $hostname = $url_array['host'];
    $port = isset($url_array['port'])? $url_array['port'] : 80;
    @$requestPath = $url_array['path'] ."?". $url_array['query'];
    $fp = fsockopen($hostname, $port, $errno, $errstr, $exetime);
    if (!$fp) {
        echo "$errstr ($errno)";
        return false;
    }
    stream_set_blocking($fp,0); //开启非阻塞模式
    stream_set_timeout($fp, 3); //设置超时时间(s)
    $method = "GET";
    if(!empty($post_data)){
        $method = "POST";
    }
    $header = "$method $requestPath HTTP/1.1\r\n";
    $header.="Host: $hostname\r\n";
    if(!empty($post_data)){
        $_post = strval(NULL);
        foreach($post_data as $k => $v){
            $_post[]= $k."=".urlencode($v);//必须做url转码以防模拟post提交的数据中有&符而导致post参数键值对紊乱
        }
        $_post = implode('&', $_post);
        $header .= "Content-Type: application/x-www-form-urlencoded\r\n";//POST数据
        $header .= "Content-Length: ". strlen($_post) ."\r\n";//POST数据的长度
        $header.="Connection: Close\r\n\r\n";//长连接关闭
        $header .= $_post; //传递POST数据
    }else{
        $header.="Connection: Close\r\n\r\n";//长连接关闭
    }

    fwrite($fp, $header);
    usleep(300000); //等待300ms
    //-----------------调试代码区间-----------------
    // 注如果开启下面的注释,异步将不生效可是方便调试
    if($debug){
        $html = '';
        while (!feof($fp)) {
        $html.=fgets($fp);
        }
        echo $html;
    }
    //-----------------调试代码区间-----------------
    fclose($fp);
}


/**
 * 判断是否是HTTPS
 *
*/
function isHTTPS()
{
    if (defined('HTTPS') && HTTPS) return true;
    if (!isset($_SERVER)) return FALSE;
    if (!isset($_SERVER['HTTPS'])) return FALSE;
    if ($_SERVER['HTTPS'] === 1) {  //Apache
        return TRUE;
    } elseif ($_SERVER['HTTPS'] === 'on') { //IIS
        return TRUE;
    } elseif ($_SERVER['SERVER_PORT'] == 443) { //其他
        return TRUE;
    }
    return FALSE;
}
ignore_user_abort(true); // 忽略客户端断开
set_time_limit(0); // 设置执行不超时 0允许最大运行时间

$url = (isHTTPS() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'].'/modules/addons/consumeridcims/createserverorfloatingip.php'; //获取域名
$vars = [
    'orderId' => 375,
    'userId' => 30,
    'invoiceId' => 385,
 ];

// 调用fsockopen实现异步
request_by_fsockopen($url,$vars);
 
  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值