프로그래밍에서도 인용되는 경제학의 유명한 80-20 법칙이 있습니다. 성능 병목 현상의 80%는 코드의 20%에서 발생합니다. PHP의 XDebug 확장을 사용하면 이러한 20%의 코드를 효과적으로 찾을 수 있습니다.
1. 설치 및 구성
1. http://xdebug.org/
에서 PHP용 XDebug 확장을 다운로드합니다.
2. 🎜 >tar -xzf xdebug-2.0.0RC3.gz cd xdebug-2.0.0RC3 /usr/local/php/bin/phpize ./configure --enable-xdebug cp modules/xdebug.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/
참고: /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/다른 PHP 버전은 경로가 다르므로 이 경로에 배치할 필요가 없습니다. zend_extension_ts에서 xdebug.so의 위치를 지정할 수 있습니다.
vi /usr/local/php/lib/php.ini
php.ini를 수정하고, PHP 가속 모듈을 제거하고, XDebug 확장을 지원하도록 다음 구성 정보를 추가합니다.
[Xdebug] zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so" xdebug.profiler_enable=on xdebug.trace_output_dir="/tmp/xdebug" xdebug.profiler_output_dir="/tmp/xdebug" xdebug.profiler_output_name="script" mkdir -p /tmp/xdebug chmod 755 /tmp/xdebug chown www:www /tmp/xdebug /usr/local/apache/bin/apachectl -k restart
3. 클라이언트(Windows): WinCacheGrind 다운로드 주소: http:/ /sourceforge.net/projects/wincachegrind/
2. 분석 과정
1. 홈페이지에 있는 다양한 링크를 여러 번 클릭하면 / tmp/xdebug 디렉터리 다음 파일:
usr_local_apache_htdocs_app_checknum_chknum_php_cachegrind.out usr_local_apache_htdocs_app_login_showHeaderLogin_php_cachegrind.out usr_local_apache_htdocs_app_play_play_php_cachegrind.out usr_local_apache_htdocs_app_user_member_php_cachegrind.out usr_local_apache_htdocs_tag_tags_php_cachegrind.out usr_local_apache_htdocs_top_top_php_cachegrind.out
2. 위 파일을 Windows에 복사하고 클라이언트 소프트웨어 WinCacheGrind를 사용하여 각 파일을 열면 다음 PHP 프로그램이 실행하는 데 가장 오랜 시간이 걸리는 것으로 나타났습니다. :
/usr/local/apache/htdocs/tag/tags.php 耗时840ms
3. 분석결과 :
1./usr/local/apache/htdocs/tag/tags.php
(1) 시간 소모 가장 긴 filter_tags 함수는 /usr/local/apache/htdocs/tag/tags.php의 158행에 나타납니다.
$tags .= filter_tags($videos[$i]['tags'])." ";
(2) filter_tags 함수는 /에서 인용됩니다. usr/local/apache/htdocs /include/misc.php, getForbiddenTags 함수는 filter_tags 함수에 의해 21번 호출됩니다. filter_tags 함수에 소요되는 대부분의 시간은 getForbiddenTags 함수에 의해 발생합니다. getForbiddenTags 함수의 내용은 다음과 같습니다.
function getForbiddenTags() { $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt"; if(file_exists($tagsPath)) { $fp = fopen($tagsPath, "r"); $arrconf = array (); if ($fp) { while (!feof($fp)) { $line = fgets($fp, 1024); $line = trim($line); $rows = explode("#", $line); $coumns = explode("=", trim($rows[0])); if(""!=trim($coumns[0])) { $arrconf[trim($coumns[0])] = trim($coumns[1]); } } } return $arrconf; } }
(3) getForbiddenTags 함수를 분석해 보면 PHP 함수 Trim이 16827번 호출된 것으로 나타났습니다.
(4) 병목 현상의 가능한 원인:
필터링할 156개의 키워드는 /usr/local/apache/template에 한 줄씩 저장됩니다. /tags/forbidden_tags.txt 파일에서 텍스트 데이터베이스가 효율적이지 않습니다.
줄 단위 읽기 기능인 fgets와 문자열의 양쪽 공백이나 지정된 문자를 제거하는 기능인 Trim은 부하가 높은 경우 비효율적입니다. fopen, fread, 그리고 fscanf를 비교해보세요.