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 多个进程同时取队列问题”

Linux 中 bash 和 sh 的区别

使用 docker-compose,有的容器是 docker-compose exec workspace bash 进入,有的容器是 docker-compose exec php-worker sh 进入,bash 和 sh 是什么?有什么区别?

sh 和 bash 都是 Linux Shell 命令行语言,其中 sh 遵循 POSIX 标准。什么是 POSIX 标准?

Stack Overflow 上一篇答案讲的很详细,英文的慢慢看:

https://stackoverflow.com/questions/5725296/difference-between-sh-and-bash

MySQL 数据库设计及性能优化Tips

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。

注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节。另外MyISAM数据和索引是分开,而InnoDB的数据存储是按聚簇(cluster)索引有序排列的,主键是默认的聚簇(cluster)索引,因此MyISAM虽然在一般情况下,查询性能比InnoDB高,但InnoDB的以主键为条件的查询性能是非常高的。

继续阅读“MySQL 数据库设计及性能优化Tips”

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

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

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

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

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