zoukankan      html  css  js  c++  java
  • stream_context_create解决file_get_contents超时处理

    stream_context_create作用:
    创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。
    函数原型:resource stream_context_create ([ array $options [, array $params ]] )

    在使用file_get_contents函数的时候,经常会出现超时的情况,在这里要通过查看一下错误提示,看看是哪种错误,比较常见的是读取超时,这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种:

    一、增加超时的时间限制

    这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的。真正的修改file_get_contents延时可以用resource $context的timeout参数:
      $opts = array(
        'http'=>array(
        'method'=>"GET",
        'timeout'=>60,
      )
    );
    //创建数据流上下文
    $context = stream_context_create($opts);

    $html =file_get_contents('http://blog.sina.com/mirze', false, $context);

    //fopen输出文件指针处的所有剩余数据:
    //fpassthru($fp); //fclose()前使用

    二、一次有延时的话那就多试几次

    有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失败将返回 FALSE,所以可以下面这样编写代码:
    $cnt=0;
    while($cnt < 3 && ($str=@file_get_contents('http://blog.sina.com/mirze'))===FALSE) $cnt++;

    以上方法对付超时已经OK了。

    那么Post呢?细心点有人发现了'method'=>"GET", 对!是不是能设置成post呢?百度找了下相关资料,还真可以!而且有人写出了山寨版的post传值函数,如下:

    function Post($url, $post = null){
         $context = array();

         if (is_array($post)) {
             ksort($post);

             $context['http'] = array (
                 'timeout'=>60,
                 'method' => 'POST',
                 'content' => http_build_query($post, '', '&'),
             );
         }
         return file_get_contents($url, false, stream_context_create($context));
    }

    $data = array(
         'name' => 'test',
         'email' => 'test@gmail.com',
         'submit' => 'submit',
    );
    echo Post('http://www.ej38.com', $data);

    OK , 上面函数完美了,既解决了超时控制又解决了Post传值。再配合康盛的改良版RC4加密解密算法,做一个安全性很高的webservice就简单多了。

    播下一种行为,收获一种习惯
  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/tyyf/p/2767448.html
Copyright © 2011-2022 走看看