1 | nginx |
使用macro扩展laravel
使用宏(Macro)来扩展 Laravel 的数据库请求构建器
英文原文 / 翻译 / 3259 / 3 / 发布于 1年前
file
习惯了编写 SQL 语句的开发人员可能对 Laravel 的 ORM / Query Builder 并不是很了解。 当我们在需要用到查询构造器没有实现的方法时,通常会使用 select(DB::raw(…)) 来组装 SQL 表达式。
现在我们可以使用 Laravel 的 “Macros” 以更加灵活的方式来编写这些语句。 我将要执行的操作命名为 “insertOrUpdateMany” ,它将使用单个方法来构建和执行自定义 SQL 语句。
定义宏:
为了保证代码的清晰可读性,我将绑定到宏的查询生成器实例和回调的参数 “$rows” 传递到一个新的宏实例。
use Illuminate\Database\Query\Builder;
use App\Macros\InsertOrUpdateMany;
Builder::macro(‘insertOrUpdateMany’, function(array $rows){
return with(new InsertOrUpdateMany($this, $rows))->execute();
});
我们可以将这些定义放在 Laravel 的服务提供者里。
使用 Macro
我们的 Macro 功能类似于 Laravel 自带的 insert() 函数,返回结果是数据库影响的行数:
$affectedRowCount = DB::table(‘users’)->insertOrUpdateMany(array(
array(
‘id’ => 1,
‘name’ => ‘Test 1’,
‘email’ => ‘test1@test.local‘,
‘password’ => ‘XXX’
),
array(‘id’ => 2,
‘name’ => ‘Test 2’,
‘email’ => ‘test2@test.local‘,
‘password’ => ‘XXX’
),
array(
‘id’ => 3,
‘name’ => ‘Test 3’,
‘email’ => ‘test3@test.local‘,
‘password’ => ‘XXX’
),
));
dd($affectedRowCount);
数据库查询类
数据库查询类 InsertOrUpdateMany 里将处理各种的 SQL 拼接和查询处理。类的构建函数里我们将获取到 Builder 和 PDO 连接,剩下的一切就变得很容易了,PDO 的 affectingStatement 直接就可返回数据库影响的行数。很容易吧,下面是完整的类代码:
InsertOrUpdateMany.php
builder = $builder; $this->entries = $entries; $this->pdo = $this->builder->getConnection()->getPdo(); $this->prepareValues(); $this->assembleStatement(); } /** * Prepare the values. * @return void */ private function prepareValues() { //获取 Columns Array $this->columnsArray = $this->getColumnsArray(); //构建 Columns 字串 $this->columnsString = $this->collapse($this->columnsArray); //构建数据 $this->valuesString = $this->collapse(array_map(function ($row) { return $this->encase($this->collapse($this->escape($row))); }, $this->entries)); //构建更新的字串 $this->updateString = $this->collapse(array_map(function ($value) { return "$value = VALUES($value)"; }, $this->columnsArray)); } /** * 组合 SQL 语句 * @return void */ private function assembleStatement() { $this->sql = "INSERT INTO {$this->builder->from} ({$this->columnsString}) VALUES {$this->valuesString} ON DUPLICATE KEY UPDATE {$this->updateString}"; } /** * 获取表结构数组 * @return array */ private function getColumnsArray() { return array_keys(reset($this->entries)); } /** * 处理数组 * @param array $values * @return array */ private function escape(array $values) { return array_map(function ($value) { return $value ? $this->pdo->quote($value) : 'NULL'; }, $values); } /** * 合并数组 * @param array $values * @return string */ private function collapse(array $values) { return implode(',', $values); } /** * 封装字串 * @param string $value * @return string */ private function encase(string $value) { return '(' . $value . ')'; } /** * 执行语句 * @return int */ public function execute() { return $this->builder->getConnection()->affectingStatement($this->sql); } }laravel获取表字段
1 | \DB::setDefaultConnection('jshop'); |
redis事务机制实现秒杀
1 | $client = new \Predis\Client(); |
laravel
EventServiceProvider
的$listen
编写监听文件
1 | /** |
队列要开启 php artisan queue:work redis
然后即可以
触发事件
1 | event(new CustomOrderPaid($customOrder)); |
CentOS7.4 搭建ngrok 内网穿透
CentOS7.4 搭建ngrok 内网穿透
Qin07 Qin07 发布于 2018/11/09 14:51 字数 632 阅读 8K 收藏 10 点赞 2 评论 0
ngrokCentOSLinux
#1、安装git
安装git
yum install git
#2、安装GO语言环境
安装GO语言环境
yum install golang
#检查下go的env环境变量
go env
#3、下载ngrok
github.com 下载 ngrok源码
cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
#4、生成证书
域名xxx.com 换成自己的
cd /usr/local/ngrok
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj “/CN=xxx.com” -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj “/CN=xxx.com” -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
#5、 拷贝证书覆盖ngrok原来的证书
过程会让你输入y 回车
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
编译生成服务端
编译生成服务端
cd /usr/local/ngrok/
GOOS=linux GOARCH=amd64 make release-server
编译生成客户端
32位linux客户端:
GOOS=linux GOARCH=386 make release-client
64位linux客户端:
GOOS=linux GOARCH=amd64 make release-client
#32位windows客户端:
GOOS=windows GOARCH=386 make release-client
#64位windows客户端:
GOOS=windows GOARCH=amd64 make release-client
#32位mac平台客户端:
GOOS=darwin GOARCH=386 make release-client
#64位mac平台客户端:
GOOS=darwin GOARCH=amd64 make release-client
#ARM平台linux客户端:
GOOS=linux GOARCH=arm make release-client
生成客户端文件位置
/usr/local/ngrok/bin
启动服务器端
cd /usr/local/ngrok/bin
./ngrokd -domain=”xxx.com” -httpAddr=”:800” -httpsAddr=”:801” -tunnelAddr=”:8443”
指定TLS证书和密钥
./ngrokd -tlsKey=”/path/to/tls.key” -tlsCrt=”/path/to/tls.crt” -domain=”xxx.com” -httpAddr=”:800” -httpsAddr=”:801” -tunnelAddr=”:8443”
客户端配置文件ngrok.yml
新建ngrok.yml
server_addr: xxx.com:8443
trust_host_root_certs: false
本地启动客户端
目录下打开命令行
然后使用以下任一命令运行ngrok:
ngrok -config ngrok.yml 8080
ngrok -config ngrok.yml -subdomain wx 8080 # 或者指定域名 wx.xxx.com
ngrok 加入系统服务 开机启动
vi /usr/lib/systemd/system/ngrok.service
在CentOS 7上利用systemctl添加自定义系统服务
[Unit]
Description=ngrok
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1min
ExecStart=/usr/local/ngrok/bin/ngrokd -domain=xqzgg.cn -httpAddr=:800 -httpsAddr=:801 -tunnelAddr=:8443 %i
ExecStop=/usr/bin/killall ngrok
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重载系统服务:
systemctl daemon-reload
设置开机启动
systemctl enable ngrok.service
启动服务
systemctl start ngrok.service
常用命令
#设置开机启动:
systemctl enable ngrok.service
#启动服务:
systemctl start ngrok.service
#停止服务:
systemctl stop ngrok.service
附带一份 nginx.conf 配置文件
ngrok
upstream ngrok {
server 127.0.0.1:800;
keepalive 64;
}
ngrok 穿透
server {
listen 80;
server_name *.xxx.com;
location / {
proxy_pass http://ngrok;
proxy_redirect off;
proxy_set_header Host $http_host:800;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 5s;
}
}
Supervisor配置文件
1 | [program:flask] |
1 | [program:da_tang_yun] |
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick Start
Create a new post
1 | $ hexo new "My New Post" |
More info: Writing
Run server
1 | $ hexo server |
More info: Server
Generate static files
1 | $ hexo generate |
More info: Generating
Deploy to remote sites
1 | $ hexo deploy |
More info: Deployment
Intervention image 中文文档
创建
- cache() 创建缓存的图像
- canvas() 创建一个新的空图像资源
- backup() 备份当前图像状态
- make() 创建新的图像资源
插入
- circle() 画一个圆
- ellipse() 绘制椭圆
- fill() 填充
- insert(mixed $source, string $position = ‘top-left’, int $x = 0, int $y = 0) 插入
- line() 画一条线
- pixel() 绘制单个像素
- polygon() 绘制多边形
- rectangle() 绘制一个矩形
- text() 插入文本
修改
- blur() 模糊图像
- brightness() 更改图像的亮度
- colorize() 更改图像的色彩平衡
- contrast()更改图像的对比度
- crop() 裁剪图像
- flip() 翻转
- gamma() 应用伽玛校正
- greyscale() 将图像转换为灰度版本
- fit() 合并裁剪和调整大小
- heighten() 按给定高度按比例调整图像大小
- invert() 反转图像的颜色
- mask() 对图像应用Alpha遮罩
- opacity() 设置图像的不透明度
- orientate() 自动调整图像方向
- pixelate() 将图像像素化
- reset() 重置图像实例
- resize() 调整当前图像的大小
- resizeCanvas() 调整图像边界大小
- rotate() 旋转图像
- sharpen() 锐化图像
- stream() 获取流
- trim() 修减掉图像的一部分
- widen() 按给定宽度按比例调整图像大小
获取
- encode() 编码图像
- exif() 从图像读取Exif数据
- filesize() 文件大小
- filter() 筛选器
- getCore() 读取图像的核心实例
- height() 获取图像的高度
- interlace() 切换隔行扫描模式
- iptc() 从图像读取IPTC元数据
- limitColors() 设置最大颜色数
- mime() 获取MIME类型
- pickColor() 从图像中挑选一种颜色
- response() 将图像附加到新的HTTP响应
- save() 保存
- width() 获取宽度
删除
- destroy() 销毁图像—释放内存
Sketch 快捷键
Insert 插入 | |
---|---|
New rtboard 新画板 | A |
Slice 切片 | S |
Rectangle 矩形 | R |
Rounded Rectangle 圆角矩形 | U |
Oval 椭圆形 | O |
Line 直线 | L |
Vector Point 路径 | V |
Pencil 铅笔 | P |
Text 文本 | T |
Type 字符 | |
---|---|
Bold 粗体 | Cmd + B |
Italic 斜体 | Cmd + I |
Underline 下划线 | Cmd + U |
Increase Font Size 放大字体 | Alt + Cmd (+) + |
Decrease Font Size 缩小字体 | Alt + Cmd (+) – |
Increase Character Spacing 放大字距 | Alt + Control + L |
Decrease Character Spacing 缩小字距 | Alt + Control + T |
Change Font 选择字体 | Cmd + T |
Convert Text to Outlines 将文本转换为大纲 | Shift + Cmd + O |
Align Left 左对齐 | Cmd + Shift + { |
Align Center居中对齐 | Cmd + Shift + |
Align Right 右对齐 | Cmd + Shift + } |
Special Characters 表情字符 | Control + Cmd + Space |
Table Relations 表关系
⌘ 3
Table Info 表信息
⌘ 4
Custom Query 自定义查询
⌘ 5
Table Triggers 表触发器
⌘ 6
General Shortcuts 常用快捷键
New Window (Connection File) 新窗口(连接文件)
⌘ N
New Tab(Connection File) 新标签(连接文件)
⌘ T
Add Connection To Favorites 添加连接到收藏夹
⇧ ⌘ A
Open (Connection File or SQL File) 打开(连接文件或者SQL文件)
⌘ O
Open current Connection File in New Window在新窗口打开当前连接
⌥ ⌘ O
Save (Connection File)保存(连接文件)
⌘ S
Save As (Connection File) 另存为(连接文件)
⇧ ⌘ S
Save Query保存查询
^ ⌘ S
Close (Connection File)关闭(连接)
⌘ W
Close All (Connection File) 关闭所有(连接)
⌥ ⌘ W
Print打印
⌘ P
Import 导入
⇧ ⌘ I
Show Console Window 显示控制台
⇧ ⌘ K
Clear Console 清空控制台
⌘ K
Back in History 后退
⌃ ⌥ ←
Forward in History 向前
⌃ ⌥ →
Select Next Tab 选择下一个标签
⌃ ⇥
Select Previous Tab 选择上一个标签
⌃ ⇧ ⇥
Insert NULL value 插入NULL
⌃ ⇧ N
Copy Create Table Syntax 复制创建表语法
⇧ ⌘ C
Show Create Table Syntax 显示创建表语法
⌥ ⌘ S
Refresh Databases 刷新数据库
⇧ ⌘ R
Choose Database 选择数据库
⇧ ⌘ D
Show Server Variables 显示服务器变量
⇧ ⌘ V
Show Server Processes 显示服务器进程
⌥ ⌘ P
Refresh Tables 刷新数据表
⌃ ⌘ R
Flush Privileges 刷新权限
⇧ ⌘ F
User Accounts… 用户账号
⌘ U
Copy selection / Copy selected row(s) 复制选择/复制选中的行
⌘ C
Copy selected row(s) with column names 复制选中的行包括列名
⌥ ⌘ C
Copy selected row(s) as SQL INSERT 复制选中的行包括插入语句
⌃ ⌥ ⌘ C
Show/Hide Toolbar 显示/隐藏工具栏
⇧ ⌘ T
Filter Table Content 过滤表内容
⌃ ⌘ F
Filter Tables 过滤表
⌃ ⌥ ⌘ F
Bundle Editor 构建编辑器
⌃ ⌥ ⌘ B
Navigator 导航
⌃ ⌥ ⌘ N
Select 选择
Select current word 选择当前单词
⌃ W
Select current line 选择当前行
⌃ L
Select enclosing brackets 选择括号内
⇧ ⌘ B
Select all 选择所有
⌘ A
Table Structure Tab 表结构标签
Add a new field 新增字段
⌥ ⌘ A
Delete selected field 删除所选字段
⌫
Duplicate selected field 选中字段的副本
⌘ D
Refresh table structure 刷新表结构
⌘ R
Edit table details 编辑表详情
⌘ 4
Table Content Tab 表内容标签
Add a new row 新增行
⌥ ⌘ A
Delete selected row(s) 删除选中行
⌫
Duplicate selected row 选中行的副本
⌘ D
Refresh table contents 刷新表内容
⌘ R
Custom Query Tab 自定义查询标签
Version 1.0 and later 1.0版本以后
Run all queries 运行所有查询
⌥ ⌘ R
Run current query or selection 运行当前或者选中查询
⌅ or ⌘ R
Versions 0.9.9.1 and earlier 1.0版本以前
Run all queries 运行所有查询
⌅ or ⌘ R
Run current query or selection 运行当前或者选中查询
⌥ ⌘ R
Shift line or selection rightwards 左缩进
⌘ [
Shift line or selection leftwards 右缩进
⌘ ]
(Un)Comment line or selection 注释选中行
⌘ /
(Un)Comment current query 注释当前查询
⌥ ⌘ /
Completion (narrow-down list / fuzzy search) 完成(模糊查询)
⎋
Insertion of an item 插入项目
↩ , ⇥ , Double-Click
Insertion full schema reference
⇧ + ↩ , ⇧ ⇥ , ⇧ Double-Click
Keep Window Open after Insertion 保存窗口打开后插入
holding down ⌃while insertion
Fuzzy Search 模糊查询
⌃ ⎋
Close Window 关闭窗口
⎋
Spell Checker Completion (narrow-down list) 拼写检查
F5
Select current query 选择当前查询
⌃ Y
Show MySQL help for current word or selection 显示当前单词或者选择的mysql帮助
⌃ H
Open query favorites popup menu 打开查询收藏夹弹窗
⌥ ⌘ F
Open query history popup menu 打开查询纪录弹窗
⌥ ⌘ Y
Insert previous history item (successively) 插入上一个语句(连续的)
⌃ + ↑
Insert next history item (successively) 插入下一个语句(连续的)
⌃ ↓
Show all database names as completion list 显示所有数据库名到补齐列表
⌥ ⌘ 1
Show all table and view names as completion list 显示所有表名到补齐列表
⌥ ⌘ 2
Show all table names from current database as completion list 显示当前数据库的所有表名到补齐列表
⌥ ⌘ 3