慢查询优化,异步队列,artisan自定义命令

慢查询优化:

1. 确定sql有没有使用索引,如果没有看是否需要加。

有时where条件中使用了in等条件,无法使用索引,可以试试强制使用索引

select * from table_name force index(index_name) where col in (1,2,3....)

有时由于查询量过大,而造成全表查询,可以试试利用where条件,使用foreach循环,虽然会多连接几次数据库,但是由于使用了索引,速度要比全部查询出来更快

2. 使用数组进行数据处理的时候,有时数据量过大,可以尝试扩大内存来支持

直接在代码中加:ini_set('memory_limit','150M');

上传和下载文件时,Web请求的操作时间过长,造成页面超时的优化

使用异步队列,页面正常返回成功或失败的信息,异步脚本处理数据

上传时,可以在log或者流水表中记录上传状态,目的是确保用户知道什么上传成功了,

下载时,由于不能在浏览器上实时下载,可以下载到固定的文件地址,再通过发邮件的方式发送给用户

注意要确定好队列发生异常时的处理机制,比如是否重试,是否需要通知其他人

php artisan queue:work --daemon --quiet --queue=default --delay=3 --sleep=3 --tries=3

--daemon  在supervisor中一般要加这个option, 可以节省cpu使用

--quiet  不输出任何内容

--delay=3  一个任务失败后,延长多长时间后重试,单位是秒。这个值的设定建议不要太短,因为一个任务失败(比如网络原因),重试时间太短可能会出现连续失败的情况

--sleep=3  去redis中拿任务的时候,发现没有任务,休息多长时间,单位是秒。这个值的设定要看任务是否紧急,如果是那种非常紧急的任务,不能等待太长时间

--tries=3  定义失败最多重试次数。这个值的设定根据任务的重要程度来确定,一般3次比较合适。

为什么使用队列,一般有这么几类任务使用队列:

耗时比较久的,比如上传一个文件后进行一些格式的转化等

需要保证送达率的,比如发送短信,因为要调用别人的api,总会有机率失败,那么为了保证送达,重试久必不可少

什么使用queue:listen? 什么使用queue:work?

官方文档已经不在更新queue:listen的使用,也就是说官方不怎么建议使用queue:listen,但在本地调试时可以使用queue:listen,因为queue:work在启动后,代码修改,queue:work不load代码,但是queue:listen会重新load代码。其余情况使用queue:work,因为效率更高。

artisan: 内置的命令操作行工具集,支持自定义命令

1. 创建命令类

系统自带命令make:command来创建自定义命令文件

php artisan make:command WelcomeMessage --command=welcome:message

该命令的第一个参数就是要创建的artisan命令类名,还可以传递一个选项参数--command用于自定义该命令的名称(不指定的话系统会根据类名自动生成)。执行完该命令后,会在app/Console/Command目录下创建一个WelcomeMessage.php文件。

2. 注册命令类

创建完artisan命令类后,还需要在app/Console/Kernel.php中注册才能使用

打开app/Console/Kernel.php,将新创建的命令类WelcomeMessage添加到$command完成注册:

protected $commands = [

    App\Console\Commands\WelcomeMessage::class

];

运行php artisan list就可以看到welcome:message命令

在写自动运行的脚本时,不管脚本有多简单,都需要考虑失败的处理方法

你可能感兴趣的:(慢查询优化,异步队列,artisan自定义命令)