配置好nginx和php后发现php-error一直没有日志。google了一下终于搞定了,主要对php-fpm.conf和php.ini做出如下修改:

1.修改php-fpm.conf

修改php-fpm.conf也可能是pool.d下的www.conf的worker进程配置,将错误信息输出。默认情况下worker进程的错误日志会重定向到/dev/null

; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Note: on highloaded environement, this can cause some delay in the page
; process time (several ms).
; Default Value: no
catch_workers_output = yes

2.修改php.ini中配置

修改php.ini中配置,不让php将error信息输出到网页,而是输出到文件系统

display_errors Off
log_errors On
error_log /var/log/php/php_errors.log

现在就应该配置完成了,但是要注意php-fpm的worker进程要有日志文件的写权限。查看一下php-fpm worker进程的owner.

ps aux    |    grep php-fpm

比如我的系统,php-fpm master进程的owner为root,php-fpm worer进程的owner为www-data,对我而言只需要目录/var/log/php/的owner和group为www-data即可。

事情的起因是线上日志发现的mysql慢查询。100万数据量的标准,联合查询全部走索引的情况下,尽然要600多毫秒。很不解,但是将索引列由varchar(50)型改为bigint型后,数据提升了30倍。究其原因就索引树上搜索时要进行大量的比较操作,而字符串的比较比整数的比较耗时的多。

所以建议一般情况下不要在字符串列建立索引,如果非要使用字符串索引,可以采用以下两种方法:

1.只是用字符串的最左边n个字符建立索引,推荐n<=10;比如index left(address,8),但是需要知道前缀索引不能在order by中使用,也不能用在索引覆盖上。

2.对字符串使用hash方法将字符串转化为整数,address_key=hashToInt(address),对address_key建立索引,查询时可以用如下查询where address_key = hashToInt(‘beijing,china’) and address = ‘beijing,china’;