Skip to content


Linux操作系统下三种配置环境变量的方法

现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法。

1.修改/etc/profile文件

如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。

(1)用文本编辑器打开/etc/profile

(2)在profile文件末尾加入:

JAVA_HOME=/usr/share/jdk1.5.0_05

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME

export PATH

export CLASSPATH

(3)重新登录

注解:

a. 你要将 /usr/share/jdk1.5.0_05jdk 改为你的jdk安装目录

b. linux下用冒号“:”来分隔路径

c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值,在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种常见的错误。

d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。

e. export是把这三个变量导出为全局变量。

f. 大小写必须严格区分。

2. 修改.bashrc文件

这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了。

(1)用文本编辑器打开用户目录下的.bashrc文件

(2)在.bashrc文件末尾加入:

set JAVA_HOME=/usr/share/jdk1.5.0_05

export JAVA_HOME

set PATH=$JAVA_HOME/bin:$PATH

export PATH

set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export CLASSPATH

(3)重新登录

3. 直接在shell下设置变量

不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。

只需在shell终端执行下列命令:

export JAVA_HOME=/usr/share/jdk1.5.0_05

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

Posted in unix.

exec 和 system 的区别

exec($command,&$output, &$status);
参数$output $status 可选
如果指定参数 $output 则command执行结果会被按每行拆出有次序地追加保存到数组$output中,切不包含每行结尾的换行\n,
如果指定了参数$status,会将执行状态保存到$status。
状态好像是 0:成功 1 失败
如 exec(’pwd’,$output, $status);

system($command,&$status);
参数$status可选
执行后会自动输出command执行结果,
如果指定了参数$status,会将执行状态保存到$status。
状态好像是 0:成功 1 失败
如 system(’pwd’, $status);

注意:
1 如果想允许用户输入的数据被传入本函数,则应使用 escapeshellarg() 或 escapeshellcmd() 函数来确保用户不能欺骗系统从而执行任意命令。
2 如果用本函数启动一个程序并希望保持在后台运行,必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。

Posted in php, unix. Tagged with , , .

解决 javascript 浮点相乘方法效率比较(字符串处理速度肯定比数值型快)

