PHP在LINUX上可以利用CURL程序进行一些http的交互,甚至包括网站登录,POST请求等。当然要求系统带CURL,其次版本还要7以上,具体可参考手册。
首先看下最简单的获取一个HTTP页面的写法:
Code
$url = "http://www.163.com"; //以163为例
$session = curl_init($url);
curl_exec($session);
if (curl_errno($session)) //出错处理
echo curl_error($session);
curl_close($session);
功能就是GET 163的主页。然后更进一步,使用curl_setopt函数做些调整。
然后看个复杂点的,作用是登录网站。
Code
$url = "http://www.abc.com/login.php";
$postargs = "name=jack&password=123456";
$session = curl_init($url);
//设置postargs参数,就POST出去
curl_setopt($session, CURLOPT_POST, true);
curl_setopt($session, CURLOPT_POSTFIELDS, $postargs);
//是否返回header信息,一般可用于检查http返回状态值
curl_setopt($session, CURLOPT_HEADER, true);
//使用cookie,可以用于登录操作,注意需要对应的目录权限
curl_setopt($session,CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($session,CURLOPT_COOKIEJAR, "cookie.txt");
//将返回结果写入变量
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($session);
if (curl_errno($session)) {
echo curl_error($session);
}
curl_close($session);
//输出结果,在这之后可以相应的parse自己需要的东西
echo $ret;
需要注意的就是header头,我们可以用来检查HTTP状态结果,例如服务器返回302让客户端做跳转等的操作。另外还可以发送HEADER信息,用来认证。
CURL还能用于并发操作,多线程的并发,比C#那个伪的强哦。。并发处理的例子:
Code
$url1 = "http://www.abc.com/test1.php";
$url2 = "http://www.abc.com/test2.php";
$cl1 = curl_init(); //初始化2个用于线程操作的
$cl2 = curl_init();
curl_setopt($cl1,CURLOPT_URL,$url1);
curl_setopt($cl2,CURLOPT_URL,$url2);
//继续用cookie文件,假设我们刚才已经登录,需要保持会话的话
curl_setopt($cl1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cl1, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($cl1, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($cl2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cl2, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($cl2, CURLOPT_COOKIEJAR, "cookie.txt");
$mh = curl_multi_init(); //主要靠这个初始化多线程的
curl_multi_add_handle($mh,$cl1);
curl_multi_add_handle($mh,$cl2);
$running = null;
do{
curl_multi_exec($mh,$running);
} while($running > 0); //跑完后running会被置0
//获取返回结果
$ret = array();
$ret[] = curl_multi_getcontent($cl1);
$ret[] = curl_multi_getcontent($cl2);
//关闭
curl_multi_remove_handle($mh,$cl1);
curl_multi_remove_handle($mh,$cl2);
curl_multi_close($mh);
说明一下,这里继续用到cookie,可以让CURL在发送请求的同时把cookie的内容也header上去,这样就保持了会话。多个并发的操作其实也类似,就是把几个分别设置完,然后一起加到multi那个函数里,然后一并发送。
补充:
使用代理的方法,可以通过
Code
//设置url地址,例如127.0.0.1:1080
curl_setopt($session, CURLOPT_PROXY, $proxy_url);
//如果需要的话,设置帐号
//curl_setopt($session, CURLOPT_PROXYUSERPWD, $proxy_auth);
curl_setopt($session, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
//或者HTTP方式,HTTP为默认的方式
//curl_setopt($session, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);