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中使用Oracle数据库(5)
Oct 09 PHP
PHP脚本的10个技巧(3)
Oct 09 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
PHP实现百度人脸识别
May 06 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
菜鸟修复电子管记
2021/03/02 无线电
Mysql的常用命令
2006/10/09 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
python中ConfigParse模块的用法
2014/09/29 Python
打包发布Python模块的方法详解
2016/09/18 Python
Python根据成绩分析系统浅析
2019/02/11 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
公司业务员岗位职责
2014/03/18 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
家长反馈意见及建议
2015/06/03 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
如何做好工作总结!
2019/04/10 职场文书