关于php的curl一系列函数,这里解释一下它们的作用。

  在html中,我们可以通过form设置http的post和get提交,但假如我们获取的数据不是从html中来的,而是php脚本主动向其他服务器提交呢?这个时候,我们应该怎么实现post和get提交数据呢?答案就是php的curl函数或者stream_context_create函数,还有fsockopen函数等等方式,这里讲一下curl的提交设置,其他两种有时间会写一下。

  curl的函数实现http提交,关键就在四个函数:

    一个是:curl_init()

    作用:初始化curl的``套接流``

    第二个是:curl_setopt()

    作用:设置http提交参数

    第三个是:curl_exec()

    作用:执行curl ``套接流`` 的提交,并获取服务器返回的内容

    第四个:curl_close()

    作用:关闭已经实现http提交目的的``套接流``

    说是说四个函数,但实际的应用中,其实,就是设置curl_setopt这个函数的参数而已,其他三个都是跑龙套的,呵呵。

    不相信,下面我们举一个例子来利用curl系列函数实现http提交,不罗嗦了,直接上代码:

  

<?php
/*
*创建一个curl_init提交函数,模拟get提交,模拟post提交,模拟json提交
*$url 提交的服务器地址,必须
*$data 提交的数据,必须,是关联数组,
*$method 提交的方式,必须,默认get提交,选项值,只能填get、post、json
*$options 其他选项,可有可以无,如果设置了,不能设置CURLOPT_URL,必须符合curl_setopt_array()的参数语法
*如果失败则返回false,提交数据成功,则返回服务器返回的结果
*/
function curl($url='',$data=array(),$method='get',$options=array()){
//验证数据传进来的数据是否合法
if(empty($url) || !filter_var($url,FILTER_VALIDATE_URL)){
return false;
}
if(!is_array($data) && empty($data)){
return false;
}
$method = strtolower($method);
if(!in_array($method,array('get','post','json'))){
return false;
}
//初始化curl句柄,
$ch = curl_init();
//设置服务器返回的数据不直接输出,而是保留在curl_exec()的返回值中
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($options) && is_array($options)){
if(curl_setopt_array($ch,$options) == false){
return false;
}
}
switch($method){
case 'get':
//把要提交的数据转换为get键值对提交
$data = http_build_query($data);
curl_setopt($ch,CURLOPT_URL,$url.'?'.$data);
//获取curl执行后,服务器返回的结果
$return = curl_exec($ch);
curl_close($ch);
return $return;
break;
case 'post':
curl_setopt($ch,CURLOPT_URL,$url);
//设置post提交
curl_setopt($ch,CURLOPT_POST,true);
//提交post的数据
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$return = curl_exec($ch);
curl_close($ch);
return $return;
break;
case 'json':
//设置json提交的数据
$data = json_encode($data);
curl_setopt($ch,CURLOPT_URL,$url);
//设置post提交
curl_setopt($ch,CURLOPT_POST,true);
//json的数据通过post的方式提交
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$return = curl_exec($ch);
curl_close($ch);
return $return;
break;
default:
return false;
break;
}
}
$url = "http://www.test.com/curl_setopt/upload.php";
//下面是测试,本人是测试成功了,我服务器是直接输出$_POST,$_GET
$data = array( 'name' => 'curl' , 'method' => 'post' );
$method ='post';
var_dump(curl($url,$data,$method));

  

    注意::这里::

     json数据提交,服务器必须以php://input获取,如file_get_contents('php://input');

     bool curl_setopt_array ( resource $ch , array $options )的参数举例:

     设置curl套接流$ch相应的选项

      $options = array(
      CURLOPT_SSL_VERIFYPEER => false,
      CURLOPT_HEADER => false
     );

     post和json,curl_setopt_array函数不能设置CURLOPT_POSTFIELDS,CURLOPT_POST这两项
     因为我这函数没有排除,要排除,你可以自己修改这个函数

     curl_setopt_array函数,其实也就是```批量```设置curl_setopt()函数的选项,

    他们的作用是一样的,我这里利用它,是为了方便

     post提交可以上传文件,但是文件的地址必须这样设置,下标为‘file’,地址前加@
     array('file' => '@D:\vhost\test\curl_setopt\xingxing.jpg')
    

    总结:

    假如上面的函数你看不懂,那不要紧,下面我给你解释一下,上面函数的主要意思:

    

    利用curl套接流实现http提交的设置步骤:

    首先:初始化curl

    这对应上面的第一个步骤:

//初始化curl句柄,
$ch = curl_init();

    其次:设置curl的参数,也就是设置http提交的参数,这对应上面的第二个步骤:

//把要提交的数据转换为get键值对提交
$data = http_build_query($data);
curl_setopt($ch,CURLOPT_URL,$url.'?'.$data);

    http_build_query()这个函数的作用不过是把一个关联数组格式化成get方式提交的url键值对形式,这个你自己可以百度,这里不详说了。

    这一步是curl设置套链接最关键的地方,你看下面的post提交和json提交就知道了:

curl_setopt($ch,CURLOPT_URL,$url);
//设置post提交
curl_setopt($ch,CURLOPT_POST,true);
//提交post的数据
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);

    看到没有,设置post提交其实就是在curl_setopt函数中设置参数,

    $ch 是curl_init初始化的套接流,curl_setopt函数就是不停的在这个$ch套接流中设置参数,

    第一个参数:CURLOPT_URL,这是一个很关键的参数,它是设置要提交到哪里的url

    第二个参数:CURLOPT_POST,设置提交的方式Post

    第三个参数:CURLOPT_POSTFIELDS,设置post的提交数据

    其他参数,我这里就不列举了,假如你需要参考,可以链接这里:http://www.php.net/manual/zh/function.curl-setopt.php

    

    最后两步:

    一步是:curl_exec(),这个是执行curl套接流$ch

//设置服务器返回的数据不直接输出,而是保留在curl_exec()的返回值中
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($ch);

    这里要说一下,你其实可以不设置CURLOPT_RETURNTRANSFER这个参数,假如你不设置,那么,服务器返回值将会echo出来,而不是保存在上面的$return中

    另一步是:

curl_close($ch);

    这个是关闭执行完成的套接流,免得它占用内存资源

    再给两个函数:

    curl_errno():

    返回最后一次cURL操作的错误号。

    curl_error():

    返回一条最近一次cURL操作明确的文本的错误信息。

    这两个函数可以追踪curl_init套接流的错误信息,可以根据它们来调整设置curl过程中的错误。

    至此就结束了,有问题可以留言,有错误,望请指出,假如你指出我的错误,鄙人不胜感激,个人见识短浅,错误在所难免,群众的眼睛才是雪亮的。

详解php的curl几个函数的更多相关文章

  1. Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用

    在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...

  2. 这个贴子的内容值得好好学习--实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

    感觉要DJANGO用得好,ORM必须要学好,不管理是内置的,还是第三方的ORM. 最最后还是要到SQL.....:( 这一关,慢慢练啦.. 实例详解Django的 select_related 和 p ...

  3. node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...

  4. 转载 :实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...

  5. 详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用. 1. ...

  6. C#学习笔记--详解委托,事件与回调函数

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等.“protected void Pag ...

  7. WM_PAINT消息详解,使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息(WIN7里有变化,“调整视觉效果”,将“启用桌面组合”去掉)

    什么时候会触发WM_PAINT消息消息呢? 以下内容来自大名鼎鼎的<Windows程序设计(第五版)> 大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要呼叫函数U ...

  8. 详解php中serialize()和unserialize()函数

    php的serialize()函数和unserialize()函数 适用情境:serialize()返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方.这有利于存储或传递 PHP 的 ...

  9. DB2常用函数详解(一):字符串函数

    VALUE函数 语法:VALUE(EXPRESSION1,EXPRESSION2) VALUE函数是用返回一个非空的值,当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第一个参数的值 ...

随机推荐

  1. POJ 1681 (开关问题+高斯消元法)

    题目链接: http://poj.org/problem?id=1681 题目大意:一堆格子,或白或黄.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部变黄,最少需要改变 ...

  2. 使用javamail发信过程中的一些问题及解决方法

    http://www.blogjava.net/TrampEagle/archive/2006/05/26/48326.html 今天在研究javamail发信的过程中,出现了一些小问题,现总结如下, ...

  3. 21045308刘昊阳 《Java程序设计》第十周学习总结

    21045308刘昊阳 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 狭义的网络编程范畴:程序员所作的事情 ...

  4. Leetcode Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  5. 【POJ3667】Hotel

    Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...

  6. 简单打包 ipa 方式!

    应用的发布也分两种 一种是.打包成ipa上传到国内第3方软件市场,当用户的手机已经JailBreak时,双击下载的ipa文件就可以安装软件 (ipa同android的apk包一样,实质是一个压缩包) ...

  7. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  8. 六、雪花《苹果iOS实例编程入门教程》

    该app为应用的功能为制作一场雪景 现版本 SDK 8.4 Xcode 纲要:- UIImageView 的运用- onTimer 代码运用- onAnimation 代码运用 运行Xcode 选择 ...

  9. C# 非模式窗体show()和模式窗体showdialog()的区别(转)

    对话框不是模式就是无模式的.模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载).例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击“确定”或“取消”,则它就是模 ...

  10. 相邻div实现一个跟着另一个自适应高度示例代码

    方法一: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> < ...