PHP使用curl发送请求
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。本文将介绍cURL的一些特性,以及在PHP中如何运用它。
使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下四个步骤:
1.初始化连接句柄curl_init()
;
2.设置CURL选项curl_setopt()
;
3.执行并获取结果curl_exec()
;
4.释放VURL连接句柄curl_close()
。
curl实现GET
1 2 3 4 5 6 7 8 9 10 11 12 | //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt( $ch , CURLOPT_URL, "http://www.68xi.com" ); curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt( $ch , CURLOPT_HEADER, 0); //执行并获取HTML文档内容 $output = curl_exec( $ch ); //释放curl句柄 curl_close( $ch ); //打印获得的数据 print_r( $output ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 上述代码中使用到了四个函数 curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单。 curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。 CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项: CURLOPT_URL 指定请求的URL; CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE; CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。 CURL的选项还有很多,可以到PHP的官方网站(http: //www.php.net/manual/en/function.curl-setopt.php)上查看CURL支持的所有选项列表。 curl实现POST |
1 2 3 4 5 6 7 8 9 10 11 12 13 | $url = "http://localhost/server.php" ; $post_data = array ( "username" => "bob" , "key" => "12345" ); $ch = curl_init(); curl_setopt( $ch , CURLOPT_URL, $url ); curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); // post数据 curl_setopt( $ch , CURLOPT_POST, 1); // post的变量 curl_setopt( $ch , CURLOPT_POSTFIELDS, $post_data ); $output = curl_exec( $ch ); curl_close( $ch ); //打印获得的数据 print_r( $output ); |
PHP封装好的curl请求类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | <?php class Curl { /** * @brief get请求 * @param $url 请求的url * @param array $param 请求的参数 * @param int $timeout 超时时间 * @param int $log 是否启用日志 * @return mixed */ public static function get( $url , $param = array (), $timeout =10, $log =1) { $ch = curl_init(); if ( is_array ( $param )) { $url = $url . '?' . http_build_query( $param ); } curl_setopt( $ch , CURLOPT_URL, $url ); curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt( $ch , CURLOPT_TIMEOUT, $timeout ); // 允许 cURL 函数执行的最长秒数 $data = curl_exec( $ch ); if ( $log ) { $data .= "\r\n" ; $data .= self::logInfo( $ch , $param , $data ); } curl_close( $ch ); return $data ; } /** * @brief post请求 * @param $url 请求的url地址 * @param array $param 请求的参数 * @param int $log 是否启用日志 * @return mixed */ public static function post( $url , $param = array (), $header = array (), $timeout =10, $log =1) { $ch = curl_init(); if ( is_array ( $param )) { $urlparam = http_build_query( $param ); } else if ( is_string ( $param )) { //json字符串 $urlparam = $param ; } curl_setopt( $ch , CURLOPT_URL, $url ); curl_setopt( $ch , CURLOPT_TIMEOUT, $timeout ); //设置超时时间 curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); //返回原生的(Raw)输出 curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt( $ch , CURLOPT_POST, 1); //POST curl_setopt( $ch , CURLOPT_POSTFIELDS, $urlparam ); //post数据 if ( $header ) { curl_setopt( $ch , CURLOPT_HTTPHEADER, $header ); } $data = curl_exec( $ch ); if ( $log ) { $data .= "\r\n" ; $data .= self::logInfo( $ch , $param , $data ); } curl_close( $ch ); return $data ; } /** * 请求信息记录日志 * @param $ch curl句柄 * @param $request 请求参数 * @param $response 响应结果 */ private static function logInfo( $ch , $request , $response ) { $info = curl_getinfo( $ch ); $resultFormat = "耗时:[%s] 返回状态:[%s] 请求的url[%s] 请求参数:[%s] 响应结果:[%s] 大小:[%s]kb 速度:[%s]kb/s" ; $resultLogMsg = sprintf( $resultFormat , $info [ 'total_time' ], $info [ 'http_code' ], $info [ 'url' ], var_export( $request ,true),var_export( $response ,true), $info [ 'size_download' ]/1024, $info [ 'speed_download' ]/1024); return $resultLogMsg ; } } |
使用方法
1 2 3 4 5 | // get请求 echo Curl::get( 'http://www.baidu.com' ); // post请求 $arr = Curl::post( 'http://localhost:9090/test.php' , [ 'a' =>1, 'b' =>2]); print_r( $arr ); |
千行代码,Bug何处藏。 纵使上线又怎样,朝令改,夕断肠。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具