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的控制语句
Oct 09 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
PHP网站基础优化方法小结
Sep 29 PHP
检测png图片是否完整的php代码
Sep 06 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
php按单词截取字符串的方法
Apr 07 PHP
smarty内部日期函数html_select_date()用法实例分析
Jul 08 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 PHP
PHP实现微信提现功能(微信商城)
Nov 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的curl开启问题探讨
2014/04/08 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
js更优雅的兼容
2010/08/12 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
python获取标准北京时间的方法
2015/03/24 Python
Python制作简单的网页爬虫
2015/11/22 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
python修改字典键(key)的方法
2019/08/05 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python如何给函数库增加日志功能
2020/08/04 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
毕业生的求职信范文分享
2013/12/04 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
给校长的建议书500字
2014/05/15 职场文书
动物科学专业求职信
2014/07/27 职场文书
先进工作者推荐材料
2014/12/23 职场文书
普宁寺导游词
2015/02/04 职场文书
python - timeit 时间模块
2021/04/06 Python
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
Python turtle编写简单的球类小游戏
2022/03/31 Python