PHP+cURL扩展的使用

PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证。

一、使用CURL发送请求的基本流程

使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:

 1. 初始化连接句柄;        curl_init();2. 设置cURL选项;         curl_setopt();3. 执行并获取结果;        curl_exec();4. 释放cURL句柄。         curl_close();

二、使用cURL发送HTTP的典型过程

<?php// 1. 初始化$ch = curl_init();// 2. 设置选项,包括URLcurl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_HEADER,0);// 3. 执行并获取HTML文档内容$output = curl_exec($ch);if($output === FALSE ){echo "CURL Error:".curl_error($ch);}// 4. 释放curl句柄curl_close($ch);
?>

上述代码中使用到了四个函数:
  curl_init()curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单。
  curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。
  CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项:

  1. CURLOPT_URL 指定请求的URL;
  2. CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
  3. CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。
  4. CURL的选项还有很多,可以到PHP的官方网站(http://www.php.net/manual/en/function.curl-setopt.php)上查看CURL支持的所有选项列表。

三、获取CURL请求的输出信息

定义curl_getinfo — 获取一个cURL连接资源句柄的信息。获取最后一次传输的相关信息。
语法mixed curl_getinfo ( resource $ch [, int $opt = 0 ] );
参数
ch
 curl_init() 返回的 cURL

opt
 参数可能是以下常量之一:

  • CURLINFO_EFFECTIVE_URL - 最后一个有效的URL地址
  • CURLINFO_HTTP_CODE - 最后一个收到的HTTP代码
  • CURLINFO_FILETIME - 远程获取文档的时间,如果无法获取,则返回值为“-1”
  • CURLINFO_TOTAL_TIME - 最后一次传输所消耗的时间
  • CURLINFO_NAMELOOKUP_TIME - 名称解析所消耗的时间
  • CURLINFO_CONNECT_TIME - 建立连接所消耗的时间
  • CURLINFO_PRETRANSFER_TIME - 从建立连接到准备传输所使用的时间
  • CURLINFO_STARTTRANSFER_TIME - 从建立连接到传输开始所使用的时间
  • CURLINFO_REDIRECT_TIME - 在事务传输开始前重定向所使用的时间
  • CURLINFO_SIZE_UPLOAD - 以字节为单位返回上传数据量的总值
  • CURLINFO_SIZE_DOWNLOAD - 以字节为单位返回下载数据量的总值
  • CURLINFO_SPEED_DOWNLOAD - 平均下载速度
  • CURLINFO_SPEED_UPLOAD - 平均上传速度
  • CURLINFO_HEADER_SIZE - header部分的大小
  • CURLINFO_HEADER_OUT - 发送请求的字符串
  • CURLINFO_REQUEST_SIZE - 在HTTP请求中有问题的请求的大小
  • CURLINFO_SSL_VERIFYRESULT - 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD - 从Content-Length: field中读取的下载内容长度
  • CURLINFO_CONTENT_LENGTH_UPLOAD - 上传内容大小的说明
  • CURLINFO_CONTENT_TYPE -
    下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type: header
    实例
	curl_exec($ch);$url = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);$total_time= curl_getinfo($ch,CURLINFO_TOTAL_TIME);$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);echo '获取 '.$url.' ,耗时'.$total_time.'秒,HTTP状态码:'.$status;

返回值
  如果 opt 被设置,以字符串形式返回它的值。否则,返回返回一个包含下列元素的关联数组(它们分别对应于 opt):

	curl_exec($ch);$info = curl_getinfo($sh);echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒,HTTP状态码:'.$info['http_code'];

上述代码中curl_getinfo返回的是一个关联数组,包含以下数据:

  1. url:网络地址。 content_type:内容编码。
  2. http_code:HTTP状态码。
  3. header_size:header的大小。
  4. filetime:文件创建的时间。
  5. ssl_verify_result:SSL验证结果。
  6. redirect_count:跳转计数。
  7. total_time:总耗时。
  8. namelookup_time:DNS查询耗时。
  9. connect_time:等待连接耗时。
  10. pretransfer_time:传输前准备耗时。
  11. size_uplpad:上传数据的大小。
  12. size_download:下载数据的大小。
  13. speed_download:下载速度。
  14. speed_upload:上传速度。
  15. download_content_length:下载内容的长度。
  16. upload_content_length:上传内容的长度。
  17. starttransfer_time:开始传输的时间表。
  18. redirect_time:重定向耗时。

注意
  curl_getinfo()函数还有一个可选择参数$opt ,通过这个参数可以设置一些常量,对应到上术这个字段,如果设置了第二个参数,那么返回的只有指定的信息。例如:设置$optCURLINFO_TOTAL_TIME,则curl_getinfo()函数只返回total_time,即总传输消耗的时间,在只需要关注某些传输信息时,设置$opt参数很有意义。

四、cURL-GET请求获取百度首页HTML文档内容

//1、初始化cURL
$ch= curl_init();//2、设置抓取的url
curl_setopt($ch, CURLOPT_URL, 'http://www.baidu.com');//3、设置头文件的信息作为数据流输出(false为不输出)
curl_setopt($ch, CURLOPT_HEADER, false);//4、设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//5、执行命令
$data = curl_exec($ch);//6、关闭URL请求
curl_close($ch);//7、显示获得的数据
print_r($data);

注意:
1、如果是https协议,添加代码如下:

//HTTPS协议添加下面一行代码:
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

五、cURL-通过GET请求传递数据

1、test.php代码

<?phpheader("content-type:text/html;charset=utf-8");$url = "http://127.0.0.1/test/get_data/get_data.php?name=laowang&age=16&sex=man";$ch= curl_init(); // 启动一个CURL会话curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referercurl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回$tmpInfo = curl_exec($ch); // 执行操作curl_close($ch); // 关闭CURL会话echo $tmpInfo; // 输出返回的数据
?>

2、get_data.php代码

<?php$data['name'] = $_GET['name'];$data['age'] = $_GET['age'];$data['sex'] = $_GET['sex'];if(empty($data)){echo 'fail';}else{file_put_contents('wd.txt',$data);echo 'success';}
?>

注意
  返回值为success则传值成功,返回fail则失败。

六、cURL通过POST请求传递数据

1、test.php代码

<?phpheader("content-type:text/html;charset=utf-8");$url = "http://127.0.0.1/test/get_data/get_data.php";$data = array('name'=>'laozhang','age'=>18,'sex'=>'woman');$ch= curl_init(); // 启动一个CURL会话curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referercurl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求if ($data != ''){curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Post提交的数据包}curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回$tmpInfo = curl_exec($ch); // 执行操作curl_close($ch); // 关闭CURL会话echo $tmpInfo; // 返回数据
?>

2、get_data.php代码

<?php$data['name'] = $_POST['name'];$data['age'] = $_POST['age'];$data['sex'] = $_POST['sex'];if(empty($data)){echo 'fail';}else{file_put_contents('./wd.txt',$data);echo 'success';}
?>

3、注意:有时候需要传递json格式的数据,接收数据的方式就要改变了
1、test.php代码修改

$data = json_encode(array('name'=>'隔壁老王','age'=>18,'sex'=>'女'),JSON_UNESCAPED_UNICODE);
......
//设置http的请求头
$header[] = "Content-Type:application/json;charset=utf-8";//成功
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);

2、get_data代码修改

<?php$postData = file_get_contents('php://input');$data = json_decode($postData,true);if(empty($data)){echo 'fail';}else{file_put_contents('wd.txt',$data);echo 'success';}
?>

4、test.php把GET请求和POST请求封装成方法

<?phpfunction http($url, $data='', $method='GET'){ $ch = curl_init(); // 启动一个CURL会话curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Refererif($method=='POST'){curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求if ($data != ''){curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Post提交的数据包}}curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回$tmpInfo = curl_exec($ch); // 执行操作curl_close($ch); // 关闭CURL会话return $tmpInfo; // 返回数据}
?>

七、封装的方法

该段代码摘自《PHP中使用CURL模拟发送GET,POST,PUT,DELETE请求》

<?php 
/* 
* $url		URL路径
* $method	传递参数的方法:get、post、put、delete
* $params	参数
* $auth	登录认证:账号和密码*/
function curl($url,$method,$params,$auth=null){
//1、判断$url,$method,$params是否为空if(empty($url) || empty($method) || empty($params)){return '参数不能为空!';}
//1、初始化CURL句柄$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);//设置请求的URL#curl_setopt($curl, CURLOPT_HEADER, false);// 不要http header 加快效率curl_setopt($curl, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出//2、SSL验证curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);    // https请求时要设置为false 不验证证书和hosts  FALSE 禁止 cURL 验证对等证书(peer's certificate), 自cURL 7.10开始默认为 TRUE。从 cURL 7.10开始默认绑定安装。 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);//检查服务器SSL证书中是否存在一个公用名(common name)。//传送数据时,有的需要指定数据格式-下面是json格式,utf-8格式$header[] = "Content-Type:application/json;charset=utf-8";if(!empty($header)){curl_setopt ( $curl, CURLOPT_HTTPHEADER, $header );//设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100') }//3、请求时间$timeout = 30;curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);//设置连接等待时间//4、不同请求方法的数据提交switch ($method){case "GET" :curl_setopt($curl, CURLOPT_HTTPGET, true);//TRUE 时会设置 HTTP 的 method 为 GET,由于默认是 GET,所以只有 method 被修改时才需要这个选项。 break;case "POST":if(is_array($params)){$params = json_encode($params,320);}#curl_setopt($curl, CURLOPT_POST,true);//TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。#curl_setopt($curl, CURLOPT_NOBODY, true);//TRUE 时将不输出 BODY 部分。同时 Mehtod 变成了 HEAD。修改为 FALSE 时不会变成 GET。// curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");//HTTP 请求时,使用自定义的 Method 来代替"GET"或"HEAD"。对 "DELETE" 或者其他更隐蔽的 HTTP 请求有用。 有效值如 "GET","POST","CONNECT"等等;//设置提交的信息// curl_setopt($curl, CURLOPT_POSTFIELDS,$params);//全部数据使用HTTP协议中的 "POST" 操作来发送。//设置请求方式是post方式curl_setopt($curl,CURLOPT_POST,true);//设置post请求提交的表单信息curl_setopt($curl,CURLOPT_POSTFIELDS,$params);break;case "PUT" :curl_setopt ($curl, CURLOPT_CUSTOMREQUEST, "PUT");curl_setopt($curl, CURLOPT_POSTFIELDS,json_encode($params,320));break;case "DELETE":curl_setopt ($curl, CURLOPT_CUSTOMREQUEST, "DELETE");curl_setopt($curl, CURLOPT_POSTFIELDS,$params);break;default:echo '方法名不能为空!';break;}//5、传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。if (!empty($auth) && isset($auth['username']) && isset($auth['password'])) {curl_setopt($curl, CURLOPT_USERPWD, "{$auth['username']}:{$auth['password']}");}//执行预定义的CURL$output = curl_exec($curl);//获取http返回值,最后一个收到的HTTP代码$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);if($output === FALSE ){echo "CURL Error:".curl_error($curl);}else{if($status === 200){//如果返回值是json格式,就需要转换格式// $output = json_decode($output,true);}else{$output = 'fail:请咨询管理员';}}//关闭cURL会话curl_close($curl);return $output;}
$arr = array('name'=>'wangdi');
var_dump(curl('http://127.0.0.1/test/get_data/get_data.php','POST',$arr)); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dwc_otg驱动 BUG: sleeping function called from invalid context at mm/page_alloc.c

方案商的开发板上otg功能只能做device&#xff0c;硬件看过后说没有5v供电&#xff0c;加上后能够识别U盘了&#xff0c;但是内核报了错 [ 3.264000] usb 2-1: new high-speed USB device number 2 using dwc_otg[ 3.280000] BUG: sleeping function called from invalid conte…

单源最短路径之迪杰斯特拉算法(C语言)

Dijkstra&#xff08;迪杰斯特拉&#xff09;算法 采用广度优先搜索思想&#xff0c;对有向赋权图寻找最短路径。 该算法对于不含负权的有向图来说&#xff0c;是目前已知的最快的单源最短路径算法。 时间复杂度&#xff1a;O&#xff08;n^2&#xff09; 基本原理&#xf…

PHP_VERSION获取php版本

PHP_VERSION PHP_VERSION&#xff1a;当前PHP的版本号。 <?phpecho PHP_VERSION; ?>结果&#xff1a;5.4.45 很多时候我们只需要获取大的版本号就够用了&#xff0c;因为大的版本号决定了很多新的特性和函数。因此用substr()函数获取前三位字符。 <?phpecho su…

全源最短路径之弗洛伊德算法(C语言)

Floyd&#xff08;弗洛伊德&#xff09;算法 该算法是解决任意两点间的最短路径的一种算法&#xff0c;可以正确处理有向图或负权&#xff08;但不可存在负权回路)的最短路径问题&#xff0c;同时也被用于计算有向图的传递闭包。 时间复杂度为 O&#xff08;N^3&#xff09; …

Mybatis主线流程源码解析

Mybatis的基础使用以及与Spring的相关集成在官方文档都写的非常详细&#xff0c;但无论我们采用xml还是注解方式在使用的过程中经常会出现各种奇怪的问题&#xff0c;需要花费大量的时间解决。 抽空了解一下Mybatis的相关源码还是很有必要。 先来看一个简单的Demo&#xff1a; …

动态规划之背包问题(C语言)

动态规划 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称DP&#xff09;是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题 动态规划思想大致上为&#xff1a;若要解一…

PHP函数-判断字符是否在于指定的字符串中

php中判断一个字符是否在字符串中 1、函数 以下四个函数都可以用来判断字符串中是否存在待查询的字符&#xff0c;可以是数字、字母或者符号。 strpos() - 查找字符串在另一字符串中第一次出现的位置&#xff08;区分大小写&#xff09; stripos() - 查找字符串在另一字符…

最大子列和问题(JAVA)

最大子列和 问题描述&#xff1a;给定N个整数的序列{A1&#xff0c;A2&#xff0c;A3&#xff0c;…&#xff0c;An}&#xff0c;求解子列和中最大的值。 这里我们给出{-2&#xff0c;11&#xff0c;-4&#xff0c;13&#xff0c;-5&#xff0c;-2}这样一个序列&#xff0c;正…

Oracle 11g必须开启的服务及服务详细介绍

成功安装Oracle 11g数据库后&#xff0c;你会发现自己电脑运行速度会变慢&#xff0c;配置较低的电脑甚至出现非常卡的状况&#xff0c;通过禁止非必须开启的Oracle服务可以提升电脑的运行速度。那么&#xff0c;具体该怎么做呢? 按照win7 64位环境下Oracle 11g R2安装详解中…

PHP—str_replace()替换函数的使用

一、str_replace()函数 1、定义和用法 str_replace() 函数替换字符串中的一些字符&#xff08;区分大小写&#xff09;。   注释&#xff1a;该函数是区分大小写的。请使用 str_ireplace() 函数执行不区分大小写的搜索。   注释&#xff1a;该函数是二进制安全的。 2、语…

JS/jQuery获取input的值和清空input的value值

一、获取input的值 1、通过普通选择器获取   通过类选择器获取&#xff1a;$(.class).val()   通过id选择器获取&#xff1a;$(" #id").val() 2、通过标签选择器获取   $(" input[ namename ] ").val()   $(" input[ typetext ] ").val…

JAVA刷题方法整理

JAVA刷题方法整理 一、String—>String[] 利用String.split()实现 注&#xff1a;在使用String.split 方法分隔字符串时&#xff0c;分隔符如果用到一些特殊字符&#xff0c;可能会得不到我们预期的结果&#xff0c;例如“|”&#xff0c;“*”&#xff0c;“”等&#x…

实现多线程Callable接口

Callable接口&#xff0c;实现多线程 1.实现 Callable接口&#xff0c;相较于实现 Runnable 接口的方式&#xff0c;优点是&#xff1a;方法可以有返回值&#xff0c;并且可以抛出异常 2.需要 FutureTask实现类的支持&#xff0c;用于接收运算结果 3.result.get()&#xff0c;接…

密码验证

用户在创建一个账户时&#xff0c;需要设置一个密码。密码的复杂程度是安全的保障之一&#xff0c;但是有些用户在设置密码时&#xff0c;总是把密码设置的过于简单&#xff0c;导致用户账户的安全存在威胁。因此&#xff0c;为了提高用户账户的安全性&#xff0c;添加了一个Ja…

阿里云windows/Linux 服务器建站教程,附WordPress配置方法

声明&#xff1a;文章仅供学习使用&#xff0c;故采用了多处链接&#xff0c;如有侵权&#xff0c;请私信我&#xff0c;立删。 最近看到一个学长做的验证界面&#xff0c;很简单的两个文本输入框&#xff0c;但是能给我们群里的小伙伴们做题提供一个验证答案的途径&#xff0…

Maven修改默认仓库为阿里云仓库

Maven 仓库默认在国外&#xff0c; 国内使用难免很慢&#xff0c;我们可以更换为阿里云的仓库。 第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件&#xff0c;在 mirrors 节点上&#xff0c;添加内容如下&#xff1a; <mirrors><mirror><id>…

PHP语言结构详解

PHP语言结构 &#xff11;、语言结构释义   语言结构就是PHP语言的关键词&#xff0c;语言语法的一部分&#xff1b;   它不可以被用户定义或者添加到语言扩展或者库中&#xff1b;   它可以有也可以没有变量和返回值。 &#xff12;、为什么语言结构执行速度比函数快&…

查找算法——折半查找(JAVA)

折半查找 问题描述&#xff1a;给定一个整数X和整数A0&#xff0c;A1&#xff0c;A2……A(n-1)&#xff0c;后者已经预先排序并在内存中&#xff0c;求下标i使得Ai X &#xff0c;如果X不在数据中&#xff0c;则返回i -1。 我们首先可以想到的一种方法就是从左到右遍历&…

如何正确的检测对象类型?

在 javascript 中&#xff0c;我们常常用 typeof 运算符来检测对象的类型&#xff0c;在使用 typeof 检测引用类型的存储值会出现一个问题&#xff0c;无论引用的是什么类型的对象&#xff0c;它都会返回 "object"。这个时候我们往往会使用 instanceof instanceof 可…

PHP基于phpqrcode类生成二维码

使用ThinkPHP框架引入phpqrcode类生成二维码后&#xff0c;发现每次必须通过TP框架生成&#xff0c;略显繁琐&#xff0c;打算写一个简单的方法&#xff0c;然后运行php后直接批量生成二维码。方法也简单&#xff0c;直接写个PHP脚本&#xff0c;然后引入phpqrcode类&#xff0…