Heim  >  Artikel  >  php教程  >  Poor Man PHP Profiler

Poor Man PHP Profiler

WBOY
WBOYOriginal
2016-06-06 20:13:56961Durchsuche

说起 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。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn