ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证 需要安装[» libcurl](http://curl.haxx.se/)包才能使用 PHP 的 cURL 函数。PHP 需要使用 7.10.5 或更高版本的 libcurl。 * [预定义常量](https://www.php.net/manual/zh/curl.constants.php) * [范例](https://www.php.net/manual/zh/curl.examples.php) * [curl 基础例子](https://www.php.net/manual/zh/curl.examples-basic.php) * [cURL 函数](https://www.php.net/manual/zh/ref.curl.php) * [curl\_init](https://www.php.net/manual/zh/function.curl-init.php)— 初始化 cURL 会话 * [curl\_setopt](https://www.php.net/manual/zh/function.curl-setopt.php)— 设置 cURL 传输选项 * [curl\_exec](https://www.php.net/manual/zh/function.curl-exec.php)— 执行 cURL 会话 * [curl\_file\_create](https://www.php.net/manual/zh/function.curl-file-create.php)— 创建一个 CURLFile 对象 * [curl\_close](https://www.php.net/manual/zh/function.curl-close.php)— 关闭 cURL 会话 * [curl\_copy\_handle](https://www.php.net/manual/zh/function.curl-copy-handle.php)— 复制一个cURL句柄和它的所有选项 * [curl\_errno](https://www.php.net/manual/zh/function.curl-errno.php)— 返回最后一次的错误代码 * [curl\_error](https://www.php.net/manual/zh/function.curl-error.php)— 返回当前会话最后一次错误的字符串 * [curl\_escape](https://www.php.net/manual/zh/function.curl-escape.php)— 使用 URL 编码给定的字符串 * [curl\_getinfo](https://www.php.net/manual/zh/function.curl-getinfo.php)— 获取一个cURL连接资源句柄的信息 * [curl\_multi\_add\_handle](https://www.php.net/manual/zh/function.curl-multi-add-handle.php)— 向curl批处理会话中添加单独的curl句柄 * [curl\_multi\_close](https://www.php.net/manual/zh/function.curl-multi-close.php)— 关闭一组cURL句柄 * [curl\_multi\_errno](https://www.php.net/manual/zh/function.curl-multi-errno.php)— 返回上一次 curl 批处理的错误码 * [curl\_multi\_exec](https://www.php.net/manual/zh/function.curl-multi-exec.php)— 运行当前 cURL 句柄的子连接 * [curl\_multi\_getcontent](https://www.php.net/manual/zh/function.curl-multi-getcontent.php)— 如果设置了CURLOPT\_RETURNTRANSFER,则返回获取的输出的文本流 * [curl\_multi\_info\_read](https://www.php.net/manual/zh/function.curl-multi-info-read.php)— 获取当前解析的cURL的相关传输信息 * [curl\_multi\_init](https://www.php.net/manual/zh/function.curl-multi-init.php)— 返回一个新cURL批处理句柄 * [curl\_multi\_remove\_handle](https://www.php.net/manual/zh/function.curl-multi-remove-handle.php)— 移除cURL批处理句柄资源中的某个句柄资源 * [curl\_multi\_select](https://www.php.net/manual/zh/function.curl-multi-select.php)— 等待所有cURL批处理中的活动连接 * [curl\_multi\_setopt](https://www.php.net/manual/zh/function.curl-multi-setopt.php)— 为 cURL 并行处理设置一个选项 * [curl\_multi\_strerror](https://www.php.net/manual/zh/function.curl-multi-strerror.php)— 返回字符串描述的错误代码 * [curl\_pause](https://www.php.net/manual/zh/function.curl-pause.php)— 暂停和取消暂停一个连接。 * [curl\_reset](https://www.php.net/manual/zh/function.curl-reset.php)— 重置一个 libcurl 会话句柄的所有的选项 * [curl\_setopt\_array](https://www.php.net/manual/zh/function.curl-setopt-array.php)— 为 cURL 传输会话批量设置选项 * [curl\_share\_close](https://www.php.net/manual/zh/function.curl-share-close.php)— 关闭 cURL 共享句柄 * [curl\_share\_errno](https://www.php.net/manual/zh/function.curl-share-errno.php)— 返回共享 curl 句柄的最后一次错误号 * [curl\_share\_init](https://www.php.net/manual/zh/function.curl-share-init.php)— 初始化一个 cURL 共享句柄。 * [curl\_share\_setopt](https://www.php.net/manual/zh/function.curl-share-setopt.php)— 为 cURL 共享句柄设置选项。 * [curl\_share\_strerror](https://www.php.net/manual/zh/function.curl-share-strerror.php)— 返回错误号对应的错误消息 * [curl\_strerror](https://www.php.net/manual/zh/function.curl-strerror.php)— 返回错误代码的字符串描述 * [curl\_unescape](https://www.php.net/manual/zh/function.curl-unescape.php)— 解码给定的 URL 编码的字符串 * [curl\_version](https://www.php.net/manual/zh/function.curl-version.php)— 获取 cURL 版本信息 * [CURLFile](https://www.php.net/manual/zh/class.curlfile.php)— CURLFile 类 * [CURLFile::\_\_construct](https://www.php.net/manual/zh/curlfile.construct.php)— 创建 CURLFile 对象 * [CURLFile::getFilename](https://www.php.net/manual/zh/curlfile.getfilename.php)— 获取被上传文件的 文件名 * [CURLFile::getMimeType](https://www.php.net/manual/zh/curlfile.getmimetype.php)— 获取被上传文件的 MIME 类型 * [CURLFile::getPostFilename](https://www.php.net/manual/zh/curlfile.getpostfilename.php)— 获取 POST 请求时使用的 文件名 * [CURLFile::setMimeType](https://www.php.net/manual/zh/curlfile.setmimetype.php)— 设置被上传文件的 MIME 类型 * [CURLFile::setPostFilename](https://www.php.net/manual/zh/curlfile.setpostfilename.php)— 设置 POST 请求时使用的文件名 * [CURLFile::\_\_wakeup](https://www.php.net/manual/zh/curlfile.wakeup.php)— 反序列化句柄 ``` /** * 使用curl方式实现get或post请求 * @param $url 请求的url地址 * @param $data 发送的post数据 如果为空则为get方式请求 * return 请求后获取到的数据 */ public function curlRequest($url, $data = '') { $ch = curl_init(); $params[CURLOPT_URL] = $url; //请求url地址 $params[CURLOPT_HEADER] = false; //是否返回响应头信息 $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回 $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向 $params[CURLOPT_TIMEOUT] = 30; //超时时间 if (!empty($data)) { $params[CURLOPT_POST] = true; $params[CURLOPT_POSTFIELDS] = $data; //发送post参数 } $params[CURLOPT_SSL_VERIFYPEER] = false;//请求https时设置,还有其他解决方案 $params[CURLOPT_SSL_VERIFYHOST] = false;//请求https时,其他方案查看其他博文 curl_setopt_array($ch, $params); //传入curl参数 $content = curl_exec($ch); //执行 curl_close($ch); //关闭连接 return $content; } /** * url方式请求 get或者post方式请求 * * @param string $url 要请求的url地址 * @param array $data 要发送的数据 存在该参数就启用post提交,否则为get请求 * @return mixed $output 返回请求的结果 */ function curl($url, $data = null){ // 1.创建一个新的CURL资源 $ch = curl_init(); // 2.设置URL相应的选项 curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的URL地址 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出(0为直接输出,然后返回bool值) //curl_setopt($ch, CURLOPT_HEADER, 0); // 启用时会将头文件的信息作为数据流输出 curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置cURL允许执行的最长秒数 curl_setopt($ch, CURLOPT_POST, $data ? 1 : 0); // 存在data就启用post发送 启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。 if(!empty($data)){ curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//发送post参数 } //忽略证书 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 3.抓去URL并将它传递给浏览器 $output = curl_exec($ch); // 4.关闭CURL资源,并且释放系统资源 curl_close($ch); // 返回输出 return $output; } ``` 对于某些服务器可能会遇到不兼容的情况,需要将数据拼装成字符串进行发送,可以使用如下函数: ``` function getPost($url,$vars){ $ch = curl_init(); $params[CURLOPT_URL] = $url; //请求url地址 $params[CURLOPT_HEADER] = false; //是否返回响应头信息 $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回 $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向 $params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'; $postfields = ''; foreach ($vars as $key => $value){ $postfields .= urlencode($key) . '=' . urlencode($value) . '&'; } $params[CURLOPT_POST] = true; $params[CURLOPT_POSTFIELDS] = $postfields; //解决方案一 禁用证书验证 $params[CURLOPT_SSL_VERIFYPEER] = false; $params[CURLOPT_SSL_VERIFYHOST] = false; curl_setopt_array($ch, $params); //传入curl参数 return curl_exec($ch); //执行 } ``` post请求 ``` /** * POST 请求 * @param string $url * @param array $param * @param boolean $post_file 是否文件上传 * @return string content */ function post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')) { $is_curlFile = true; } else { $is_curlFile = false; if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false); } } if (is_string($param)) { $strPOST = $param; }elseif($post_file) { if($is_curlFile) { foreach ($param as $key => $val) { if (substr($val, 0, 1) == '@') { $param[$key] = new \CURLFile(realpath(substr($val,1))); } } } $strPOST = $param; } else { $aPOST = array(); foreach($param as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&", $aPOST); } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } } ``` ## [**curl 文件上传**](https://www.cnblogs.com/lichihua/p/10503222.html) **curl\_file\_create** (带路径的文件名 \[, 文件`mimetype` , 上传数据里的文件名\] ) ; new**cURLFile**(带路径的文件名 \[, 文件的`mimetype` , 上传数据里的文件名\] ) ; ~~~ $ch = curl_init('http://example.com/upload.php'); // 创建CURLFile对象 $cfile = curl_file_create('/data/cats.jpg','image/jpeg','test_name'); //$cfile = new cURLFile('/data/cats.jpg','image/jpeg','test_name'); // 分配提交的数据 $data = array('test_file' => $cfile); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_exec($ch); ~~~ upload.php接受到的数据格式类似: ~~~ array(1) { ["test_file"]=> array(5) { ["name"]=> string(9) "test_name" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpPC9Kbx" ["error"]=> int(0) ["size"]=> int(46334) } } ~~~ 上传多个文件 ~~~ $ch = curl_init(); // 上传多个 $postFields = array( 'file[0]' => new cURLFile($file1, $mimetype1, $basename1), 'file[1]' => new cURLFile($file2, $mimetype2, $basename2) ) curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); ~~~ 将@前缀文件名转为cURLFile ~~~ if(is_array($postfields) == true) { foreach($postfields as $key => $value) { // 以@开头 if(strpos($value, '@') === 0) { // 得到去掉@的文件名 $filename = ltrim($value, '@'); //转为CURLFile类 $postfields[$key] = new CURLFile($filename); } } } curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); ~~~ 例子 ~~~ //上传地址 $target="http://youraddress.tld/example/upload.php"; //面向过程的方式创建CURLFile 对象 $cfile1 = curl_file_create('resource/test.png','image/png','testpic'); //面向对象 的方式创建CURLFile 对象 $cfile2 = new CURLFile('resource/test.png','image/png','testpic'); 分配post提交的数据 $imgdata =[ 'myimage1' => $cfile1, 'myimage2' => $cfile2 ]; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $target); //可选 curl_setopt($curl, CURLOPT_USERAGENT,'Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.15'); 可选 curl_setopt($curl, CURLOPT_HTTPHEADER,array('User-Agent: Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.15','Referer: http://someaddress.tld','Content-Type: multipart/form-data')); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 停止验证证书 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//将获取的信息以字符串返回 curl_setopt($curl, CURLOPT_POST, true); // post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $imgdata); // 提交 //可选 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 上传后有重定向 $r = curl_exec($curl); curl_close($curl); ~~~