zoukankan      html  css  js  c++  java
  • fsockopen 异步非阻塞式请求数据

    index.php

    <?php
    ini_set ( "max_execution_time", "0" );
    // 要传递的数据
    $form_data = array (
        'name'   => 'testname',
        'gender' => 'man'
    );
    
    // 提交的文件信息
    $file_data = array(
        array(
            'name'     => 'photo',
            'filename' => 'photo.jpg',
            'path'     => 'photo.jpg'
        )
    );
    
    
    
    // 请求地址端口信息
    // 请求的域名例:baidu.com,这里是 localhost
    $host    = 'localhost';
    $port    = 80;
    $errno   = '';
    $errstr  = '';
    // 设置连接超时时间
    $timeout = 60;
    // 请求域名后详细地址
    $url     = '/test/index2.php?testget=testval';
    //如果是GET    请求,可直接将编译后的参数放到url上
    //$url = $url . '?' . http_build_query ( $form_data );
    //请求方式
    $method  = "POST";
    
    
    // 创建连接句柄
    $fp = fsockopen ( $host, $port, $errno, $errstr, $timeout );
    if (! $fp) {
        return false;
    }
    
    // 0,资源流将会被转换为非阻塞模式;如果是1,资源流将会被转换为阻塞模式
    // 将此链接句柄变为非阻塞模式,如果传值中有文件,则异步无效,并且传值数组中文件以后的传值内容也无法正常传值
    stream_set_blocking ( $fp, 0 );
    
    
    //POST传值有两种方式
    //===================== 第一种,无需传递文件 =====================
    //格式化一下
    $data = http_build_query ( $form_data );
    // 也可以传递json数据,直接json编译下数组即可
    // $data = json_encode ( $form_data ) ;
    //===================== 第一种,无需传递文件结束 =====================
    
    //===================== 第二种,可以传递文件,但不能设置 stream_set_blocking 等于 0 =====================
    /*
    srand((double)microtime()*1000000);
    $boundary = "---------------------------".substr(md5(rand(0,32000)),0,10);
    
    $data = "--$boundary
    ";
    foreach($form_data as $key=>$val){
        $data .= "Content-Disposition: form-data; name="".$key.""
    ";
        $data .= "Content-type:text/plain
    
    ";
        $data .= rawurlencode($val)."
    ";
        $data .= "--$boundary
    ";
    }
    
    // file data
    foreach($file_data as $file){
        //获取文件的类型信息
        $magicFile = get_cfg_var("magic_mime.magic");
        //要想使用 finfo 方法,需打开 php.ini 中 extension=php_fileinfo.dll 设置
        $finfo = new finfo(FILEINFO_MIME,$magicFile);
        //拼接提交文件的头信息
        $data .= "Content-Disposition: form-data; name="".$file['name'].""; filename="".$file['filename'].""
    ";
        $data .= "Content-Type: ". $finfo->file($file['path']) ."
    
    ";
        $data .= implode("",file($file['path']))."
    ";
        $data .= "--$boundary
    ";
    }
    
    $data .="--
    
    ";
    */
    //===================== 第二种,可以传递文件结束 =====================
    
    
    
    
    
    // 连接句柄不报错就拼接请求内容
    $out = "${method} ${url} HTTP/1.1
    ";
    $out .= "Host:${host}
    ";
    
    //==============不同传值方式 Content-type 值============================
    //GET及POST第一种,无需传递文件
    $out .= "Content-type:application/x-www-form-urlencoded
    ";
    //POST第二种,可以传递文件
    //$out .= "Content-type:multipart/form-data; boundary=$boundary
    ";
    //==============不同传值方式 Content-type 值结束============================
    
    $out .= "Content-length:" . strlen ( $data ) . "
    ";
    $out .= "Connection:close
    
    ";
    $out .= "${data}";
    
    // 发送请求
    fputs ( $fp, $out );
    
    // 非阻塞模式需要设置系统延时,否则程序会不等待收到结果就往下执行代码,这时会有获取不到结果的情况
    // 具体设置延时多长时间,具体还要看接口的响应时间多久
    usleep ( 5000 );
    
    // 获取返回内容(包含响应头信息)
    $response = '';
    
    while ( $row = fread ( $fp, 4096 ) ) {
        $response .= $row;
    }
    //关闭链接
    fclose ( $fp );
    
    // 过滤返回的响应头信息
    // strpos() 函数查找字符串在另一字符串中第一次出现的位置。
    $pos    = strpos ( $response, "
    
    " );
    $header = substr ( $response, 0, $pos );
    $result = substr ( $response, $pos + 4 );
    
    echo $header,"<br/>";
    // 输出返回结果
    echo $result;

    index2.php

    <?php
    echo $_POST ['name'], "<br/>";
    echo $_POST ['gender'], "<br/>";
    echo $_GET ['testget'], "<br/>";
    
    $filename = time () . '.jpg';
    if (move_uploaded_file ( $_FILES ['photo'] ['tmp_name'], $filename )) {
        echo '<img src="' . $filename . '">';
    }
    
    /*
    //post json方式传值
    $data = file_get_contents('php://input');
    $data = json_decode($data,true);
    echo $data['name'],"<br/>";
    echo $data['gender'],"<br/>";
     */
    exit ();
  • 相关阅读:
    极速安装JumpServer
    高并发限流策略
    JDK1.8源码分析:Future和FutureTask-任务异步执行结果
    nginx 转发 header 数据丢失
    zookpeer 和 redis 集群内一致性协议 及 选举 对比
    Spring Boot 中 Druid 的监控页面配置
    eclipse使用正则表达式查找替换
    jvm 线程状态
    Redis做分布式锁
    Dubbo的异常处理
  • 原文地址:https://www.cnblogs.com/dreamhome/p/10019926.html
Copyright © 2011-2022 走看看