按月份归档:5 月 2013

nginx 502 Bad Gateway 错误解决办法

一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考:

Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句 502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件

502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:

proxy_next_upstream error timeout invalid_header http_500 http_503;

不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆 stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理 了……

503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin死机,仅仅是503,所以还是有必要保留的。

解决办法

遇到502问题,可以优先考虑按照以下两个步骤去解决。

1、查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep "php-cgi" | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

http  {
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  ......
  }
  ......

php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。

如果这样修改了还解决不了问题,可以参考下面这些方案:

一、max-children和max-requests

一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右。

最近经常会出现这样的情况:php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了。

检查php-fpm的日志文件发现了一些线索。

Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200  Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″  Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll  Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587

在这几句的前面,是1000多行的关闭children和开启children的日志。

原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个 children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间 被关闭。

在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf调大以下两个参数(根据服务器实际情况,过大也不行)

<value name="max_children">5120</value>  <value name="max_requests">600</value>

然后重启php-fpm。

二、增加缓冲区容量大小

将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修 改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

三、request_terminate_timeout

如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:

request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)问题解决了,执行很长时间也不会出错了。优化fastcgi中,还可以改改这个值5s 看看效果。

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

HTTP状态码分类

HTTP状态码分类

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

HTTP状态码分类
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

HTTP状态码列表

HTTP状态码列表
状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

mysql数据库相关思路备份

今天需要把A B两个网站的一些数据更新到C网站,数据结构使用B网站的,A B网站略有不同
思路如下:
1. 复制B数据库到C
2. 复制A数据库到临时数据库L
3. 同步L数据库的结构为B
4. 导出L数据
5. 导入C

中间可能用到的:

1. 不拷贝表数据,只拷贝结构。

CREATE TABLE new_table LIKE old_table

2. 通过 SELECT 查询来拷贝,new_table 表会丢失主键、索引等信息。

引用

CREATE TABLE new_table AS( SELECT * FROM old_table)

3. 完全拷贝表

CREATE TABLE new_table LIKE old_table;INSERT INTO new_table SELECT * FROM old_table;

4. 仅拷贝字段

CREATE TABLE new_table AS( SELECT field1, field2 FROM old_table)

5. 部分拷贝

CREATE TABLE new_table AS( SELECT * FROM old_table WHERE field1 = ‘mangguo’)

CentOS 5.2下Openfire服务器配置笔记

1.java环境搭建

chmod +x jdk-6u25-linux-x64.bin
./jdk-6u25-linux-x64.bin
mv jdk1.6.0_25/ /usr/local/jdk
vim /etc/profile ADD
最后加上如下
—————————————–
JAVA_HOME=”/usr/local/jdk”
CLASS_PATH=”$JAVA_HOME/lib:$JAVA_HOME/jre/lib”
PATH=”.:$PATH:$JAVA_HOME/bin”
export JAVA_HOME
—————————————-

source /etc/profile

2.下载安装openfire

wget http://download.igniterealtime.org/openfire/openfire-3.8.1-1.i386.rpm

rpm -ivh openfire-3.8.1-1.i386.rpm
/etc/init.d/openfire start
/etc/init.d/openfire restart

3.配置 openfire

http://localhost:9090
为了更好地支持中文请输入以下的Mysql连接

jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=utf8

4.下载用户终端

 

http://www.igniterealtime.org/projects/spark/index.jsp

 

http://www.pandion.be/download/start

5 如果需要Nginx做代理

打开nginx的配置文件nginx.conf,增加如下行:
 #gzip  on;
#增加
   upstream bk.openfire {
        server 127.0.0.1:7070;
    }
location / {
            root   html;
            index  index.html index.htm;
}
后面增加 :
location /http-bind {
            proxy_pass http://bk.openfire;
            proxy_buffering off;
            proxy_redirect off;
            proxy_read_timeout 120;
            proxy_connect_timeout 120;
}

黑字为原来的配置, 红色为需要增加的行。

openfire 安装目录 /opt/openfire

 

 

BAT合并文件以及统计数