function xiangcheng(){
var t = 0;
var r = 1;
for(var i = 0; i < arguments.length; i++){
arguments[i] = arguments[i].toString(10);
try{
t += arguments[i].split(’.')[1].length;
}catch(e){}
}
for(var i = 0; i < arguments.length; i++){
r *= Number(arguments[i].replace(’.',”));
}
return r/Math.pow(10,t);
}
function xiangcheng2(arg1,arg2){
var m=0,s1=arg1.toString(10),s2=arg2.toString(10);
try{m+=s1.split(”.”)[1].length}catch(e){}
try{m+=s2.split(”.”)[1].length}catch(e){}
return Number(s1.replace(”.”,”"))*Number(s2.replace(”.”,”"))/Math.pow(10,m);
}

function xiangcheng3(){
var t2 = t = arguments.length - 1;
var tt=0;
var r = 1;
while(t>=0){
arguments[t] = arguments[t].toString(10);
try{
tt += arguments[t].split(’.')[1].length;
}catch(e){}
t–;
}
while(t2>=0){
r *= Number(arguments[t2].replace(’.',”));
t2–;
}
return r/Math.pow(10,tt);
}

var start = new Date().getTime();

for(var i = 0; i<100000; i++){
//var ss = xiangcheng(8.8888,0.8);//9s
var ss = xiangcheng2(8.8888,0.8);//7s
//var ss = xiangcheng3(8.8888,0.8);//8s
}
var end = new Date().getTime();

document.write(’<br />’ + ((end-start)/1000));

Posted in javascript. Tagged with .

javascript 浮点数相乘

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
<title>javascript 实现浮点相乘</title>
<meta name=”Author” content=”abear” />
<meta name=”Keywords” content=”,” />
<meta name=”Description” content=”" />
<style type=”text/css”>
<!–
input {display:block;}
–>
</style>
</head>
<body>
<div id=”wrap”>

<script type=”text/javascript”>
<!–//–><![CDATA[//><!--
Number.prototype.getrate=function(){
var s = this.toString(10);
if(s.indexOf(".")==-1){
return 1;
}else{
return Math.pow(10,parseInt(s.length - s.indexOf(".")-1));
}
}

function tran(){
args = tran.arguments;
var rst = 1;
var add = 1;
for(i=0;i<args.length;i++){
if(typeof args[i] == ’string’){
args[i] = parseFloat(args[i]);
}
add *= args[i].getrate();
args[i] = Math.ceil(args[i] * args[i].getrate());
rst *= args[i];
}
if(add != 0){
rst /= add;
}
return rst;
}

//alert(tran(3.00009,4));
//alert(tran(’3.00009′,4));
//alert(tran(’3.00009′,’4′));

//–><!]]>
</script>

<!– 测试模块 –>
<input type=”text” id=”a1″ name=”" value=”" />
<input type=”text” id=”a2″ name=”" value=”" />
<input type=”text” id=”a3″ name=”" value=”" />
<input type=”text” id=”a4″ name=”" value=”" />
<input type=”text” id=”a5″ name=”" value=”" />
<input type=”text” id=”a6″ name=”" value=”" />
<input type=”text” id=”a6″ name=”" value=”" />
<input type=”button”  onclick=”jisuan()” name=”" value=”计算” />
计算结果:<input type=”text” id=”rstinput” name=”" value=”" />

<script type=”text/javascript”>
<!–//–><![CDATA[//><!--
function jisuan(){
var items = [];
for(var i = 1; i <=6; i++){
if(document.getElementById(’a'+i).value != ”){
items.push(parseFloat(document.getElementById(’a'+i).value))
}
}
document.getElementById(’rstinput’).value = tran.apply(tran,items);
document.getElementById(’rstinput’).select();
}
//–><!]]>
</script>

</div>
</body>
</html>

Posted in javascript. Tagged with , , , .

linux curl 使用说明

Curl是一个很强大的http命令行工具,其功能十分强大。

1) 二话不说,先从这里开始吧!

$ curl http://www.yahoo.com

回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了    ~

2) 嗯,要想把读过来页面存下来,是不是要这样呢?

$ curl http://www.yahoo.com > page.html

当然可以,但不用这么麻烦的!

用curl的内置option就好,存下http的结果,用这个option: -o

$ curl -o page.html http://www.yahoo.com

这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就 OK咯

3) 什么什么?!访问不到?肯定是你的proxy没有设定了。

使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x

$ curl -x 123.45.67.89:1080 -o page.html http://www.yahoo.com

4) 访问有些网站的时候比较讨厌,他使用cookie来记录session信息。

像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?…..

我们来学习这个option: -D <— 这个是把http的response里面的cookie信息存到一个特别的文件中去

$ curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了

5)那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,来判断你是不是不按规矩访问他们的网站的。

这次我们使用这个option来把上次的cookie信息追加到http request里面去: -b

$ curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.yahoo.com

这样,我们就可以几乎模拟所有的IE操作,去访问网页了!

6)稍微等等    ~我好像忘记什么了    ~

对了!是浏览器信息

有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本     NND,哪里有时间为了它去找这些怪异的浏览器呢!?

好在curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -A

$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的 IE6.0,嘿嘿嘿,其实也许你用的是苹果机呢!

而”Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686″则可以告诉对方你是一台 PC上跑着的Linux,用的是Netscape 4.73,呵呵呵

7)另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问的 referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不是首页的地址,就可以断定那是个盗 连了    ~

讨厌讨厌 ~我就是要盗连    ~!!

幸好curl给我们提供了设定referer的option: -e

$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://www.yahoo.com

这样,就可以骗对方的服务器,你是从mail.yahoo.com点击某个链接过来的了,呵呵呵

8)写着写着发现漏掉什么重要的东西了!——- 利用curl 下载文件

刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。比如,

$ curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

这里教大家一个新的option: -O 大写的O,这么用:

$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

这样,就可以按照服务器上的文件名,自动存在本地了!再来一个更好用的。

如果screen1.JPG以外还有screen2.JPG、screen3.JPG、….、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?

不干!

在curl里面,这么写就可以了:

$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

呵呵呵,厉害吧?! ~

9)再来,我们继续讲解下载!

$ curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

这样产生的下载,就是

~zzh/001.JPG
~zzh/002.JPG
...
~zzh/201.JPG
~nick/001.JPG
~nick/002.JPG
...
~nick/201.JPG

够方便的了吧?哈哈哈

咦?高兴得太早了。

由于zzh/nick下的文件名都是001,002…,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了 ~

没关系,我们还有更狠的!

$ curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

—这是…..自定义文件名的下载? —对头,呵呵!

这样,自定义出来下载下来的文件名,就变成了这样:原来: ~zzh/001.JPG —-> 下载后: 001-zzh.JPG 原来: ~nick/001.JPG —-> 下载后: 001-nick.JPG

这样一来,就不怕文件重名啦,呵呵

9)继续讲下载

