一:php使用curl下载网页的例子:
<?php
$curl=curl_init("http://www.baidu.com");
curl_setopt($curl,CURLOPT_HEADER,1);
//若第三个参数设置为false,则抓取的内容会直接在网页上输出,否则抓取的内容能被接收-->后续可存为文件,处理字符串等。
curl_setopt($curl,CURLOPT_RETURNTRANSFER,false);
$file=fopen('/tmp/pricelog','a+');
$res=curl_setopt($curl,CURLOPT_FILE,$file);
$data=curl_exec($curl);
curl_close($curl);
?>
经测试,在Apache或Nginx开启时,用浏览器下面的脚本发送请求,上面的脚本在收到post请求后,会将请求中的数据写入文件中。
二:下面来看一个使用curl发送post请求的例子:
在使用curl发送post请求之前,先要有一个页面来接收post请求:
本文仅作实例,未采用虚拟主机,也未使用MVC模型,只用一个简单的页面来接受POST请求。
<?php
if (!empty($_POST))
{
file_put_contents('/tmp/pricelog','POST的内容为'.json_encode($_POST).PHP_EOL,FILE_APPEND);
}
else
{
file_put_contents('/tmp/pricelog','POST的内容为空'.PHP_EOL,FILE_APPEND);
}
//接收端的返回值采取echo的形式,直接return无效
echo "this is POST return value";
?>
接下来看发送的过程:
<?php
$curl=curl_init("http://localhost/curlrecvpost.php");
curl_setopt($curl,CURLOPT_HEADER,false);
//CURLOPT_RETURNTRANSFER被设置为1能获取返回值,
//若不设置,默认为0.且服务端的返回值会直接显示在浏览器中,接收端只能收到一个bool值来指示curl_exec是否被顺利执行
curl_setopt($curl,CURLOPT_RETURNTRANSFER,0);
$arr=array(1,2,3,4);
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$arr);
$res=curl_exec($curl);
curl_close($curl);
var_dump($res);
?>
三:一个使用curl上传文件的例子。发送端文件上传代码:
<?php
$curl=curl_init("http://localhost/curlrecvpost.php");
$file = array("upload_source"=>"@".dirname(__FILE__).'/upload_source.txt');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$file);
$res=curl_exec($curl);
curl_close($curl);
?>
接下来是接收端对上传文件的处理:
<?php
if ($_FILES)
{
file_put_contents('/tmp/pricelog','有文件被上传'.PHP_EOL,FILE_APPEND);
$tmp=$_FILES['upload_source']['tmp_name'];
$name=$_FILES['upload_source']['name'];
if(move_uploaded_file($_FILES['upload_source']['tmp_name'],dirname(__FILE__).'/upload/'.$name))
{
file_put_contents('/tmp/pricelog','上传成功'.PHP_EOL,FILE_APPEND);
}
}
else
{
file_put_contents('/tmp/pricelog','没有文件被上传'.PHP_EOL,FILE_APPEND);
}
?>
四:如何获取curl连接的信息:
$curl=curl_init("http://www.weibo.com/");
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_GET,true);
$res=curl_exec($curl);
if (!curl_error($curl))
{
//如果没出错则打印连接的信息
var_dump(curl_getinfo($curl));
}
else
{
//出错打印错误信息
var_dump(curl_error($curl));
}
在curl操作成功后,调用curl_getinfo会返回一个数组,包含很多有用的信息。从中可获取网络速度,远程主机ip,重定向地址等许多有用的信息。
在发生错误的情况下调用curl_error函数可得到具体的出错信息。
curl比较常用。本文也在持续更新中。
(5)使用curl发送post请求并下载文件。
开发过程中,后端工程师需要对自己的代码进行单元测试,假设有这样的场景:
后端根据收到的数据动态生成pdf,由浏览器下载保存。在测试的时候,我们可以想到自己写一个页面中发POST请求。(注意:此处不能使用ajax,因为其返回的是字符串)显然用curl会更简单。几行代码就解决了,也不需要写新的请求页面。代码如下:
function postGetFile($url,$data)
{
$curl=curl_init($url);
//必须为true,否则返回的数据无法以文件的形式保存。
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_POST,true);
//如果post的数据中含有数组的话,必须使用http_build_query对其编码
curl_setopt($curl,CURLOPT_POSTFIELDS,http_build_query($data));
$ret=curl_exec($curl);
file_put_contents("tmp.pdf",$ret);
curl_close($curl);
}
方便简单,在命令行中新建个php文件就能使用了。 →_→...