近期公司采集数据,大概一个文件夹下60万+的txt文档,需要做一个合并,然后清空这些文档,bat如下
————————————————————-

set /p all=复制文件名:
copy *.txt %all%.txt
copy %all%.txt D:\%all%user.txt
del *.txt

 

————————————————————-

统计这些文件的行数(计算采集用户数)
——————————————————

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET lines=0
FOR /F "tokens=* delims=" %%i IN (%1) DO (
    SET /A lines=!lines!+1
)
ECHO !lines!

 

————————————————–
以上代码另存为wc.bat
使用代码  wc xxx.,txt

用apktool+dex2jar+jd_gui反编译apk文件

这三个软件google一下都可以免费下载使用。
我们可以反编译一些软件来学习人家的架构及界面等。
apktool: 可以解析资源文件,比如布局文件xml等,方便查看。
这个简单,不用介绍。
dex2jar:可以将dex文件转换成jar文件
用法:
1.将apk文件后缀改成rar,然后解压,取出其中的classes.dex,放到任意位置;
2.进入cmd,cd到dex2jar所在文件夹,输入命令dex2jar.bat %classes.dex所在目录%\class.dex
3. 命令完成后在%class.dex所在目录%就会生成jar文件

jd_gui:能够将jar文件反编译成java代码
用法:
打开jd_gui,然后将jar包拖放到主界面,就可以看到源代码了。

通过snoopy模拟登陆其他有验证码的网站

实现需求:
通过snoopy获得A站sessionid和验证码图片,在自己的网站上显示登陆表单,提交后,snoopy提交输入信息到A站实现登陆,并获取里面的资料作分析。

