php中curl的使用

一: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文件就能使用了。 →_→...













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值