簡體   English   中英

本機分析PHP7中的多個腳本

[英]Natively profile multiple scripts in PHP7

自從PHP 7發行以來,現在無法在基礎文件中使用declare(ticks=1)並隨后使用register_tick_function()監視每個滴答,因為它不再遵循包含路徑,從而描述了全部腳本。 根據https://bugs.php.net/bug.php?id=71448提交的PHP錯誤,PHP 7中將不再提供該錯誤。

由於實現錯誤,在PHP 7.0之前,clarify(ticks = 1)指令泄漏到了不同的編譯單元中。 這不是按文件或按作用域的clarify()指令應該如何工作的方式。

使用本機PHP(不是C或pear擴展名等)可以使用PHP 7替代此方法嗎?這使我能夠剖析頁面加載中調用的每個函數或文件,以獲取實際文件路徑的詳細信息至少。

導致發現該錯誤的原始問題可以在如何避免在PHP 7中的每個文件上重新聲明滴答聲中找到,該問題現在與替代方法有關。

一種無需declare(ticks=1)通用方法是使用探查器。 探查器會注意到任何方法/函數的調用,文件加載等信息,甚至會獲取定時信息,因此您不僅可以說出何時,通過什么代碼,打開了哪些文件而調用了哪個函數,而且還知道了程序的哪一部分被調用了長。

PHP中著名的探查器附帶了著名的Xdebug擴展 它還附帶調試器:

好處之一是您不需要更改代碼即可進行性能分析,它只是您需要采用的PHP配置,因此您可以根據需要將其打開和關閉(例如,調試/性能分析會話)。

PHP Userland(刻度功能)

作為一種解決方法,沒有declare(ticks=1); 在每個文件的開頭(在#71448之后 ),可以通過注入它的文件協議(對於常見的本地文件系統中的文件)上的流包裝器將其動態添加。

通過創建在文件協議上注冊以代理標准文件I / O操作的流包裝器,這在技術上是可行的。 在此PoC(Github上的Gist)中,展示了最低限度的實現以證明它適用於include。 當執行test.php ,盡管other.php尚未declare(ticks=1); 在磁盤上,已注冊的滴答函數在包含上被調用,如回溯圖所示:

...
tick_handler() called
#0  tick_handler(1) called at [/home/hakre/stream-wrapper-default-files/test.php:18]
#1  tick_handler() called at [/home/hakre/stream-wrapper-default-files/other.php:2]
#2  include(/home/hakre/stream-wrapper-default-files/other.php) called at [/home/hakre/stream-wrapper-default-files/test.php:24]
...

輸出是從注冊的滴答功能(此處為test.php)生成的:

<?php
/**
 * Inject declare ticks on include
 */
declare(ticks=1);

require __DIR__ . '/streamwrapper.php';

FileStreamWrapper::init();

// using a function as the callback
register_tick_function('tick_handler', true);


// Function which is called on each tick-event
function tick_handler()
{
    echo "tick_handler() called\n";
    debug_print_backtrace();
}

register_tick_function('tick_handler');

include "other.php";
include "another.php"; # file does not exists

要點示例中流包裝器僅實現了對兩個include語句的工作所需的實現,因為PHP腳本通常會做更多的文件I / O,因此需要根據需要擴展它。 在進行查找等操作時,需要考慮動態插入等操作,但是每個文件操作(句柄)都有狀態,因為每個實例都有一個實例,因此應該對其進行很好的封裝。 全局狀態用於為每個操作注冊/注銷流包裝器,以代理到實際的文件系統功能中,否則會產生無限遞歸(包裝器使用包裝器使用包裝器...)。 到目前為止,PoC展示了其原理上的工作方式。

這也可以用於其他用途,但是此PoC用於特定的聲明滴答聲,並包含用例。

暫無
暫無

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

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