验证码和sessionid的获取:
//获取图片
$snoopy->fetch(‘http://www.a.com/imgcode.gif’);
//从header信息里面分析出sessionid
preg_match(‘/JSESSIONID=([\w]+);/’, $snoopy->headers[2],$sessionid);
$jsessionid=$sessionid[1];
$imgcode=base64_encode($snoopy->results);
//显示登陆表单
?>
<form action=”” method=”post”>
<table>
<tr>
<th>用户名</th>
<td><input name=”username”></td>
</tr>
<tr>
<th>密码</th>
<td><input name=”password”></td>
</tr>
<tr>
<th>验证码</th>
<td><input name=”loginValidateCode”>
<img alt=”” src=”data:image/gif;base64,<?php echo $imgcode?>”>
</td>
</tr>
<tr>
<td><input type=”submit”></td>
</tr>
</table>
<input type=”hidden” name=”jsessionid” value=”<?php echo $jsessionid?>”>
</form>

提交表单信息到A站并显示登陆后页面:

$snoopy->cookies[‘JSESSIONID’]=post(‘jsessionid’);
$snoopy->submit(‘http://www.a.com/signin.html’,$_POST);
echo $snoopy->results;

小技巧总结:
可以对获取的图片二进制码通过base64编码直接用在img的src属性
<img alt=”” src=”data:image/gif;base64,<?php echo $base64code?>”>

 

 

 

 

//—-

Snoopy PHP网页抓取工具

snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
下面是它的一些特征:
1、方便抓取网页的内容
2、方便抓取网页的文字(去掉HTML代码)
3、方便抓取网页的链接
4、支持代理主机
5、支持基本的用户/密码认证模式
6、支持自定义用户agent,referer,cookies和header内容
7、支持浏览器转向,并能控制转向深度
8、能把网页中的链接扩展成高质量的url(默认)
9、方便提交数据并且获取返回值
10、支持跟踪HTML框架(v0.92增加)
11、支持再转向的时候传递cookies
12、支持sock
类属性: (缺省值在括号里)
$host 连接的主机
$port 连接的端口
$proxy_host 使用的代理主机,如果有的话
$proxy_port 使用的代理主机端口,如果有的话
$agent 用户代理伪装 (Snoopy v0.1)
$referer 来路信息,如果有的话
$cookies cookies, 如果有的话
$rawheaders 其他的头信息, 如果有的话
$maxredirs 最大重定向次数, 0=不允许 (5)
$offsiteok whether or not to allow redirects off-site. (true)
$expandlinks          是否将链接都补全为完整地址 (true)
$user 认证用户名, 如果有的话
$pass 认证用户名, 如果有的话
$accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
$error 哪里报错, 如果有的话
$response_code 从服务器返回的响应代码
$headers 从服务器返回的头信息
$maxlength 最长返回数据长度
$read_timeout 读取操作超时 (requires PHP 4 Beta 4+)
设置为0为没有超时
$timed_out 如果一次读取操作超时了,本属性返回 true (requires PHP 4 Beta 4+)
$maxframes 允许追踪的框架最大数量
$status 抓取的http的状态
$temp_dir 网页服务器能够写入的临时文件目录 (/tmp)
$curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false
类方法:
fetch($URI)
———–
这是为了抓取网页的内容而使用的方法。
$URI参数是被抓取网页的URL地址。
抓取的结果被存储在 $this->results 中。
如果你正在抓取的是一个框架,Snoopy将会将每个框架追踪后存入数组中,然后存入 $this->results。

fetchtext($URI)
—————
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中的文字内容。

fetchform($URI)
—————
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中表单内容(form)。

fetchlinks($URI)
—————-
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

submit($URI,$formvars)
———————-
本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。

submittext($URI,$formvars)
————————–
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回登陆后网页中的文字内容。

submitlinks($URI)
—————-
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

例子:
<?php
include “Snoopy.class.php”;
$url = “http://www.re1d.com/”;
$snoopy = new Snoopy;
$snoopy->fetchtext($url);//抓取内容(去掉html代码)
#$snoopy->fetchlinks($url);//抓取链接
#$snoopy->fetchform($url); //获取表单
print_r($snoopy->results);打出结果

/******************************表单提交****************************/
$submit_url = “http://www.baidu.com/index.php”;//提交页面
$formvars[“wd”] = “QQ:26818750”;//搜索的词
$snoopy->submit($submit_url,$formvars);
print_r($snoopy->results);//获取表单提交后的 返回的结果
# $snoopy->submittext; //提交后只返回 去除html的 文本
# $snoopy->submitlinks;//提交后只返回 链接

/******************************来伪装ip,伪装浏览器****************************/
$formvars[“username”] = “admin”;
$formvars[“pwd”] = “admin”;
$action = “http://www.taoav.com”; //提交页面
$snoopy->cookies[“PHPSESSID”] = ‘fc106b1918bd522cc863f36890e6fff7’; //伪装sessionid
$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”; //伪装浏览器
$snoopy->referer = http://www.re1d.com; //伪装来源页地址 http_referer
$snoopy->rawheaders[“Pragma”] = “no-cache”; //cache 的http头信息
$snoopy->rawheaders[“X_FORWARDED_FOR”] = “127.0.0.101”; //伪装ip
$snoopy->submit($action,$formvars);
echo $snoopy->results;

原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。
例如 带验证码,验证ip 投票, 可以不停的投。
ps:这里伪装ip ,其实是伪装http头, 所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,
反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。
关于如何验证码 ,简单说下:
首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,
同时记下sessionid和验证码值,
接下来就用snoopy去伪造 。
原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。
有时我们可能需要伪造更多的东西,snoopy完全为我们想到了

$snoopy->proxy_host = “www.re1d.com”;
$snoopy->proxy_port = “8080”; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.taoav.com/images/taoav.gif ;
$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
$snoopy->error //返回报错信息

例子: 抓取一个页面并显示他的头信息和页面内容 (去掉HTML标签的页面):

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetch(“http://www.re1d.com/”))
{
echo “response code: “.$snoopy->response_code.”<br>\n”;
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 提交一个表单并且打印出头信息和去掉HTML标签的页面:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$submit_url = “http://lnk.ispi.net/texis/scripts/msearch/netsearch.html”;

$submit_vars[“q”] = “amiga”;
$submit_vars[“submit”] = “Search!”;
$submit_vars[“searchhost”] = “Altavista”;

if($snoopy->submit($submit_url,$submit_vars))
{
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 展示所有属性的功能:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->proxy_host = “my.proxy.host”;
$snoopy->proxy_port = “8080”;

$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”;
$snoopy->referer = “http://www.microsnot.com/”;

$snoopy->cookies[“SessionID”] = 238472834723489l;
$snoopy->cookies[“favoriteColor”] = “RED”;

$snoopy->rawheaders[“Pragma”] = “no-cache”;

$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetchtext(“http://www.re1d.com”))
{
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 抓取框架内容并展示结果:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->maxframes = 5;

if($snoopy->fetch(“http://www.re1d.com/”))
{
echo “<PRE>”.htmlspecialchars($snoopy->results[0]).”</PRE>\n”;
echo “<PRE>”.htmlspecialchars($snoopy->results[1]).”</PRE>\n”;
echo “<PRE>”.htmlspecialchars($snoopy->results[2]).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

PHP批量检查网站的sitemap是否存在

<?php
$webfile = "sitexml.txt";
$opensite = fopen($webfile, 'r');

function curl($url) {
    /*
    * 测试用的浏览器信息
    *

    */
    $browsers = array (

        "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
        "language" => "en-us,en;q=0.5"
    );
    $ch = curl_init();
    // 设置 url
    curl_setopt($ch, CURLOPT_URL, $url);
    // 设置浏览器的特定header
    //CURLOPT_HTTPHEADER: An array of HTTP header fields to set.
    //curl_setopt($ch, CURLOPT_HTTPHEADER, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array (
        "User-Agent: {$browsers['user_agent']}",
        "Accept-Language: {$browsers['language']}"
    ));

    // 页面内容我们并不需要
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    // 只需返回HTTP header
    curl_setopt($ch, CURLOPT_HEADER, 1);
    // 返回结果,而不是输出它
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //执行curl操作
    //return (curl_exec($ch)!==false) ? true : false;
    $output = curl_exec($ch);
    return $output;
    curl_close($ch);
}
while (!feof($opensite)) {
    $onesite = fgets($opensite, 4096);
    $onesite = str_replace("\n", "", $onesite);
    $url = $onesite . "/sitemap.xml";
    if (!empty ($onesite)) {

        echo "[URL]: $url<br>";
        echo curl($url);

        if (curl($url) == false) {
            echo '<FONT color=#ff0000>' . "网站不能打开" . '</font>' . "<br>";

        }
        preg_match('/HTTP\/1.1\s*(\d+)[\s\S]+/', curl($url), $http_status);
        //print_r($http_status);
        if ($http_status[1] == 200) {
            echo $url . "存在sitemap" . "<br>";
        }
        if ($http_status[1] == 301) {
            $url = 'www.' . $url;
            preg_match('/HTTP\/1.1\s*(\d+)[\s\S]+/', curl($url), $http_status);
            if ($http_status[1] == 200) {
                echo $url . "存在sitemap" . "<br>";
            } else {
                echo '<FONT color=#ff0000>' . $url . "没有sitemap" . '</font>';
            }
        }
        if ($http_status[1] == (404|400|403|500|501|502|503|504|505)) {
            echo '<FONT color=#ff0000>' . $url . "没有sitemap" . '</font>';

        }

        echo "<br><br>";
    }
}
?>

 

RAR保存到JPG之中

copy/b d:xxx.jpg+d:xxx.rar d:xxx.jpg

这个xxx.rar可以放很多东西

将图片下载以后将图片后缀 jpg 改为 rar然后 双击即可打开

一个获取APK的packagename,versionCode,versionName

因为应用经常我这里分析包名,所以写了此bat

使用方法,另存下面的内容为xxx.bat,然后把apk直接拖到此bat上,就会把信息直接赋值到剪切板,直接粘贴就是了

ps:需要android环境支持

 

@echo off
title 获取包名
echo 获取包名
aapt d badging %1 >>qq.txt
findstr "\<package: name=\'*\'\>" qq.txt >>qq2.txt
del qq.txt
CLIP < qq2.txt
del qq2.txt
echo 结束!
#pause
exit