php获取网页请求状态程序示例


Posted in PHP onJune 17, 2014

对于网页返回状态代码一般情况下我们都会去查自己网站状态码是不是200或错误页面是不是404代码,并且多数情况下我们的查看方法就是使用站长工具或ff浏览器等来查看,极少有人想到自己写一个查看状态代码的功能。

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

方法一,使用 fsockopen
(不推荐使用curl_getinfo!)

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, 'https://3water.com/');
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, 'https://3water.com/');
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);

一些常见的状态码为:
200 - 服务器成功返回网页
404 - 请求的网页不存在
503 - 服务器超时
301 - 页面重定向

PHP 相关文章推荐
ADODB类使用
Nov 25 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
Dec 06 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
php实现session共享的实例方法
Sep 19 PHP
php将字符串转换为数组实例讲解
May 05 PHP
php版淘宝网查询商品接口代码示例
Jun 17 #PHP
php+ajax实现图片文件上传功能实例
Jun 17 #PHP
PHP实现删除非站内外部链接实例代码
Jun 17 #PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 #PHP
Thinkphp中Create方法深入探究
Jun 16 #PHP
ThinkPHP中的关联模型注意点
Jun 16 #PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 #PHP
You might like
Session的工作方式
2006/10/09 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
python开发之函数定义实例分析
2015/11/12 Python
Php多进程实现代码
2018/05/07 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
python多任务及返回值的处理方法
2019/01/22 Python
python实现转圈打印矩阵
2019/03/02 Python
使用Python发现隐藏的wifi
2020/03/04 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
总经理助理岗位职责
2013/11/08 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
电工技术比武方案
2014/05/11 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
团员自我评价范文
2015/03/10 职场文书
管辖权异议上诉状
2015/05/23 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android