我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。curl在这些方面也不输给谁,嘿嘿

比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传

$ curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

当然,你不要拿个flashget下载了一半的文件来糊弄我    别的下载软件的半截文件可不一定能用哦 ~

分块下载,我们使用这个option就可以了: -r

举例说明

比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载(赵老师的电话朗诵 :D )我们就可以用这样的命令:

$ curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
$ curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
$ curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
$ curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3

这样就可以分块下载啦。不过你需要自己把这些破碎的文件合并起来如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以如果用的是Windows,用copy /b 来解决吧,呵呵

上面讲的都是http协议的下载,其实ftp也一样可以用。用法嘛,

$ curl -u name:passwd ftp://ip:port/path/file

或者大家熟悉的

$ curl ftp://name:passwd@ip:port/path/file

10) 说完了下载,接下来自然该讲上传咯上传的option是 -T

比如我们向ftp传一个文件:

$ curl -T localfile -u name:passwd ftp://upload_site:port/path/

当然,向http服务器上传文件也可以比如

$ curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi

注意,这时候,使用的协议是HTTP的PUT method

刚才说到PUT,嘿嘿,自然让老服想起来了其他几种methos还没讲呢! GET和POST都不能忘哦。

http提交一个表单,比较常用的是POST模式和GET模式

GET模式什么option都不用,只需要把变量写在url里面就可以了比如:

$ curl http://www.yahoo.com/login.cgi?user=nickwolfe&password=12345

而POST模式的option则是 -d

比如,

$ curl -d "user=nickwolfe&password=12345" http://www.yahoo.com/login.cgi

就相当于向这个站点发出一次登陆申请    ~

到底该用GET模式还是POST模式,要看对面服务器的程序设定。

一点需要注意的是,POST模式下的文件上的文件上传,比如

<form method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi">
<input type=file name=upload>
<input type=submit name=nick value="go">
</form>

这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:

$ curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法比如 https的时候使用本地证书,就可以这样

$ curl -E localcert.pem https://remote_server

再比如,你还可以用curl通过dict协议去查字典    ~

$ curl dict://dict.org/d:computer

Posted in php, unix. Tagged with .

curl 用法

bool curl_setopt (int ch, string option, mixed value)

curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值。

下列选项的值将被作为长整形使用(在option参数中指定):

*CURLOPT_INFILESIZE: 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。
*CURLOPT_VERBOSE: 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。
*CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
*CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。

注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。

*CURLOPT_NOBODY: 如果你不想在输出中包含body部分,设置这个选项为一个非零值。
*CURLOPT_FAILONERROR: 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。
*CURLOPT_UPLOAD: 如果你想让PHP为上传做准备,设置这个选项为一个非零值。
*CURLOPT_POST: 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。
*CURLOPT_FTPLISTONLY: 设置这个选项为非零值,PHP将列出FTP的目录名列表。
*CURLOPT_FTPAPPEND: 设置这个选项为一个非零值,PHP将应用远程文件代替覆盖它。
*CURLOPT_NETRC: 设置这个选项为一个非零值,PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。
*CURLOPT_FOLLOWLOCATION: 设置这个选项为一个非零值(象 “Location: “)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 “Location: “的头)。
*CURLOPT_PUT: 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项.
*CURLOPT_MUTE: 设置这个选项为一个非零值,PHP对于CURL函数将完全沉默。
*CURLOPT_TIMEOUT: 设置一个长整形数,作为最大延续多少秒。
*CURLOPT_LOW_SPEED_LIMIT: 设置一个长整形数,控制传送多少字节。
*CURLOPT_LOW_SPEED_TIME: 设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。
*CURLOPT_RESUME_FROM: 传递一个包含字节偏移地址的长整形参数,(你想转移到的开始表单)。
*CURLOPT_SSLVERSION: 传递一个包含SSL版本的长参数。默认PHP将被它自己努力的确定,在更多的安全中你必须手工设置。
*CURLOPT_TIMECONDITION: 传递一个长参数,指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。这仅用于HTTP。
*CURLOPT_TIMEVALUE: 传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用,或被默认TIMECOND_IFMODSINCE使用。

下列选项的值将被作为字符串:

*CURLOPT_URL: 这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。
*CURLOPT_USERPWD: 传递一个形如[username]:[password]风格的字符串,作用PHP去连接。
*CURLOPT_PROXYUSERPWD: 传递一个形如[username]:[password] 格式的字符串去连接HTTP代理。
*CURLOPT_RANGE: 传递一个你想指定的范围。它应该是”X-Y”格式,X或Y是被除外的。HTTP传送同样支持几个间隔,用逗句来分隔(X-Y,N-M)。
*CURLOPT_POSTFIELDS: 传递一个作为HTTP “POST”操作的所有数据的字符串。
*CURLOPT_REFERER: 在HTTP请求中包含一个”referer”头的字符串。
*CURLOPT_USERAGENT: 在HTTP请求中包含一个”user-agent”头的字符串。
*CURLOPT_FTPPORT: 传递一个包含被ftp “POST”指令使用的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。 这个字符串可以是一个IP地址,一个主机名,一个网络界面名(在UNIX下),或是‘-’(使用系统默认IP地址)。
*CURLOPT_COOKIE: 传递一个包含HTTP cookie的头连接。
*CURLOPT_SSLCERT: 传递一个包含PEM格式证书的字符串。
*CURLOPT_SSLCERTPASSWD: 传递一个包含使用CURLOPT_SSLCERT证书必需的密码。
*CURLOPT_COOKIEFILE: 传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式,或是堆存在文件中的HTTP风格的头。
*CURLOPT_CUSTOMREQUEST: 当进行HTTP请求时,传递一个字符被GET或HEAD使用。为进行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request.

注意: 在确认你的服务器支持命令先不要去这样做。

下列的选项要求一个文件描述(通过使用fopen()函数获得):

*CURLOPT_FILE: 这个文件将是你放置传送的输出文件,默认是STDOUT.
*CURLOPT_INFILE: 这个文件是你传送过来的输入文件。
*CURLOPT_WRITEHEADER: 这个文件写有你输出的头部分。
*CURLOPT_STDERR: 这个文件写有错误而不是stderr。

用来获取需要登录的页面的例子,当前做法是每次或许都登录一次,有需要的人再做改进了:)

例子:
$cookie_jar = tempnam(’./tmp’,'cookie’);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, ‘http://******’);
curl_setopt($ch, CURLOPT_POST, 1);

$request = ‘email_address=&password=&action=’;
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

//把返回来的cookie信息保存在$cookie_jar文件中
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);

//设定返回的数据是否自动显示
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//设定是否显示头信息
curl_setopt($ch, CURLOPT_HEADER, false);

//设定是否输出页面内容
curl_setopt($ch, CURLOPT_NOBODY, false);

curl_exec($ch);

curl_close($ch);
//get data after login
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, ‘http://*****’);
curl_setopt($ch2, CURLOPT_HEADER, false);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);

$orders = curl_exec($ch2);
echo ‘<pre>’;
echo strip_tags($orders);
echo ‘</pre>’;
curl_close($ch2);

Posted in php. Tagged with .

php 模拟POST提交的2种方法 » 百变贝贝

php 模拟POST提交的2种方法

|

1.通过curl函数

$post_data = array();

$post_data['clientname'] = “test08″;

$post_data['clientpasswd'] = “test08″;

$post_data['submit'] = “submit”;

$url=’http://xxx.xxx.xxx.xx/xx/xxx/top.php’;

$o=”";

foreach ($post_data as $k=>$v)

{

$o.= “$k=”.urlencode($v).”&”;

}

$post_data=substr($o,0,-1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_URL,$url);

//为了支持cookie

curl_setopt($ch, CURLOPT_COOKIEJAR, ‘cookie.txt’);

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

$result = curl_exec($ch);

2.通过fsockopen

$URL=‘http://xxx.xxx.xxx.xx/xx/xxx/top.php’;

$post_data['clientname'] = “test08″;

$post_data['clientpasswd'] = “test08″;

$post_data['submit'] = “ログイン”;

$referrer=”";

// parsing the given URL

$URL_Info=parse_url($URL);

// Building referrer

