慢查询优化:
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命令
在写自动运行的脚本时,不管脚本有多简单,都需要考虑失败的处理方法
网友评论