# 开发准备
首先打开`Xfce终端`,启动服务
启动 php7.2-fpm:
~~~
$ sudo service php7.2-fpm start
~~~
配置 nginx:
~~~
$ sudo vim /etc/nginx/sites-available/default
~~~
修改相应的配置:
~~~
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
#root /usr/share/nginx/html;
#root /var/www/laravel/public;
root /home/shiyanlou/Code;
.
.
.
~~~
然后重启 nginx:
~~~
$ sudo service nginx reload
~~~
进入`/home/shiyanlou/Code`目录
~~~
$ cd /home/shiyanlou/Code
~~~
为了开发的便利,修改`Code`目录的权限
~~~
$ sudo chmod -R 777 /home/shiyanlou/Code
~~~
在目录`/home/shiyanlou/Code`下,下载`phpqrcode.zip`和`logo.jpg`。
* 下载`phpqrcode`
~~~
$ wget http://labfile.oss.aliyuncs.com/courses/991/phpqrcode.zip
~~~
* 下载 logo
~~~
$ wget http://labfile.oss.aliyuncs.com/courses/991/logo.jpg
~~~
* 解压`phpqrcode.zip`
~~~
$ unzip phpqrcode.zip
~~~
## 三、实验步骤
解压后得到`phpqrcode`文件夹,文件包含`phpqrcode.php`,我们需要使用`phpqrcode.php`里面的`QrCode`类的`png`方法。
通过编辑器`brackets`打开文件夹`/home/shiyanlou/Code`然后查看在`phpqrcode`文件夹下的`phpqrcode.php`文件的 3091 行(跳转指定行快捷键:ctrl + G,然后输入 3091 后回车)
~~~
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
{
$enc = QRencode::factory($level, $size, $margin);
return $enc->encodePNG($text, $outfile, $saveandprint=false);
}
~~~
函数参数的详细说明:
| 参数 | 含义 |
| --- | --- |
| text | 二维码的url |
| outfile | 不生成图片文件,默认为false |
| level | 控制二维码容错率,默认为L,范围:L、M、Q、H |
| size | 生成图片的大小,默认为4,范围:1-10 |
| margin | 生成二维码的空白区域大小 |
| saveandprint | 保存二维码图片并显示出来,$outfile必须传递图片路径 |
1. 使用`brackets`,在`Code`下,创建新文件`qrcode1.php`(实现生成原始的二维码)
`编辑`文件`/home/shiyanlou/Code/qrcode1.php`下
~~~
<?php
include "./phpqrcode/phpqrcode.php";
$url="http://www.shiyanlou.com";
$path = false;
$level = "L";
$size = 10;
$margin = 2;
$qrcode = new Qrcode();
$qrcode->png($url, $path, $level, $size, $margin);
?>
~~~
通过在线环境的`火狐浏览器`,输入`localhost/qrcode1.php`![此处输入图片的描述](https://doc.shiyanlou.com/document-uid572534labid4088timestamp1511947131040.png)
此时可以打开你的手机,扫描这个二维码,进入[实验楼首页](https://www.shiyanlou.com/)。
2. 接下来添加新功能:保存图片文件并输出图片
使用`brackets`,在`Code`下,创建新文件`qrcode2.php``编辑`文件`/home/shiyanlou/Code/qrcode2.php`
~~~
<?php
include "./phpqrcode/phpqrcode.php";
$url="http://www.shiyanlou.com";
$path = 'shiyanlou.png';
$level = "L";
$size = 10;
$margin = 2;
$qrcode = new Qrcode();
$qrcode->png($url, $path, $level, $size, $margin);
//保存二维码,并输出显示
$QR = imagecreatefromstring(file_get_contents($path));
imagepng($QR, 'shiyanlou.png');
imagedestroy($QR);
echo '<img src="shiyanlou.png" alt="请扫码">';
?>
~~~
通过在线环境的`火狐浏览器`,输入`localhost/qrcode2.php`![此处输入图片的描述](https://doc.shiyanlou.com/document-uid572534labid4088timestamp1511948507813.png)
可以查看生成了图片`shiyanlou.png`![此处输入图片的描述](https://doc.shiyanlou.com/document-uid18510labid4088timestamp1514517999788.png)
3. 最后实现在二维码上添加 logo
先把前面生成的`shiyanlou.png`删除
~~~
$ rm shiyanlou.png
~~~
使用`brackets`,在`Code`下,创建新文件`qrcode3.php``编辑`文件`/home/shiyanlou/Code/qrcode3.php`
~~~
<?php
include "./phpqrcode/phpqrcode.php";
$url="http://www.shiyanlou.com";
$path = 'shiyanlou.png';
$level = "L";
$size = 10;
$margin = 2;
$qrcode = new Qrcode();
$qrcode->png($url, $path, $level, $size, $margin);
$logo = 'logo.jpg'; // 中间的logo图片
$QR = $path;
if(file_exists(@$logo) && $path !== false){
// 从字符串中的图像流新建图像
$QR = imagecreatefromstring(file_get_contents($QR));
$logo = imagecreatefromstring(file_get_contents($logo));
// 获取 QR 的宽高
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
// 获取 logo 的宽高
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
//获取二维码上的 logo 宽
$logo_qr_width = $QR_width / 5;
// 获取缩小比例
$scale = $logo_width / $logo_qr_width;
//获取等比例二维码上的 logo 高
$logo_qr_height = $logo_height / $scale;
// 获取 logo 在二维码上的开始的坐标点
$start_xy = ($QR_width - $logo_qr_width) / 2;
// 把 logo 拷贝到 QR 上
imagecopyresampled($QR, $logo, $start_xy, $start_xy, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
$last = 'logo_'.$path;
//保存带 logo 的二维码
imagepng($QR, $last);
imagedestroy($QR);
imagedestroy($logo);
}
//如果存在logo就显示带logo的二维码,否则就显示原始二维码
if(file_exists(@$last)){
echo "<img src='$last' alt='请扫码'>";
}else{
echo "<img src='$path' alt='请扫码'>";
}
~~~
关于bool imagecopyresampled 的说明:`bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )`
| 参数 | 含义 |
| --- | --- |
| dst\_image | 新建的图片 |
| src\_image | 需要载入的图片 |
| dst\_x | 设定需要载入的图片在新图中的x坐标 |
| dst\_y | 设定需要载入的图片在新图中的y坐标,x,y同为 0 则从左上角开始 |
| src\_x | 设定载入图片要载入的区域x坐标 |
| src\_y | 设定载入图片要载入的区域y坐标,x,y同为 0 则从左上角开始 |
| dst\_w | 设定载入的原图的宽度(在此设置缩放) |
| dst\_h | 设定载入的原图的高度(在此设置缩放) |
| src\_w | 原图要载入的宽度 |
| src\_h | 原图要载入的高度 |
通过在线环境的`火狐浏览器`,输入`localhost/qrcode3.php`
![此处输入图片的描述](https://doc.shiyanlou.com/document-uid18510labid4088timestamp1514518249996.png)
生成了原二维码`shiyanlou.png`和带有 logo 的二维码`logo_shiyanlou.png`![此处输入图片的描述](https://doc.shiyanlou.com/document-uid18510labid4088timestamp1514518183363.png)
## 四、实验总结
二维码的生成,到此就结束了。二维码在实际使用中的场景很多,大家可以在掌握了二维码的生成后,根据自己的能力进行一些扩展训练。将它使用在一些具体的项目中。
## 五、课后扩展
如何在框架中用`phpqrcode`生成二维码。 这里我给出 laravel 5.5 LTS 版本的代码。有兴趣的同学可以在环境中试一试。`laravel 5.5`的开发环境已经配置好了,在目录`/home/shiyanlou/Code/myweb`下。
配置 nginx
~~~
$ sudo vim /etc/nginx/sites-available/default
~~~
修改相应配置
~~~
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
#root /usr/share/nginx/html;
#root /var/www/laravel/public;
root /home/shiyanlou/Code/myweb/public;
.
.
.
~~~
然后重启 nginx
~~~
$ sudo service nginx reload
~~~
进入`myweb`目录
~~~
$ cd myweb
~~~
执行 composer 下载`aferrandini/phpqrcode`
由于国内网络原因,有时候 Composer 安装会花费很多时间,甚至出错。 这里推荐使用 Packagist / Composer 中国全量镜像 来加速 Composer 的操作。
我们只需要修改 Composer 的全局配置文件即可:
~~~
composer config -g repo.packagist composer https://packagist.phpcomposer.com
~~~
> 此步需要链接外网,非会员用户请在本地就行扩展练习。
~~~
$ composer require aferrandini/phpqrcode
~~~
![此处输入图片的描述](https://doc.shiyanlou.com/document-uid572534labid4088timestamp1513840846272.png)
再执行命令生成控制器`QrcodeController`
~~~
$ php artisan make:controller QrcodeController
~~~
先进入目录`public`
~~~
$ cd public
~~~
下载
~~~
$ wget http://labfile.oss.aliyuncs.com/courses/991/logo.jpg
~~~
`编辑`文件`app/Http/Controllers/QrcodeController.php`
~~~
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use PHPQRCode\QRcode;
class QrcodeController extends Controller
{
public function show()
{
return view('qrcode');
}
public function create()
{
$url="http://www.shiyanlou.com";
$path = 'shiyanlou.png';
$level = "L";
$size = 10;
$margin = 2;
$qrcode = new QRcode();
$qrcode->png($url, $path, $level, $size, $margin);
$logo = 'logo.jpg'; // 中间的logo图片
$QR = $path;
if(file_exists(@$logo) && $path !== false){
$QR = imagecreatefromstring(file_get_contents($QR));
$logo = imagecreatefromstring(file_get_contents($logo));
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width - $logo_qr_width) / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
header('Content-type:image/png');
imagepng($QR);
imagedestroy($QR);
imagedestroy($logo);
}
}
}
~~~
再`编辑`文件`routes/web.php`(添加新的路由)
~~~
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('qrcode', 'QrcodeController@show');
Route::get('qrcode/create', 'QrcodeController@create');
~~~
创建文件并编辑`resources/views/qrcode.blade.php`
~~~
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>二维码展示</title>
</head>
<body>
<h1>二维码展示:</h1>
<img src="{{url('qrcode/create')}}" alt="请扫码">
</body>
</html>
~~~
最后在浏览器输入地址`localhost/qrcode`![此处输入图片的描述](https://doc.shiyanlou.com/document-uid572534labid4088timestamp1513842033269.png)
- 服务器购买到搭建宝塔
- 结构规范
- php基础
- php简介
- php是什么
- PHP 能做什么
- PHP 如何运行
- 如何了解弱语言
- 安装环境
- 安装LNMP
- 宝塔
- phpstudy
- PHP基本语法
- PHP 标记
- 从 HTML 中分离
- 指令分隔符
- 注释
- php 数据类型
- 类型检测
- 四种标量类型
- boolean(布尔型)
- Integer 整型
- Float 浮点型
- String 字符串类型
- 两种复合类型
- array(数组)
- object(对象)
- 两种特殊类型
- resource(资源)
- NULL(无类型)
- 类型转换
- 变量
- 变量定义和命名规范
- 传值和引用
- 预定义变量
- php预定义变量
- $_SERVER详解
- 变量范围
- 全局变量
- 静态变量
- 可变变量
- 常量
- 常量简介
- 常量定义
- 相比变量
- 魔术常量
- 运算符
- 运算符简介
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 错误控制运算符
- 执行运算符
- 递增(减)运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 新增操作符
- 控制结构
- 控制简介
- if 语句
- while 语句
- for 语句
- foreach 语句
- break 语句
- continue 语句
- switch 语句
- declare 语句
- return 语句
- include 语句
- PHP 函数
- 函数简介
- 用户自定义函数
- 函数的参数
- 返回值
- 可变函数
- 内部函数
- 匿名函数
- PHP 的类和对象
- PHP 的类和对象简介
- 基本概念
- 对象继承
- 属性
- 类常量
- 自动加载对象
- 构造和析构函数
- 访问控制
- 范围解析操作符(::)
- 静态static
- Static 关键字
- 抽象类
- 接口
- 匿名类
- 面向对象其他特性
- const关键字
- final关键字
- abstract用于定义抽象方法和抽象类。
- self、$this、parent::关键字
- 接口(interface)
- trait关键字
- instanceof关键字
- 魔术方法
- 构造函数和析构函数
- 私有属性的设置获取
- __toString()方法
- __clone()方法
- __call()方法
- 类的自动加载
- 会话控制
- cookie
- PHP 操作 cookie
- 项目实战
- SESSION
- Session 的初步介绍与实验准备
- PHP 操作 session
- 项目实战2
- http
- 特点
- 工作过程
- request
- response
- HTTP状态码
- URL
- GET和POST的区别
- HTTPS
- 常用函数
- 常用的字符串函数
- 常用的数组函数
- 常用文件函数
- 常用时间函数
- 常用日历函数
- 常用url函数
- 面试题常见
- 时间戳
- 技术类文档
- 技术开发文档
- 开发环境
- 开发规范
- 注释规范
- 开发目录结构
- 数据库字典
- 路由
- 定时任务
- 获取系统配置
- 系统常用函数
- 后台表单
- 消息队列
- 第三方类库标注
- 需求文档
- 数据库
- MYSQL
- 事务(重点)
- 索引
- 存储过程
- 触发器
- 视图
- 导入导出数据库
- 优化mysql数据库的方法
- MyISAM与InnoDB区别
- 外连接、内连接的区别
- 物理文件结构
- MongoDB
- Redis
- 运用场景和实例
- pgsql
- 服务器
- Nginx
- 正向代理和反向代理
- 负载均衡
- Linux常用命令
- 基本目录和命令
- php开发工具
- phpStorm编辑器
- 安装和汉化
- 链接ftp
- 常用操作
- 常用快捷键
- 自定义快捷键
- 使用快捷键新建目录和文件
- 使用快捷键快速查找文件、类、方法
- 多文件切换
- 快速搜索设置项
- 多点编辑
- 方法重构
- 自定义文件模板和代码片段
- 自定义文件模板
- 自定义代码片段
- Xdebug 调试插件
- 安装Xdebug 调试插件
- 在PHPStorm 中使用 Xdebug 插件调试代码
- Vi Box虚拟机
- Vi Box 虚拟机 Oracle VM VirtualBox
- 虚拟机辅助工具一-Vagrant
- 华硕主板BIOS设置中VT虚拟化技术选项怎么开启 Oracle VM VirtualBox
- 沟通工具
- 文档分享
- 流程图
- 任务分配
- 代码托管
- 缺陷管理
- 设计图
- gitLab
- 安装
- 汉化
- Gitlab 用户和项目管理
- Gitlab 持续集成与自动构建实践
- PHP进阶
- 大流量解决方案
- PSR规范
- RESTFUL规范
- 设计模式
- 单例模式
- 策略模式
- 工厂模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 外观模式
- 享元模式
- 代理模式
- 命令模式
- 中介者模式
- 观察者模式
- 状态模式
- 建筑者模式
- 适配器模式
- 桥接模式
- 装饰器模式
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希尔排序算法
- 选择排序算法
- 快速排序算法
- 常见网络攻击类型
- CSRF攻击
- XSS攻击
- SQL注入
- Cookie攻击
- thinkphp
- thinkphp5命令行
- git
- Git 常用命令操作和基础学习
- 傻瓜与白痴的笔记本
- 学习
- 一、Git 与 GitHub 的来历
- 二、在 GitHub 上创建仓库
- 三、安装
- Windows 上安装 Git
- 安装2
- 四、克隆 GitHub 上的仓库到本地
- 五、GIT基本操作哦
- 六、Git 分支操作
- 一、添加SSH关联授权
- 二、为 Git 命令设置别名
- 三、Git 分支管理
- 七、多人协作 GitHub 部分
- 八、多人协作 Git 部分
- 九、Git tag 和 GitHub releases
- composer
- Composer 基础使用
- 安装和使用
- 在项目中集成PHPmailer
- 认识composer.json和composer.lock文件
- composer的其他命令操作
- 本地创建composer包
- 提交自己的依赖包到composer Packagist
- crontab计划任务
- Linux任务计划crontab
- php 的 计划任务——Crontab
- bootstrap前端框架
- 入门
- 实战技巧
- 后台模板样式——admin
- 第三方接口对接
- 微信
- 敏感词过滤
- 微信图片检测
- 短信类型
- 阿里云短信
- 容联云短信
- 飞鸽短信
- 媒体
- 新闻接口测试
- 免费新闻
- 免费视频
- nba赛事,未测试
- 豆瓣电影接口
- 音乐接口
- 网易短视频接口
- 知乎微信接口
- 百度ai
- 百度语音
- 图片识别
- 腾讯
- 腾讯im
- 腾讯云直播
- 腾讯滑动验证
- 物流快递
- 快递鸟、快递100
- 推送
- 极光推送
- 地图&天气
- 获取城市和天气预报
- 地址获取和定位
- 地址转换经纬度
- 图片类型
- 360新闻图片
- 多平台翻译
- 实名认证
- 七牛云
- 云合同
- 多站点收录查询接口
- 打印机
- 第三方登录
- 微信登录
- 支付
- 支付宝app支付
- 微信提现+退款
- 微信app支付
- 微信支付公式
- 类库
- 图片类
- phpqrcode实战:生成二维码
- 图片处理类
- 验证码类
- 消息类
- PHPMailer
- 分词类
- ik
- PHPAnalysis
- 自己封装的方法
- GD库
- 自动获取图片主题颜色
- 图片转素描
- 生成海报
- 图片转字符
- 验证码
- 图片转黑白灰
- GD库实现图片水印与缩略图
- Imagick扩展
- 将一张image图片转化为字符串的形式
- 基本方法
- 图片路径转base64
- 生成文件后缀图片
- url路径判断拼接
- 防篡改入口文件
- php中文姓名判断
- 可控抽奖
- 特殊截取
- 银行卡位(特殊卡号不支持)
- 微信红包计算
- 数组和对象互转
- php批量更新修改数据库
- base64_img上传
- 删库删目录————跑路
- 字符串特殊符号过滤
- 首字母转成默认头像
- 生成随机字符串
- 根据id转 邀请码
- 日志写入
- 字符串截取,超出显示省略号
- 清除html标签+清除html标签,字符串截取
- 计算时间差的函数和演示
- php判断路径是否是绝对路径,如果不是拼接至绝对路径
- sql 参数过滤
- php敏感词过滤
- 省市区分别截取
- 生成csv
- 无限极分类
- api接口返回封装的方法函数
- xml和数组互转
- 获取thinkph5下控制器和方法名
- 过滤
- 获取服务器信息
- php随机颜色
- 创建多级目录
- 推广码
- 跨域检测
- 二维码
- 文档类
- word
- PHPWord
- tcPdf
- MPDF
- dompdf
- FPDF、Fpdi类库
- excel
- PhpSpreadsheet导入
- phpExcel
- 时间
- PHP-农历+节气+节日等类库
- 时间类库
- 最好用的是人性化时间差
- 文件管理类
- 文件操作类
- 文件夹操作
- php操作ftp的类库
- curl
- 数据库操作类
- Db扩展函数
- 数据库备份
- 仿tp5的Db库
- 不常用mysql
- 自动生成数据库字典
- 字符串
- 字符串操作helper/Str
- 随机生成姓名
- 随机生成类
- php字符串类
- 中文转拼音的类库
- 分类
- 缓存
- 数据验证
- 身份证相关操作
- 安全类
- 表单生成类
- 自动生成表单,未完待续中