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 相关文章推荐
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
PHP入门之常量简介和系统常量
May 12 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
推荐几个开源的微信开发项目
Dec 28 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
php商品对比功能代码分享
Sep 24 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
php实现socket推送技术的示例
Dec 20 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
PHP如何解决微信文章图片防盗链
Dec 09 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数组中删除元素的实现代码
2012/06/22 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
JS中递归函数
2016/06/17 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
vue实现放大镜效果
2020/09/17 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
Python 制作糗事百科爬虫实例
2016/09/22 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python3实现转换Image图片格式
2018/06/21 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
护士2014年终工作总结
2014/11/11 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书