LOADING

分类 PHP 下的文章

首先需要修改php-fpm配置文件
vim /etc/php-fpm.d/www.conf 一般修改vim /etc/php-fpm.conf即可
去掉request_slowlog_timeout 、slowlog的前缀分号';'
设置request_slowlog_timeout =2;

设置完毕
之后需要重启php-fpm
ps aux | grep php-fpm
获取到主进程号
菜皮.png

kill -USR2 第一个进程号 master 就可以了
然后去/var/log/php-fpm/www-slow.log (或者你自己设置的地方进行查看)

用的两张表关联主表 49609 副表 数据35352
首先是子查询的代码 用的laravel自带orm

$student = Student::doesntHave('hasBanjiStudents')->get();
//变成mysql语句是
select * from `tbl_students` where not exists (select * from `tbl_banji_students` where `tbl_students`.`id` = `tbl_banji_students`.`student_id`) and `tbl_students`.`deleted_at` is null
//耗时时间 0.270s

接下来有请join闪亮登场

 $student = Student::leftJoin('banji_students','students.id','=','banji_students.student_id')
                ->select('students.*','banji_students.banji_id')
                ->where('banji_students.banji_id',null)
                ->get();
//变成sql语句是
select `tbl_students`.*, `tbl_banji_students`.`banji_id` from `tbl_students` left join `tbl_banji_students` on `tbl_students`.`id` = `tbl_banji_students`.`student_id` where `tbl_banji_students`.`banji_id` is null and `tbl_students`.`deleted_at` is null
//耗时0.169s

上网查了一下, laravelorm基本都基于子查询, 而子查询在使用中会建立一张临时表进行数据排序等,而join则不会,所以子查询又慢又占用内存

$link_popular_record_false = Student::whereNotIn('id',$temp_link_popular)
                    ->whereIn('id',$rand_arr)
                    ->limit($limit-$link_count)
                    ->get();

//打印写法故意写错select
$link_popular_record_false = Student::whereNotIn('id',$temp_link_popular)
                    ->select('asdasd')
                    ->whereIn('id',$rand_arr)
                    ->limit($limit-$link_count)
                    ->get();

当数据库表中数据过3w之后inRandomOrder用起来就十分的慢还占用内存,现数据50w.
explan之后发现查询速度为0.32

解决方案

        $rand_arr = [];
        for ($i=0;$i<100;$i++){
            $rand_arr[] = mt_rand(500,10000);
        }
 $link_popular_record_false = Student::whereNotIn('id',$temp_link_popular)
                    ->whereIn('id',$rand_arr)
                    ->limit($limit-$link_count)
//                    ->inRandomOrder()
                    ->get();

用whereIn进行主键筛选就可以了 修改后查询效率为0.0026

今天在压测接口时发现一个接口总是报Failed requests,看log发现请求成功了,最终发现问题的原因是因为
接口里面有随机从数据库中提取数据,导致的长度不一致,不用理会即可,如果还想测就暂时把随机取数据关闭

Failed requests:        132
   (Connect: 0, Receive: 0, Length: 132, Exceptions: 0)

测试时出现的Failed requests原因分析:
Failed requests: 2303
(Connect: 0, Length: 2303, Exceptions: 0)
只要出现Failed requests就会多一行数据来统计失败的原因,分别有Connect、Length、Exceptions。
Connect 无法送出要求、目标主机连接失败、要求的过程中被中断。
Length 响应的内容长度不一致 ( 以 Content-Length 头值为判断依据 )。
Exception 发生无法预期的错误。

今天在业务中用ab进行压力测试,但是我发现400 400 的请求永远超过三秒,于是我在public/index.php直接echo 1;die;并且从0开始测试laravel框架的并发如何,我现在是用nginx laravel 5.6,从本地ab测试服务器 配置后续补上QQ截图20190419115847.png

首先是1 1
![$%_G]NVOR~`(~{5ONA_I%Q.png

10 10
QQ截图20190419115847.png

100 100
QQ截图20190419120222.png

200 200
QQ截图20190419120334.png

220 220
QQ截图20190419120533.png

300 300
QQ截图20190419143923.png

事实证明laravel也就200并发,上不去300如果不优化肯定是3秒开外了

array_multisort(array_column($redis,'praise_num'),SORT_DESC,$redis);

以redis中的praise_num 倒序排列

array_search($user_homework_id,array_column($redis,'id'));

查找user_homework_id 在redis中的key

1.修改laravel配置文件. configapp.php

   'log'=>'daily'

2.在项目目录中composer命令安装扩展:composer require arcanedev/log-viewer

3.安装成功后,需要在configapp.php 的providers阵列中注册服务

     Arcanedev\LogViewer\LogViewerServiceProvider::class

此时可以直接访问 http:://域名/log-viewer

需要改变route或者语言可以在log-viewer中的config配置

php artisan log-viewer:publish :运行此命令发布配置和翻译文件

git地址:https://github.com/ARCANEDEV/LogViewer/blob/master/_docs/1.Installation-and-Setup.md

需要注意 安装几个依赖, 最新版本互相可能不兼容, 选择最合适的就好

大日志会导致内存溢出, 建议小项目用