簡體   English   中英

找出PHP代碼減速的位置(性能問題)

[英]Find out where your PHP code is slowing down (Performance Issue)

這是我在SO的第一個問題。

我有一個我公司的內部申請,我最近要求維護。 這些應用程序是用PHP構建的,它的編碼相當好(OO,DB Abstraction,Smarty),沒有WTF-ish。

問題是應用程序非常慢

我如何找出減緩應用程序速度的因素? 我已經優化了代碼,只進行了很少的數據庫查詢,所以我知道這是需要一段時間才能執行的PHP代碼。 我需要一些可以幫助我的工具,並且需要設計一個檢查我的代碼的策略。

我可以自己做檢查/策略工作,但我需要更多的PHP工具來弄清楚我的應用程序在哪里。

思考?

我最近在一個類似的情況下使用過XDebug分析 它輸出一個完整的配置文件報告,可以使用許多常見的配置文件應用程序讀取(雖然不能給你一個列表,我只使用了slackware附帶的那個)。

正如Juan所說,xDebug很棒。 如果你在Windows上, WinCacheGrind會讓你查看報告。

觀看Rasmus Lerdorf(PHP的創建者)的演講。 他介紹了一些測試PHP速度和尋找內容的好例子,以及一些可以減慢速度的內部組件。 XDebug是他使用的一種工具。 他還非常清楚地了解您使用框架獲得的性能成本。

視頻: http//www.archive.org/details/simple_is_hard

幻燈片(因為很難在視頻中看到): http//talks.php.net/show/drupal08/1

有許多變量會影響應用程序的性能。 我建議您不要立即假設PHP是問題所在。

首先,你如何服務PHP? 您是否嘗試過Apache或IIS本身的基本優化? 服務器是否忙於處理其他類型的請求? 你有沒有利用PHP代碼加速器 測試服務器是否是您的瓶頸的一種方法是嘗試在另一台服務器上運行該應用程序。

第二,整個應用程序的性能是否緩慢,或者它似乎只影響某些頁面? 這可以為您提供從何處開始分析性能的指示。 如果整個應用程序運行緩慢,則問題更可能發生在底層服務器/平台或全局SQL查詢中,該查詢是每個請求的一部分(例如,用戶身份驗證)。

第三,您提到最小化SQL查詢的數量,但是優化現有查詢呢? 如果您使用的是MySQL,您是否正在利用每個存儲系統的各種優勢? 您是否對最重要的查詢運行EXPLAIN以確保它們已正確編入索引? 這對於訪問大表的查詢至關重要; 數據集越大,您就越會注意到索引不良的影響。 幸運的是,有很多這樣的文章解釋了如何使用EXPLAIN。

第四,一個常見的錯誤是假設您的數據庫服務器將自動使用系統可用的所有資源。 您應該檢查以確保已為數據庫應用程序顯式分配了足夠的資源。 例如,在MySQL中,您需要為密鑰緩沖區,臨時表大小,線程並發,innodb緩沖池大小等內容添加自定義設置(在my.cnf文件中)。

如果您已經仔細檢查了上述所有內容並且仍然無法找到瓶頸,那么像Xdebug這樣的代碼分析器肯定會有所幫助。 就個人而言,我更喜歡Zend Studio分析器,但它可能不是最好的選擇,除非你已經利用了Zend Platform堆棧的其余部分。 但是,根據我的經驗,PHP本身很少是導致性能下降的根本原因。 通常,代碼分析器可以幫助您更准確地確定哪些數據庫查詢應該受到責備。

您也可以使用APD (高級PHP調試器)。

它很容易使它工作。

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

有一個很好的教程如何編譯APD並使用它進行分析: http//martinsikora.com/compiling-apd-for-php-54

phpED( http://www.nusphere.com/products/phped.htm )還提供了出色的調試和分析功能,以及在PHP代碼中添加監視,斷點等功能。 集成的分析器直接在IDE中提供每個函數調用和類方法的時間細分。 瀏覽器插件還可以與Firefox或IE快速集成(即使用瀏覽器訪問慢速URL,然后單擊按鈕進行配置或調試)。

在指出應用程序速度慢的地方以便集中大部分編碼工作時,它非常有用; 它避免浪費時間優化已經很快的代碼。 嘗試過Zend和Eclipse后,我現在已經賣掉了phpED的易用性。

請記住,在對Web服務器進行調試時,Xdebug和phpED(使用DBG)都需要安裝額外的PHP模塊。 phpED也提供(未經我未嘗試過)本地調試選項。

Xdebug簡介絕對是您要走的路。 另一個提示 - WincacheGrind很好,但最近沒有更新。 http://code.google.com/p/webgrind/ - 在瀏覽器中可能是一種簡單快捷的選擇。

盡管如此,它仍然是數據庫。 檢查相關索引 - 並且它有足夠的內存來盡可能多地緩存工作數據。

ifs是一個很大的代碼庫,如果你還沒有嘗試apc。

http://pecl.php.net/package/APC

你也可以嘗試在php中使用register_tick_function函數。 它告訴php在你的代碼中調用某個函數。 然后,您可以跟蹤當前正在運行的功能以及呼叫之間的時間量。 然后你可以看到花費最多的時間。 http://www.php.net/register_tick_function

如果服務器性能下降是導致應用程序處理速度緩慢的原因,您還可以查看HA代理或任何其他負載平衡解決方案。 服務器。

我們使用Zend Development Environment(windows)。 我們昨天解決了內存使用率峰值,在運行Process Explorer時逐步調試調試器,以便在執行每一行時觀察內存/ CPU /磁盤活動。

Process Explorer: http//technet.microsoft.com/en-us/sysinternals/bb896653.aspx

ZDE包括一個基本的性能分析器,可以顯示頁面請求期間每個函數調用所花費的時間。

我使用PEAR Benchmarklog4php的組合。

在我想要配置文件的頂部,我創建了一個包裝Benchmark_Timer對象的對象。 在整個代碼中,我添加了$object->setMarker("name"); 調用,尤其是可疑代碼。

包裝類有一個destroy方法,它接收日志信息並將其寫入log4php。 我通常將此發送到syslog(許多服務器,聚合到一個服務器上的一個日志文件)。

在調試中,我可以查看日志文件,看看我需要改進的地方。 稍后在生產中,我可以解析日志文件並進行性能分析。

它不是xdebug,但它始終打開並且讓我能夠比較代碼的任何兩次執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM