Laravel 模型间关系设置分表方法

在实际开发中经常用到分库分表,比如用户表分成 100 张,那么这个时候查询数据需要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法:

继续阅读“Laravel 模型间关系设置分表方法”

Laravel 依赖注入源码解析

在 Laravel 的控制器的构造方法或者成员方法,都可以通过类型约束的方式使用依赖注入,如:

这里 $request 参数就使用了类型约束,Request 是一个类:\Illuminate\Http\Request,表示参数必须是这个类或子类。

本文通过分析 Laravel 的源码,看为什么方法中不需要传入实例就可以直接使用 Request 呢?只是框架自动帮我们实例化并传参了。

继续阅读“Laravel 依赖注入源码解析”

为什么 Laravel 会重复执行同一个队列任务?

在 Laravel 中使用 Redis 处理队列任务,框架提供的功能非常强大,但是最近遇到一个问题,就是发现一个任务被多次执行,这是为什么呢?

先说原因:因为在 Laravel 中如果一个队列(任务)执行时间大于 60 秒,就会被认为执行失败并重新加入队列中,这样就会导致重复执行同一个任务。

继续阅读“为什么 Laravel 会重复执行同一个队列任务?”

Laravel Redis 多个进程同时取队列问题

开启多个进程处理队列会重复读取 Redis 中队列吗?是否因此导致重复执行任务?

使用 Supervisor 监听 Laravel 队列任务,其中 Supervisor 的配置如下:

注意 numprocs = 8,代表开启 8 个进程来执行 command 中的命令。

继续阅读“Laravel Redis 多个进程同时取队列问题”

使用 Laravel 消息队列要注意的问题

使用 Laravel 的消息队列处理异步任务,Redis 作为队列数据库,Supervisor 监控脚本异常中断并自动重启,这是 Laravel 处理队列任务的标准流程,但是实际中可能还会出现各种各样的问题,为了保证系统可靠性,还要注意几个问题。

一、执行失败重试次数设置

一定要设置任务执行失败重试次数,避免无限失败重试,超过重试次数 Laravel 会默认写到失败任务表中,也可以自己写执行失败后续处理逻辑。

继续阅读“使用 Laravel 消息队列要注意的问题”

Laravel Sessionid 处理机制

在 Laravel 的配置文件 config/session.php 中可以设置 Session Cookie Name,比如这个项目中设置名称为“sns_session”:

我们可以看到刷新页面,查看 cookie,会发现一个名称为 sns_session 的 cookie,名字就是我们自定义的。

这个 sessionid 就是 cookie 和 session 联系的桥梁,服务器通过这个 sessionid 判断来自哪个客户端的请求。

继续阅读“Laravel Sessionid 处理机制”

在 Laravel 中设置 Etag 缓存

本文介绍浏览器缓存 Etag 的概念,和客户端服务器如何生成和比较 Etag 的过程,以及使用 Laravel 中间件的示例。

什么是“ETag”?

Etag 是一种标识,一般附带在响应头部中,值是页面内容的哈希值,用来判断资源(页面,json,xml)有没有修改,如果没有修改,就返回 304 状态码,有修改则生成新的 Etag 值。

浏览器根据状态码判断是否缓存过期。

继续阅读“在 Laravel 中设置 Etag 缓存”

Laravel 关联查询返回错误的 id

在 Laravel Eloquent 中使用 join 关联查询,如果两张表有名称相同的字段,如 id,那么它的值会默认被后来的同名字段重写,返回不是期望的结果。例如以下关联查询:

继续阅读“Laravel 关联查询返回错误的 id”