[TOC]
# 安裝
本節介紹如何安裝Xdebug。
## 預編譯的Windows模塊
有一些適用于Windows的預編譯模塊,它們都適用于PHP的非調試版本。您可以在[下載](https://xdebug.org/download.php)頁面獲取這些內容。按照[這些說明](https://xdebug.org/wizard.php)安裝Xdebug。
## PECL安裝
從Xdebug 0.9.0開始,您可以通過PEAR/PECL安裝Xdebug。這僅適用于PEAR版本0.9.1-dev或更高版本以及某些UNIX。
使用PEAR/PECL安裝非常簡單:
```bash
# pecl install xdebug
```
你還需要在php.ini中添加正確的行:(不要忘記將路徑和文件名更改為正確的行 - 但請確保使用**完整路徑**)
```ini
zend_extension="/usr/local/php/modules/xdebug.so"
```
**注意:**您應該忽略任何提示將“extension = xdebug.so”添加到php.ini - 這將導致問題。
## 在Mac OS X上安裝
PHP可以從非官方的Mac OS X包管理器Homebrew中獲得。Homebrew建議使用PECL安裝Xdebug,因此請按照上面的說明通過PECL進行安裝。
## 從源碼安裝
您可以下載最新穩定版2.6.0的源代碼。或者你可以從GIT獲得Xdebug:
```bash
git clone git://github.com/xdebug/xdebug.git
```
這將檢查最新的開發版本,目前是2.7.0alpha1。您還可以在https://github.com/derickr/xdebug上瀏覽源代碼。
## 編譯
有一個向導可以為您提供要下載的正確文件以及要使用的路徑。
您可以從PHP的其余部分單獨編譯Xdebug。但請注意,您需要訪問腳本'phpize'和'php-config'。如果你的系統沒有'phpize'和'php-config',你需要首先從源tarball編譯和安裝PHP,因為這些腳本是PHP編譯和安裝過程的副產品。(Debian用戶可以使用`apt-get install php5-dev`安裝所需的工具)。由于PHP版本之間存在輕微但重要的差異,因此源版本與已安裝的版本匹配非常重要。一旦您可以訪問'phpize'和'php-config',請執行以下操作:
1. 解壓縮壓縮包:`tar -xzf xdebug-2.6.0.tgz`。請注意,您不需要在PHP源代碼樹中解壓縮包。如上所述,Xdebug是單獨編譯的。
2. `cd xdebug-2.6.0`
3. 運行phpize:phpize(如果phpize不在你的路徑中,則為`/path/to/phpize`)。確保使用屬于您要使用Xdebug的PHP版本的phpize。如果您在查找要使用的phpize時遇到一些問題,請參閱此FAQ條目。
4. `./configure --enable-xdebug`
5. `make`
6. `make install`
## 配置PHP以使用Xdebug
1. 將以下行添加到php.ini:`zend_extension ="/wherever/you/put/it/xdebug.so"`。對于早于5.3的PHP版本和PHP(Apache 2 worker MPM或ISAPI模塊)的線程使用,請添加:`zend_extension_ts ="/wherever/you/put/it/xdebug.so"`。注意:如果您自己編譯PHP并使用--enable-debug,則必須使用zend_extension_debug =。注意:如果要同時使用Xdebug和OPCache,則必須在OPCache之后加載Xdebug。否則,它們將無法正常工作。從PHP 5.3開始,您始終需要使用zend_extension PHP.ini設置名稱,而不是zend_extension_ts,也不需要使用zend_extension_debug。但是,您的編譯選項(ZTS /正常構建;調試/非調試)仍然需要與PHP使用的匹配。
2. 重啟您的網絡服務器。
3. 編寫一個調用'phpinfo()'的PHP頁面將其加載到瀏覽器中并查找Xdebug模塊上的信息。如果您在Zend徽標旁邊看到它,那么您已經成功了!如果你有PHP的命令行版本,你也可以使用'php -m',它列出了所有加載的模塊。Xdebug應該出現兩次(一次在'PHP Modules'下面,一次在'Zend Modules'下)。
## 兼容性
Xdebug不能與Zend Optimizer或任何其他處理PHP內部(DBG,APD,ioncube等)的擴展一起使用。這是由于這些模塊的兼容性問題。
## Debug客戶端安裝
解壓縮Xdebug源碼壓縮包并發出以下命令:
```bash
$ cd debugclient
$ ./configure --with-libedit
$ make
# make install
```
這將在/usr/local/bin中安裝debugclient二進制文件,除非您的系統上沒有安裝libedit。您可以安裝它,也可以省略'--with-libedit'選項進行配置。Debian'unstable'用戶可以使用`apt-get install libedit-dev libedit2`安裝庫。
如果configure腳本找不到libedit,并且您確定已正確安裝(并且它的標頭),并且您在configure.log中收到如下所示的鏈接錯誤:
```
/usr/lib64/libedit.so: undefined reference to `tgetnum'
/usr/lib64/libedit.so: undefined reference to `tgoto'
/usr/lib64/libedit.so: undefined reference to `tgetflag'
/usr/lib64/libedit.so: undefined reference to `tputs'
/usr/lib64/libedit.so: undefined reference to `tgetent'
/usr/lib64/libedit.so: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
```
您需要將configure命令更改為:
```bash
$ LDFLAGS=-lncurses ./configure --with-libedit
```
# 基礎特性
## 相關設置
**xdebug.default_enable**
類型:布爾值,默認值:1
如果此設置為1,則默認情況下將在錯誤事件中顯示蹤跡。您可以使用`xdebug_disable()`禁用顯示代碼中的堆棧跟蹤。由于這是Xdebug的基本功能之一,建議將此設置保留為1。
**xdebug.force_display_errors**
類型:int,默認值:0,在Xdebug>=2.3中引入
如果此設置設置為1,則無論PHP的[display_errors](http://php.net/manual/zh/errorfunc.configuration.php#ini.display-errors)設置如何,都將始終顯示錯誤。
**xdebug.force_error_reporting**
類型:int,默認值:0,在Xdebug>=2.3中引入
此設置是一個位掩碼,如[error_reporting](http://php.net/manual/zh/errorfunc.configuration.php#ini.error-reporting)。該位掩碼將與[error_reporting](http://php.net/manual/zh/errorfunc.configuration.php#ini.error-reporting)表示的位掩碼進行邏輯OR運算,以便顯示錯誤。此設置只能在php.ini中進行,并允許您強制顯示某些錯誤,無論應用程序使用[ini_set()](http://php.net/manual/zh/function.ini-set.php)做什么。
**xdebug.halt_level**
類型:int,默認值:0,在Xdebug>=2.3中引入
此設置允許您配置一個掩碼,用于確定是否以及哪些通知和/或警告轉換為錯誤。您可以配置由PHP生成的通知和警告,以及您自己生成的通知和警告(通過`trigger_error()`)。例如,要將`strlen()`(不帶參數)的警告轉換為錯誤,您可以執行以下操作:
```php
ini_set('xdebug.halt_level', E_WARNING);
strlen();
echo "Hi!\n";
```
然后,這將導致顯示錯誤消息,以及腳本的中止。`echo "Hi!\n";`不會被執行。
該設置是一個位掩碼,因此要將所有通知和警告轉換為所有應用程序的錯誤,您可以在php.ini中設置:
```ini
xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE
```
位掩碼只支持上面提到的四個級別。
**xdebug.max_nesting_level**
類型:int,默認值:256
控制無限遞歸保護的保護機制。此設置的值是在中止腳本之前允許的嵌套函數的最大級別。
在Xdebug 2.6之前,如果超出,這將產生fatal異常。從Xdebug 2.6及更高版本開始,將引發“[ERROR](http://php.net/manual/en/class.error.php)”異常。
在Xdebug 2.3之前,默認值為`100`。
**xdebug.max_stack_frames**
類型:整數,默認值:-1,在Xdebug>=2.3中引入
控制堆棧跟蹤中顯示的堆棧幀數,在PHP錯誤堆棧跟蹤期間在命令行上以及在HTML跟蹤的瀏覽器中顯示。
**xdebug.scream**
類型:布爾值,默認值:0,在Xdebug>=2.1中引入
如果此設置為1,則Xdebug將禁用@(關閉)運算符,以便不再隱藏通知,警告和錯誤。
## 相關函數
***string xdebug_call_class( [int $depth = 1] )***
*返回調用類,如果堆棧幀不存在,則返回NULL;如果堆棧幀沒有類信息,則返回FALSE*
此函數返回定義當前方法的類的名稱,如果沒有與此調用關聯的類,則返回FALSE。
```php
# 示例
<?php
class Strings
{
static function fix_string($a)
{
echo
xdebug_call_class().
"::".
xdebug_call_function().
" is called at ".
xdebug_call_file().
":".
xdebug_call_line();
}
}
$ret = Strings::fix_string( 'Derick' );
?>
```
```bash
# 返回
Called @ /home/httpd/html/test/xdebug_caller.php:17 from ::{main}
```
要從早期堆棧幀中檢索信息,請使用可選的`$depth`參數。值為`1`將返回執行`xdebug_call_class()`的方法的調用信息:
```php
# 示例
<?php
class Strings
{
static function fix_string( $a )
{
echo
xdebug_call_class( 1 ).
"::".
xdebug_call_function( 1 ).
" is called at ".
xdebug_call_file( 1 ).
":".
xdebug_call_line( 1 );
}
}
$ret = Strings::fix_string( 'Derick' );
?>
```
```bash
# 返回
Strings::fix_string is called at /home/httpd/html/test/xdebug_caller:17
```
值`2`(默認值)返回當前方法的“grand parent”的調用信息:
```php
# 示例
<?php
class Strings
{
static function fix_string( $a )
{
echo
xdebug_call_class( 2 ).
"::".
xdebug_call_function( 2 ).
" is called at ".
xdebug_call_file( 2 ).
":".
xdebug_call_line( 2 );
}
static function fix_strings( array $a )
{
foreach ( $a as $element )
{
self::fix_string( $a );
}
}
}
$ret = Strings::fix_strings( [ 'Derick' ] );
?>
```
```bash
# 返回
Strings::fix_strings is called at /home/httpd/html/test/xdebug_caller:25
```
值`0`將調用的調用信息返回到相應的`xdebug_call_*`方法:
```php
# 示例
<?php
class Strings
{
static function fix_string( $a )
{
echo
xdebug_call_class( 0 ).
"::".
xdebug_call_function( 0 ).
" is called at ".
xdebug_call_file( 0 ).
":".
xdebug_call_line( 0 );
}
static function fix_strings( array $a )
{
foreach ( $a as $element )
{
self::fix_string( $a );
}
}
}
$ret = Strings::fix_strings( [ 'Derick' ] );
?>
```
```bash
# 返回
::xdebug_call_function is called at /home/httpd/html/test/xdebug_caller:13
```
***string xdebug_call_file( [int $depth = 1] )***
*返回調用文件,如果堆棧幀不存在,則返回`NULL`*
此函數返回執行當前函數/方法的文件名。
要從早期堆棧幀中檢索信息,請使用可選的`$depth`參數。
有關示例和更多信息,請參閱`xdebug_call_class()`。
***string xdebug_call_function( [int $depth = 1] )***
*返回調用函數/方法,如果堆棧幀不存在則返回`NULL`,如果堆棧幀沒有函數/方法信息則返回`FALSE`*
此函數返回當前函數/方法的名稱。
要從早期堆棧幀中檢索信息,請使用可選的`$depth`參數。
有關示例和更多信息,請參閱`xdebug_call_class()`。
***int xdebug_call_line( [int $depth = 1] )***
*返回調用行號,如果堆棧幀不存在,則返回`NULL`*
此函數返回調用當前函數/方法的行號。
要從早期堆棧幀中檢索信息,請使用可選的`$depth`參數。
有關示例和更多信息,請參閱`xdebug_call_class()`。
***void xdebug_disable()***
*禁用堆棧跟蹤*
禁用在錯誤條件下顯示堆棧跟蹤。
***void xdebug_enable()***
*啟用堆棧跟蹤*
啟用在錯誤條件下顯示堆棧跟蹤。
***string xdebug_get_collected_errors( [int clean] )***
*返回收集的所有錯誤消息*
*在2.1版中引入*
此函數返回集合緩沖區中的所有錯誤,其中包含使用`xdebug_start_error_collection()`啟動錯誤集合時存儲的所有錯誤。
默認情況下,此函數不會清除錯誤收集緩沖區。如果將true作為參數傳遞給此函數,則緩沖區也將被清除。
此函數返回一個字符串,其中包含格式化為“Xdebug表”的所有收集的錯誤。
***array xdebug_get_headers()***
*返回通過調用PHP的header()函數設置的所有標頭*
*在2.1版中引入*
返回使用PHP的header()函數設置的所有頭,或者在PHP內部設置的任何其他頭(例如通過setcookie())作為數組。
```php
# 示例
<?php
header( "X-Test", "Testing" );
setcookie( "TestCookie", "test-value" );
var_dump( xdebug_get_headers() );
?>
```
```bash
# 返回
array(2) {
[0]=>
string(6) "X-Test"
[1]=>
string(33) "Set-Cookie: TestCookie=test-value"
}
```
***bool xdebug_is_enabled()***
*返回是否啟用堆棧跟蹤*
返回是否在出現錯誤時顯示堆棧跟蹤。
***int xdebug_memory_usage()***
*返回當前內存使用情況*
返回腳本使用的當前內存量。在PHP 5.2.1之前,這只適用于使用--enable-memory-limit編譯PHP的情況。從PHP 5.2.1及更高版本開始,此功能始終可用。
***int xdebug_peak_memory_usage()***
*返回峰值內存使用情況*
返回腳本到目前為止使用的最大內存量。在PHP 5.2.1之前,這只適用于使用--enable-memory-limit編譯PHP的情況。從PHP 5.2.1及更高版本開始,此功能始終可用。
***void xdebug_start_error_collection()***
*開始記錄所有通知,警告和錯誤并阻止其顯示*
*在2.1版中引入*
執行此函數時,Xdebug將導致PHP不顯示任何通知,警告或錯誤。相反,它們根據Xdebug的常規錯誤格式化規則(即帶有紅色感嘆號的錯誤表)進行格式化,然后存儲在緩沖區中。這將繼續,直到您調用`xdebug_stop_error_collection()`。
可以通過調用`xdebug_get_collected_errors()`來檢索此緩沖區的內容,然后顯示。如果您想要阻止Xdebug強大的錯誤報告功能破壞您的布局,這非常有用。
***void xdebug_stop_error_collection()***
*停止記錄`xdebug_start_error_collection()`啟動的所有通知,警告和錯誤*
*在2.1版中引入*
執行此函數時,將中止由`xdebug_start_error_collection()`啟動的錯誤收集。存儲在集合緩沖區中的錯誤不會被刪除,仍然可以通過`xdebug_get_collected_errors()`獲取。
***float xdebug_time_index()***
*返回當前時間索引*
返回自腳本啟動以來的當前時間索引(以秒為單位)。
```php
# 示例
<?php
echo xdebug_time_index(), "\n";
for ($i = 0; $i < 250000; $i++)
{
// do nothing
}
echo xdebug_time_index(), "\n";
?>
```
```bash
# 返回
0.00038003921508789
0.76580691337585
```
# 可變顯示特性
Xdebug替換了PHP的var_dump()函數來顯示變量。Xdebug的版本包含不同類型的不同顏色,并限制數組元素/對象屬性的數量,最大深度和字符串長度。還有一些其他功能處理變量顯示。
## 設置對var_dump()的影響
有許多設置可以控制Xdebug修改后的var_dump()函數的輸出:xdebug.var_display_max_children,xdebug.var_display_max_data和xdebug.var_display_max_depth。通過示例最好地顯示這三個設置的效果。下面的腳本運行四次,每次都有不同的設置。您可以使用選項卡查看差異。
### 腳本
```php
<?php
class test {
public $pub = false;
private $priv = true;
protected $prot = 42;
}
$t = new test;
$t->pub = $t;
$data = array(
'one' => 'a somewhat long string!',
'two' => array(
'two.one' => array(
'two.one.zero' => 210,
'two.one.one' => array(
'two.one.one.zero' => 3.141592564,
'two.one.one.one' => 2.7,
),
),
),
'three' => $t,
'four' => range(0, 5),
);
var_dump( $data )
```
### 結果
- *default*
- *children=2*
- *data=16*
- *depth=2*
- *children=3, data=8, depth=1*
```html
array
'one' => string 'a somewhat long string!' (length=23)
'two' =>
array
'two.one' =>
array
'two.one.zero' => int 210
'two.one.one' =>
array
...
'three' =>
object(test)[1]
public 'pub' =>
&object(test)[1]
private 'priv' => boolean true
protected 'prot' => int 42
'four' =>
array
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
array
'one' => string 'a somewhat long string!' (length=23)
'two' =>
array
'two.one' =>
array
'two.one.zero' => int 210
'two.one.one' =>
array
...
more elements...
array
'one' => string 'a somewhat long '... (length=23)
'two' =>
array
'two.one' =>
array
'two.one.zero' => int 210
'two.one.one' =>
array
...
'three' =>
object(test)[1]
public 'pub' =>
&object(test)[1]
private 'priv' => boolean true
protected 'prot' => int 42
'four' =>
array
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
array
'one' => string 'a somewhat long string!' (length=23)
'two' =>
array
'two.one' =>
array
...
'three' =>
object(test)[1]
public 'pub' =>
&object(test)[1]
private 'priv' => boolean true
protected 'prot' => int 42
'four' =>
array
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
array
'one' => string 'a somewh'... (length=23)
'two' =>
array
...
'three' =>
object(test)[1]
...
more elements...
```
# 堆棧跟蹤
當Xdebug被激活時,只要PHP決定顯示notice,notice,error等,它就會顯示堆棧跟蹤。堆棧跟蹤顯示的信息及其顯示方式可以根據您的需要進行配置。
Xdebug在錯誤情況下顯示的堆棧跟蹤(如果[display.errors](http://www.php.net/manual/zh/ref.errorfunc.php#ini.display-errors)在php.ini中設置為On),它們顯示的信息量非常保守。這是因為大量信息會降低腳本的執行速度以及在瀏覽器中呈現堆棧跟蹤本身的速度。但是,可以使堆棧跟蹤顯示具有不同設置的更詳細信息。
## 堆棧跟蹤中的變量
默認情況下,Xdebug現在將在其生成的堆棧跟蹤中顯示變量信息。收集或顯示時,可變信息可能需要相當多的資源。但是,在許多情況下,顯示變量信息很有用,這就是Xdebug具有`xdebug.collect_params`設置的原因。下面的示例中顯示了下面的腳本,以及使用此設置的不同值的輸出結果。
### 腳本
```php
<?php
function foo( $a ) {
for ($i = 1; $i < $a['foo']; $i++) {
if ($i == 500000) xdebug_break();
}
}
set_time_limit(1);
$c = new stdClass;
$c->bar = 100;
$a = array(
42 => false, 'foo' => 912124,
$c, new stdClass, fopen( '/etc/passwd', 'r' )
);
foo( $a );
?>
```
### 結果
`xdebug.collect_params`設置的不同值給出不同的輸出,您可以在下面看到:
# 函數跟蹤
# 代碼覆蓋率分析
代碼覆蓋率告訴您在請求期間執行了哪些腳本(或腳本集)。有了這些信息,您可以了解您的單元測試有多好。
Xdebug的代碼覆蓋功能通常與[PHP_CodeCoverage](https://github.com/sebastianbergmann/php-code-coverage)結合使用,作為[PHPUnit](https://phpunit.de/)運行的一部分。
PHPUnit將代碼覆蓋率集合委托給Xdebug。它通過`xdebug_start_code_coverage()`和`xdebug_stop_code_coverage()`為每個測試啟動和停止代碼覆蓋,并使用`xdebug_get_code_coverage()`來檢索結果。
代碼覆蓋率的主要輸出是一個數組,詳細說明在運行代碼覆蓋率集合處于活動狀態的代碼時,哪些文件已被“命中”。但代碼覆蓋功能還可以在產生額外性能影響的情況下分析哪些代碼行上有可執行代碼,哪些代碼行實際可以被命中(死代碼分析),還可以進行檢測以找出哪些分支并遵循功能和方法中的路徑。`xdebug_start_code_coverage()`函數記錄了各種選項。
## 過濾
Xdebug 2.6引入了代碼覆蓋的過濾功能。使用過濾器,您可以通過白名單包括,或通過黑名單排除,在代碼覆蓋率收集期間分析路徑或類名前綴。一個典型的用例是將過濾器配置為僅包含您的`src/`文件夾,以便Xdebug的代碼覆蓋率分析不會嘗試分析測試,Composer依賴項或PHPUnit/PHP_CodeCoverage本身。如果正確配置過濾器,則可以預期代碼覆蓋率運行速度提高2倍[[1](https://twitter.com/jrf_nl/status/955017446674616320),[2](https://twitter.com/hollodotme/status/953719914686242816),[3](https://twitter.com/WyriHaximus/status/953667730003001344)]。
過濾器的工作原理是根據配置的過濾器標記每個可執行單元(函數,方法,文件)。Xdebug只能在第一次包含/需要特定的可執行單元時才這樣做,因為當PHP首次解析和編譯文件時會發生過濾。Xdebug需要這樣做,因為這也是在分析哪些路徑可以運行以及哪些行不能執行時。此時標記可執行單元,也意味著每次Xdebug想要計算要包含在代碼覆蓋率中的行時,都不必運行過濾器。因此,在包含/需要代碼之前設置過濾器非常重要。目前最好通過PHP的[auto_prepend_file](http://php.net/manual/zh/ini.core.php#ini.auto-prepend-file)設置通過自動預置文件來完成。
要設置僅對`src/`文件夾進行代碼覆蓋率分析的過濾器,可以使用以下命令調用`xdebug_set_filter()`:
```php
# 示例
<?php
xdebug_set_filter(
XDEBUG_FILTER_CODE_COVERAGE,
XDEBUG_PATH_WHITELIST,
[ __DIR__ . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR ]
);
?>
```
設置此過濾器后,代碼覆蓋率信息將僅包含位于此文件所在文件的`src/`子目錄中的函數,方法和文件。您可以通過調用以告訴PHP添加此前置文件:
```bash
php -dauto_prepend_file=xdebug_filter.php yourscript.php
```
或者與PHPUnit結合使用,當通過Composer安裝時,使用:
```ba's
php -dauto_prepend_file=xdebug_filter.php vendor/bin/phpunit
```
`xdebug_set_filter()`參數的完整文檔在其自己的文檔頁面中進行了描述。
## 相關設置
**xdebug.coverage_enable**
類型:布爾值,默認值:1,在Xdebug>=2.2中引入
如果此設置設置為0,則Xdebug將不會設置內部結構以允許代碼覆蓋。這加快了Xdebug的速度,但當然,Code Coverage Analysis不起作用。
## 相關函數
***boolean xdebug_code_coverage_started()***
*返回代碼覆蓋是否有效。*
返回是否已啟動代碼覆蓋率。
```php
# 示例
<?php
var_dump(xdebug_code_coverage_started());
xdebug_start_code_coverage();
var_dump(xdebug_code_coverage_started());
?>
```
```bash
# 返回
bool(false)
bool(true)
```
***array xdebug_get_code_coverage()***
*返回代碼覆蓋率信息*
# 垃圾收集統計
Xdebug的內置垃圾收集統計分析器允許您查明PHP內部垃圾收集器何時觸發,清理了多少變量,耗時多長,以及實際釋放了多少內存。
## 介紹
*Xdebug 2.6中的新功能*
PHP中的垃圾收集(GC)會對內存和性能產生嚴重影響,因此了解它何時被觸發以及每次運行的效率如何,都可以優化您的程序。PHP引擎不提供收集有關垃圾收集的統計信息的機制,但Xdebug現在可以。
目前,垃圾收集統計信息僅以人類可讀的表格格式收集,因為我們無法為此類報告生成機器可讀輸出的工具。未來版本可能包括其他格式的導出以允許機器處理。
## 用法
有兩種方法可以用兩種不同的用例開始收集GC統計數據。第一個是完全通過INI設置,主要用例是收集單個CLI腳本運行的統計信息(GC通常是個問題)。
```bash
php -dxdebug.gc_stats_enable=1 your_script.php
```
如果要收集執行的每個腳本的垃圾收集統計信息,可以在系統或目錄級別設置`xdebug.gc_stats_enable` INI設置。請注意,即使垃圾收集器未運行,全局激活集合也會為每個已執行的腳本生成輸出文件。
第二種開始收集的方法是直接在PHP腳本中調用函數`xdebug_start_gcstats()`。這使您可以更好地控制何時開始統計信息收集。
您可以通過調用`xdebug_stop_gcstats()`來停止INI和基于函數的方法的收集。
## 表格文字(人類可讀)
垃圾收集統計信息的默認(僅限于現在)輸出格式是表格人類可讀文本輸出。
```
Garbage Collection Report
version: 1
creator: xdebug 2.6.0 (PHP 7.2.0)
```
```
Collected | Efficiency% | Duration | Memory Before | Memory After | Reduction% | Function
----------+-------------+----------+---------------+--------------+------------+---------
10000 | 100.00 % | 0.00 ms | 5539880 | 579880 | 79.53 % | bar
10000 | 100.00 % | 0.00 ms | 5540040 | 580040 | 79.53 % | Garbage::produce
4001 | 40.01 % | 0.00 ms | 2563048 | 578968 | 77.41 % |gc_collect_cycles
```
標頭包含報告的版本以及生成它的Xdebug的版本。
然后,表本身為每個垃圾收集運行包含一行,每行包含7個報告的變量:
- **Collected** — 在此次運行期間被垃圾收集的所謂“root”的數量。“root”是一個PHP對象(實例)或垃圾收集器正在觀察的數組,用于潛在的清理。
- **Efficiency%** — 清除根的數量是否除以10 000 - 達到時神奇數量的“根”會觸發PHP內部垃圾收集器自動運行。
- **Duration** — 表示此垃圾回收運行所用的持續時間(以毫秒為單位)。
- **Memory Before** — 包含在激活此GC運行之前由`memory_get_usage()`測量的內存。
- **Memory After** — 包含GC運行完成后由`memory_get_usage()`測量的內存。
- **Reduction%** — 此GC運行導致的內存減少百分比。
- **Function** — 觸發GC運行的函數或方法的名稱。如果是`gc_collect_cycles()`,則表示已明確觸發垃圾收集器。所有其他值表明由于PHP引擎的10 000“根”達到度量標準,GC被隱式觸發。
有關PHP垃圾收集工作原理的詳細信息,請參閱有關[垃圾收集的PHP手冊章節](http://php.net/manual/zh/features.gc.php)。
## 相關設置
**xdebug.gc_stats_enable**
類型:bool,默認值:false,在Xdebug >= 2.6中引入
如果啟用此設置,則垃圾收集運行的統計信息將自動收集到使用`xdebug.gc_stats_output_dir`設置的給定目錄中,并使用由`xdebug.gc_stats_output_name`配置的自動生成的名稱。
# 分析PHP腳本
Xdebug的內置分析器允許您在腳本中找到瓶頸,并使用外部工具(如KCacheGrind或WinCacheGrind)可視化這些瓶頸。
## 介紹
Xdebug的Profiler是一個功能強大的工具,它使您能夠分析PHP代碼并確定瓶頸,或者通常可以看到代碼的哪些部分很慢并且可以使用速度提升。從Xdebug 2.6開始,探查器還會收集有關正在使用多少內存的信息,以及aGnd方法增加內存使用量的功能。
Xdebug中的探查器以Cachegrind兼容文件的形式輸出分析信息。這允許您使用優秀的[KCacheGrind](https://kcachegrind.github.io/)工具(Linux,KDE)來分析您的分析數據。如果您使用的是Linux,則可以使用您喜歡的軟件包管理器安裝KCacheGrind。
如果您使用的是Windows,則可以使用預編譯的[QCacheGrind](http://sourceforge.net/projects/qcachegrindwin/)二進制文件。(QCacheGrind是沒有KDE綁定的KCacheGrind)。
如果您使用的是Mac OSX,那么也有關于如何構建QCacheGrind的[說明](http://www.tekkie.ro/computer-setup/how-to-install-kcachegrind-qcachegrind-on-mac-osx/)。
# 遠程調試
# 常問問題
待續...