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 相关文章推荐
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
php 验证码实例代码
Jun 01 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
优化PHP程序的方法小结
Feb 23 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
PHP json_decode函数详细解析
Feb 17 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
PHP中的表达式简述
May 29 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 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
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
php生成图片缩略图的方法
2015/04/07 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
利用python实现汉诺塔游戏
2021/03/01 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
个人培训自我鉴定
2014/03/28 职场文书
大专学生求职信
2014/07/04 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
高三英语复习计划
2015/01/19 职场文书
仰望星空观后感
2015/06/10 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
MySQL事务的隔离级别详情
2022/07/15 MySQL