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下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
生成卡号php代码
Apr 09 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
php学习之 数组声明
Jun 09 PHP
浅析PHP Socket技术
Aug 02 PHP
php简单实现快速排序的方法
Apr 04 PHP
两种php给图片加水印的实现代码
Apr 18 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 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/11/24 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
利用Python为iOS10生成图标和截屏
2016/09/24 Python
python中import学习备忘笔记
2017/01/24 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
python中append实例用法总结
2019/07/30 Python
Python循环实现n的全排列功能
2019/09/16 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
创立科技Java面试题
2015/11/29 面试题
出纳员岗位责任制
2014/02/11 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
2019销售早会主持词
2019/06/27 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript