php 抓取网页生成图片(基于的二维码不上传到服务器页面的实现过程及应用)
优采云 发布时间: 2022-01-06 20:11php 抓取网页生成图片(基于的二维码不上传到服务器页面的实现过程及应用)
一、背景
要求是后台点击生成二维码,然后不上传二维码到服务器。我们需要将二维码返回首页并显示出来。
二、实现过程
1、生成二维码
这里使用的第三方是二维码。网上百度有很多教程,这里就不赘述了。可以参考链接生成二维码
函数索引($ctx){
require_once APP_PATH.'/classes/phpqrcode/phpqrcode.php';
$link_url="";
$level="L";
$size=6;
ob_start();
$QRcode = new QRcode();
$QRcode->png($link_url,false,$level,$size,2);
记录器::信息(base64_encode(ob_get_contents()));
$imageString =base64_encode(ob_get_contents());
记录器::信息($imageString);
ob_end_clean();
如果(ob_end_clean()){
logger::info('end clen');
}
$数据=数组(
'代码'=> 2,
'二维码'=>$imageString
);
header("content-type:application/json; charset=utf-8");
!!!(上面这行代码肯定有,因为Qrcode::png(),在生成二维码的时候,内部把响应的响应类型改为image/jpeg,所以需要自己手动设置响应头类型,否则接口不能返回json数据)
返回 $data;
}
现在要实现的效果是通过接口将二维码路径返回给前端。
这里需要明确的是,png() 方法返回的是一个二进制图像流。所以直接返回是没用的。如果我们打印返回值,我们会发现返回值为空。所以这里使用ob_start()来执行一系列使用缓冲区的操作。
将二维码路径返回给前端。
这里需要明确的是,png() 方法返回的是一个二进制图像流。所以直接返回是没用的。如果我们打印返回值,我们会发现返回值为空。所以这里使用ob_start()来执行一系列使用缓冲区的操作
1. 第一个参数$text就是上面代码中的URL参数。
2. 第二个参数$outfile默认为No,不生成文件,只返回二维码图片,否则需要生成生成的二维码图片的存放路径
3. 第三个参数$level默认为L,这个参数可以传递的值为L(QR_ECLEVEL_L, 7%), M(QR_ECLEVEL_M, 15%), Q(QR_ECLEVEL_Q, 25%), H(QR_ECLEVEL_H, 30%)。该参数控制二维码的容错率,不同的参数表示二维码可以覆盖的面积百分比。利用二维码的容错率,我们可以将头像放置在生成的二维码图片的任意区域。
4. 第四个参数$size,控制生成图片的大小,默认为4
5. 第五个参数 $margin 控制生成二维码的空白区域的大小
6. 第六个参数$saveandprint,保存二维码图片并显示,$outfile必须传递图片路径。
第二个参数默认为false,该方法返回一个二进制图像流。当页面输出时,缓冲区中生成的内容将从缓冲区发送到浏览器。所以在代码中,日志输出没有记录在日志中,内容输出也不需要使用echo。所以直接用base64_encode(QRcode::png)是没用的。
这里使用 ob_start() 方法打开输出缓冲区。所有输出信息都不会直接发送到浏览器,而是存储在输出缓冲区中。这里是将生成的图片流从buffer中保存到内存对象中,使用base64_encode将其转为编码后的字符串,通过json返回给页面。
php缓存区相关的操作函数如下。
一、 相关功能介绍:
1、Flush:刷新缓冲区的内容并输出。
函数格式:flush()
说明:这个功能经常用到,效率很高。
2、ob_start:打开输出缓冲区
函数格式:void ob_start(void)
注意:当缓冲区被激活时,所有来自 PHP 程序的非文件头信息都不会被发送,而是存储在内部缓冲区中。为了输出缓冲区的内容,可以使用ob_end_flush() 或flush() 来输出缓冲区的内容。
3. ob_get_contents:返回内部缓冲区的内容。
如何使用:字符串 ob_get_contents(void)
说明:该函数将返回当前缓冲区的内容,如果输出缓冲区未激活,则返回FALSE。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:该函数将返回当前缓冲区的长度;像 ob_get_contents,如果输出缓冲区没有被激活。它返回 FALSE。
5、ob_end_flush:将内部缓冲区的内容发送到浏览器,并关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:该函数发送输出缓冲区的内容(如果有)。
6、ob_end_clean:删除内部缓冲区的内容并关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:该函数不会输出内部缓冲区的内容,而是将其删除!
7、ob_implicit_flush:开启或关闭绝对刷新
使用方法:void ob_implicit_flush([int flag])
注意:任何使用过 Perl 的人都知道 $|=x 的含义。该字符串可以打开/关闭缓冲区,ob_implicit_flush 函数与此相同。默认是关闭缓冲区。开启绝对输出后,每次脚本输出都是直接发送到浏览器,不需要调用flush()
原链接。