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
PHP+AJAX实现无刷新注册(带用户名实时检测)
Dec 02 PHP
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
php INI配置文件的解析实现分析
Jan 04 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
php实现文件下载代码分享
Aug 19 PHP
PHP实现从远程下载文件的方法
Mar 12 PHP
php在数组中查找指定值的方法
Mar 17 PHP
PHP7.0安装笔记整理
Aug 28 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
May 09 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
js 幻灯片的实现
2011/12/06 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
从零学Python之入门(二)基本数据类型
2014/05/25 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
python实现Flappy Bird源码
2018/12/24 Python
python 产生token及token验证的方法
2018/12/26 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
电子专业推荐信范文
2013/11/18 职场文书
葬礼司仪主持词
2014/03/31 职场文书
MySQL分库分表详情
2021/09/25 MySQL