• 技术文章 >后端开发 >php教程

    php获取网页请求状态代码示例

    怪我咯怪我咯2017-07-14 15:04:18原创1541
    果某项请求发送到您的服务器要求显示您网站上的某个网页(例如,用户通过浏览器访问您的网页或 Googlebot 抓取网页时),服务器会返回 HTTP 状态码响应请求。

    此状态码提供关于请求状态的信息,告诉 Googlebot 关于您的网站和请求的网页的信息。

    一些常见的状态码为:

    200 – 服务器成功返回网页

    404 – 请求的网页不存在

    503 – 服务器超时

    本文就此简述php获取网页请求状态程序示例如下:

    方法一,使用 fsockopen

    代码如下:

    function get_http_code($url="localhost", $port=80, $fsock_timeout=10){
        set_time_limit(0);
        ignore_user_abort(true);
    
        // 记录开始时间
        list($usec, $sec) = explode(" ", microtime(true));
        $timer['start'] = (float)$usec + (float)$sec;
    
        // 校验URL
        if(!preg_match("/^https?:\/\//i", $url)){
            $url = "http://".$url;
        }
        // 支持HTTPS
        if(preg_match("/^https:\/\//i", $url)){
            $port = 443;
        }
    
        // 解析URL
        $urlinfo = parse_url($url);
        if(empty($urlinfo['path'])){
            $urlinfo['path'] = '/';
        }
        $host = $urlinfo['host'];
        $uri = $urlinfo['path'] . (empty($urlinfo['query'])?'':$urlinfo['query']);
    
        // 通过fsock打开连接
        if(!$fp = fsockopen($host, $port, $errno, $error, $fsock_timeout)){
            list($usec, $sec) = explode(" ", microtime(true));
            $timer['end'] = (float)$usec + (float)$sec;
            $usetime = (float)$timer['end'] - (float)$timer['start'];
    
            return array('code'=>-1, 'usetime'=>$usetime);
        }
    
        // 提交请求
        $status = socket_get_status($fp);
        $out = "GET {$uri} HTTP/1.1\r\n";
        $out .= "Host: {$host}\r\n";
        $out .= "Connection: Close\r\n\r\n";
        $write = fwrite($fp, $out);
        if(!$write){
            list($usec, $sec) = explode(" ", microtime(true));
            $timer['end'] = (float)$usec + (float)$sec;
            $usetime = (float)$timer['end'] - (float)$timer['start'];
    
            return array('code'=>-2, 'usetime'=>$usetime);
        }
    
        $ret = fgets($fp, 1024);
        preg_match("/http\/\d\.\d\s(\d+)/i", $ret, $m);
        $code = $m[1];
        fclose($fp);
    
        list($usec, $sec) = explode(" ", microtime(true));
        $timer['end'] = (float)$usec + (float)$sec;
        $usetime = (float)$timer['end'] - (float)$timer['start'];
    
        return array('code'=>$code, 'usetime'=>$usetime);
    }

    file_get_contents 是 fsockopen 功能的简单打包,效率稍低些,但是抓取成功率很高,所以在 snoopy 出问题的时候我一般拿他来用。5.0.0 添加了对 context 的支持,有了context,他也可以发送 header 信息,自定义用户 agent, referer, cookies 都不在话下。5.1.0 添加了 offset 和 maxlen 参数,可以只读文件的一部分内容。

    方法二,使用snoopy.class.php

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://www.jb51.net/');
    curl_setopt($ch, CURLOPT_RANGE, '0-500');
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);
    echo $result;
    $writefn = function($ch, $chunk) {
      static $data='';
      static $limit = 500; // 500 bytes, it's only a test
      $len = strlen($data) + strlen($chunk);
      if ($len >= $limit ) {
        $data .= substr($chunk, 0, $limit-strlen($data));
        echo strlen($data) , ' ', $data;
        return -1;
      }
      $data .= $chunk;
      return strlen($chunk);
    };
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://www.jb51.net/');
    curl_setopt($ch, CURLOPT_RANGE, '0-500');
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
    $result = curl_exec($ch);
    curl_close($ch);

    以上就是php获取网页请求状态代码示例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 代码 状态
    上一篇:php 递归与非递归实现的二分查找实例代码 下一篇:PHP一些简单测试
    千万级数据并发解决方案

    相关文章推荐

    • 懒惰是金 介绍几个php通用的函数第1/2页_PHP教程• php字符串截取中文截取2,单字节截取模式_PHP教程• PHP实现MVC开发得最简单的方法——模型_PHP教程• 挑战最棒的留言本的源码(二)_PHP教程• PHP面向对象编程快速入门_PHP教程
    1/1

    PHP中文网