>  기사  >  php教程  >  Poor Man PHP Profiler

Poor Man PHP Profiler

WBOY
WBOY원래의
2016-06-06 20:13:56961검색

说起 Profiler,老派的 PHP 程序员会选 XDebug,新派的 PHP 程序员会选 Xhprof,不过我们公司的服务器上都没装,于是我写了这个「Poor Man PHP Profiler」。 既然不用 XDebug 和 Xhprof,我们就要自己找 Profiler 的数据源才行。好在 PHP 本身支持慢日志,而

说起 Profiler,老派的 PHP 程序员会选 XDebug,新派的 PHP 程序员会选 Xhprof,不过我们公司的服务器上都没装,于是我写了这个「Poor Man PHP Profiler」。

既然不用 XDebug 和 Xhprof,我们就要自己找 Profiler 的数据源才行。好在 PHP 本身支持慢日志,而且里面包含了调用栈信息,还包含了文件路径和具体的行号:

Slow

Slow

理论上不用写什么工具,把这个日志从前到后看一遍就能发现系统哪里慢,但我们人穷志不短,能通过工具提升一点效率总是好的。工具写起来其实很简单,大概思路:扫描日志,把数据汇总,看看哪一个文件的哪一行出现的次数多,八成就是短板所在(当然要除去一些公共的入口文件)。下面就是源代码:

#!/bin/bash
usage() {
    echo "Usage: $0 --log=<log>"
}
eval set -- $(
    getopt -q -o "h" -l "context:,log:,help" -- "$@"
)
while true; do
    case "$1" in
        --context) CONTEXT=$2; shift 2;;
        --log)     LOG=$2;     shift 2;;
        -h|--help) usage;      exit 0;;
        --)                    break;;
    esac
done
if [[ -z "$LOG" ]]; then
    usage
    exit 1
fi
C=${CONTEXT:-5}
awk '
    $1 ~ "0x" && $3 ~ "/" { files[$3]++ }
    END {
        for (file in files) {
            print files[file], file | "sort -nr"
        }
    }
' $LOG | while IFS=" " read count data; do
    IFS=":" data=($data)
    file=${data[0]}
    line=${data[1]}
    echo FILE: $file [COUNT: $count]
    cat -n $file | grep -P -C $C --color=always "^\s*$line\t.*"
    echo
done</log>

为了提升用户体验,我加了一些必要的色彩提示,最终的效果如下:

Profiler

Profiler

最后,需要提醒大家的是:因为要扫描慢日志,所以如果文件体积非常大的话,那么效率会很低下。建议定期切分日志,具体可以参考我以前写的:被遗忘的Logrotate。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.