if($referrer==”") // if not given use this script as referrer

$referrer=$_SERVER["SCRIPT_URI"];

// making string from $data

foreach($post_data as $key=>$value)

$values[]=”$key=”.urlencode($value);

$data_string=implode(”&”,$values);

// Find out which port is needed - if not given use standard (=80)

if(!isset($URL_Info["port"]))

$URL_Info["port"]=80;

// building POST-request:

$request.=”POST “.$URL_Info["path"].” HTTP/1.1n”;

$request.=”Host: “.$URL_Info["host"].”n”;

$request.=”Referer: $referrern”;

$request.=”Content-type: application/x-www-form-urlencodedn”;

$request.=”Content-length: “.strlen($data_string).”n”;

$request.=”Connection: closen”;

$request.=”n”;

$request.=$data_string.”n”;

$fp = fsockopen($URL_Info["host"],$URL_Info["port"]);

fputs($fp, $request);

while(!feof($fp)) {

$result .= fgets($fp, 128);

}

fclose($fp);

Snoopy 类(2)

sourceforge.net/projects/snoopy/

http://www.redalt.com/xref/trunk/nav.htm?wp-includes/class-snoopy.php.htm

HTTP类(1,2)

http://www.phpclasses.org/browse/download/1/file/5/name/http.php

PEAR HTTP_Request

http://pear.php.net/package/HTTP_Request

Posted in php. Tagged with , , .

Crontab实例

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start

现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:

1、直接用crontab命令编辑

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

分钟 (0-59)
小時 (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6)//0代表星期天

除了数字还有几个个特殊的符号就是”*”、”/”和”-”、”,”,*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-”代表从某个数字到某个数字,”,”分开几个离散的数字。以下举几个例子说明问题:

每天早上6点

0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时

0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

晚上11点到早上8点之间每两个小时,早上八点

0 23-7/2,8 * * * echo “Have a good dream:)” >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3 command line

1月1日早上4点

0 4 1 1 * command line

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

2、编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号

HOME=/ //使用者运行的路径,这里是根目录

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。
————————————–

基本格式 :
*  *  *  *  *  command
分 时 日 月 周 命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd

Posted in unix. Tagged with , .

php 正则多行匹配问题

js的正则多行匹配似乎是默认的。
php则不然,几次碰到需要多行匹配时,都没有合理解决。
一直以为是增加修正符m来匹配多行,但需要条件,必须制定^$才可以。

使用[.\n\r\s]* 也未能匹配出多行来,郁闷。
后来询问李鹏,才知道s这个修正符号这么NB。
例子:
$a = <<<html
<div class=”blkContainerSblkCon” id=”artibody”>

<!– 播放器 begin –>

<script>

</script>
….
<!– 播放器 end –>
<!– 播放器 end –>

</div>
html;

$regex = “/(<!–\s*播放器\s*begin\s*–>)(.*)(<\!–\s*播放器\s*end\s*–>)/is”;
//非贪婪匹配使用 (.*?)
$replace = ”;
$subject = $a;
$subject = preg_replace($regex,$replace,$subject);
echo $subject;

?>
输出:
<div class=”blkContainerSblkCon” id=”artibody”>

</div>
以下是php手册对修正符号s 和m的描述

s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

