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 求质素(素数) 的实现代码
Apr 12 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 PHP
php生成带logo二维码方法小结
Apr 08 PHP
PHP经典实用正则表达式小结
May 04 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
Oct 15 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
php数组遍历类与用法示例
May 24 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 一个随机字符串生成代码
2010/05/26 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
python实现划词翻译
2020/04/23 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
详解python和matlab的优势与区别
2019/06/28 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
韩语专业本科生求职信
2013/10/01 职场文书
实用求职信范文分享
2013/12/25 职场文书
环保倡议书100字
2014/05/15 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
迎新年主持词
2015/07/06 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB