课程咨询 :13623629309

太原PHP培训 > 达内新闻 > 这么深的套路你懂么?
  • 这么深的套路你懂么?

    发布:博客园精华区      来源:博客园精华区      时间:2016-11-17

  • 这么深的套路你懂么?

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

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

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

    一个是:curl_init()

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

    第二个是:curl_setopt()

    作用:设置http提交参数

    第三个是:curl_exec()

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

    第四个:curl_close()

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

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

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

    /*

    *创建一个curl_init提交函数,模拟get提交,模拟post提交,模拟json提交

    *$url 提交的服务器地址,必须

    *$data 提交的数据,必须,是关联数组,

    *$method 提交的方式,必须,默认get提交,选项值,只能填getpostjson

    *$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' => 'Foo' );

    $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

    );

    postjsoncurl_setopt_array函数不能设置CURLOPT_POSTFIELDSCURLOPT_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过程中的错误。

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

    好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:PHP高级工程师的武功秘籍(四)

下一篇:捕获机密你懂么?

最新开班日期  |  更多

php高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-29

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-29

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-29

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-29

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56