m(PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。 当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

Posted in php. Tagged with , .

wget使用指南

wget使用指南

wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.

所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完 毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

wget的常见用法

wget的使用格式

Usage: wget [OPTION]... [URL]...
  • 用wget做站点镜像:
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
# 或者
wget -m http://www.tldp.org/LDP/abs/html/
  • 在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &
# 或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &

上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

  • 使用代理下载
wget -Y on -p -k https://sourceforge.net/projects/wvware/

代理可以在环境变量或wgetrc文件中设定

# 在环境变量中设定代理
export PROXY=http://211.90.168.94:8080/
# 在~/.wgetrc中设定代理
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/

wget各种选项分类列表

  • 启动
-V,  --version           显示wget的版本后退出
-h,  --help              打印语法帮助
-b,  --background        启动后转入后台执行
-e,  --execute=COMMAND   执行`.wgetrc'格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
  • 记录和输入文件
-o,  --output-file=FILE     把记录写到FILE文件中
-a,  --append-output=FILE   把记录追加到FILE文件中
-d,  --debug                打印调试输出
-q,  --quiet                安静模式(没有输出)
-v,  --verbose              冗长模式(这是缺省设置)
-nv, --non-verbose          关掉冗长模式,但不是安静模式
-i,  --input-file=FILE      下载在FILE文件中出现的URLs
-F,  --force-html           把输入文件当作HTML格式文件对待
-B,  --base=URL             将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
--sslcertfile=FILE     可选客户端证书
--sslcertkey=KEYFILE   可选客户端证书的KEYFILE
--egd-file=FILE        指定EGD socket的文件名
  • 下载
--bind-address=ADDRESS   指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t,  --tries=NUMBER           设定最大尝试链接次数(0 表示无限制).
-O   --output-document=FILE   把文档写到FILE文件中
-nc, --no-clobber             不要覆盖存在的文件或使用.#前缀
-c,  --continue               接着下载没下载完的文件
--progress=TYPE          设定进程条标记
-N,  --timestamping           不要重新下载文件除非比本地文件新
-S,  --server-response        打印服务器的回应
--spider                 不下载任何东西
-T,  --timeout=SECONDS        设定响应超时的秒数
-w,  --wait=SECONDS           两次尝试之间间隔SECONDS秒
--waitretry=SECONDS      在重新链接之间等待1...SECONDS秒
--random-wait            在下载之间等待0...2*WAIT秒
-Y,  --proxy=on/off           打开或关闭代理
-Q,  --quota=NUMBER           设置下载的容量限制
--limit-rate=RATE        限定下载输率
  • 目录
-nd  --no-directories            不创建目录
-x,  --force-directories         强制创建目录
-nH, --no-host-directories       不创建主机目录
-P,  --directory-prefix=PREFIX   将文件保存到目录 PREFIX/...
--cut-dirs=NUMBER           忽略 NUMBER层远程目录
  • HTTP 选项
--http-user=USER      设定HTTP用户名为 USER.
--http-passwd=PASS    设定http密码为 PASS.
-C,  --cache=on/off        允许/不允许服务器端的数据缓存 (一般情况下允许).
-E,  --html-extension      将所有text/html文档以.html扩展名保存
--ignore-length       忽略 `Content-Length'头域
--header=STRING       在headers中插入字符串 STRING
--proxy-user=USER     设定代理的用户名为 USER
--proxy-passwd=PASS   设定代理的密码为 PASS
--referer=URL         在HTTP请求中包含 `Referer: URL'头
-s,  --save-headers        保存HTTP头到文件
-U,  --user-agent=AGENT    设定代理的名称为 AGENT而不是 Wget/VERSION.
--no-http-keep-alive  关闭 HTTP活动链接 (永远链接).
--cookies=off         不使用 cookies.
--load-cookies=FILE   在开始会话前从文件 FILE中加载cookie
--save-cookies=FILE   在会话结束后将 cookies保存到 FILE文件中
  • FTP 选项
-nr, --dont-remove-listing   不移走 `.listing'文件
-g,  --glob=on/off           打开或关闭文件名的 globbing机制
--passive-ftp           使用被动传输模式 (缺省值).
--active-ftp            使用主动传输模式
--retr-symlinks         在递归的时候,将链接指向文件(而不是目录)
  • 递归下载
-r,  --recursive          递归下载--慎用!
-l,  --level=NUMBER       最大递归深度 (inf 或 0 代表无穷).
--delete-after       在现在完毕后局部删除文件
-k,  --convert-links      转换非相对链接为相对链接
-K,  --backup-converted   在转换文件X之前,将之备份为 X.orig
-m,  --mirror             等价于 -r -N -l inf -nr.
-p,  --page-requisites    下载显示HTML文件的所有图片
  • 递归下载中的包含和不包含(accept/reject)
-A,  --accept=LIST                分号分隔的被接受扩展名的列表
-R,  --reject=LIST                分号分隔的不被接受的扩展名的列表
-D,  --domains=LIST               分号分隔的被接受域的列表
--exclude-domains=LIST       分号分隔的不被接受的域的列表
--follow-ftp                 跟踪HTML文档中的FTP链接
--follow-tags=LIST           分号分隔的被跟踪的HTML标签的列表
-G,  --ignore-tags=LIST           分号分隔的被忽略的HTML标签的列表
-H,  --span-hosts                 当递归时转到外部主机
-L,  --relative                   仅仅跟踪相对链接
-I,  --include-directories=LIST   允许目录的列表
-X,  --exclude-directories=LIST   不被包含目录的列表
-np, --no-parent                  不要追溯到父目录

Posted in unix. Tagged with .