Profilování PHP (APD vs. XDebug)

The Zero, sobota 4. 8. 2007 - 02:15

O profilování a debugování PHP psal snad už každý, kdo na svém blogu občas PHP zmíní. Stejně tak se dá vygooglit kompletní konfigurace, takže i když nevíte, jak na to, stačí zadat pár klíčových slov a brzo už své php.ini aktualizujete. Mně to ale stejně nedá :).

XDebug

XDebug už jsem se snažil rozběhnout asi desetkrát. Nikdy jsem neuspěl a musím říct, že je docela frustrující, když na pěti blozích píšou "jo, xdebug je dobrej, stačí do php.ini napsat (zde následuje přesné znění mého konfiguračního souboru) a je to" a já pořád nic. Jestli je v tom nějaká černá magie... Mám správnou verzi knihovny, nastavení odpovídá manuálu i všem ostatním, a stejně nic. A tak se můžu pořád jen těšit, až jednou budu moci spustit WinCacheGrind a podívat se, jak na tom moje skripty jsou.

APD

Když jsem si teď nastavoval PHP na jednom počítači, na němž jsem přechodně pracoval, řekl jsem si, že už to musím zlomit. A tak když to s xdebugem zase nešlo, vzpomněl jsem si na jeden svazek z mé knihovny - Pokročilé programování v PHP 5 od George Schlossnagla, autora modulu APD.

Dlouho trvalo, než jsem vůbec našel zdroj, z něhož bych mohl stáhnout již zkompilovanou win32 knihovnu, protože na vlastní sestavení jsem se úplně necítil. Nakonec jsem ale zdroj našel (i když to bylo 50 MB kvůli 21 kB - proto jsem knihovnu pro PHP 5.2 nahrál i k sobě), do php.ini napsal

zend_extension_ts = "c:/php/ext/php_apd.dll"
 
[APD]
apd.dumpdir="C:\web\web\temp\profiler"

a po restartu Apache, přidání volání

apd_set_pprof_trace();

na začátek profilovaného skriptu a otevření stránky v prohlížeči se v nastavené složce objevil první soubor. Pozor: Ta zpětná lomítka v apd.dumpdir jsou důležitá - normální mi nešla...

Ve Windows je také trochu problém s použitím skriptu pprofp. Nějak se mi nepodařilo jej rozjet, a tak stačila lehká úprava jeho úvodu a bylo to. Prvních zhruba padesát řádků až před definici funkce parse_profile vypadá takto:

/*require "Console_Getopt.php";
error_reporting(0);
$con = new Console_Getopt;
$args = $con->readPHPArgv();
array_shift($args);
$shortoptions = 'aC:cg:hiIlmMrRsStTuUO:vXzZ';
$retval = $con->getopt( $args, $shortoptions);
if(is_object($retval)) {
usage();
}*/

echo '<pre>';
error_reporting(0);
$opt['O'] = 20;
$opt['C'] = 20;
$opt = array_merge($opt, $_GET);
/*foreach ($retval[0] as $kv_array) {
$opt[$kv_array[0]] = $kv_array[1];
}*/

 
$cfg = array();
 
$calls = array();
$mem = array();
$c_rtimes = array();
$c_stimes = array();
$c_utimes = array();
$rtimes = array();
$stimes = array();
$utimes = array();
$rtotal = 0;
$stotal = 0;
$utotal = 0;
$count = $opt['C'];
$symbol_type = array();
$num = 0;
 
if(!$_GET) {
usage();
}
 
$files = array($_GET['file']);
/*foreach($retval[1] as $f) {
$files = array_merge($files, find_files($f));
}*/

shuffle($files);
foreach($files as $path) {
if($count-- == 0) break;
if(array_key_exists('v', $opt)) { echo "Processing $path\n"; }
$num++;
parse_profile($path);
}
 

(stáhnout). Používá se to tak, že jednotlivé parametry předáváte metodou GET, tj. URL bude vypadat zhruba pprofp.php?file=pprof.03336.0&T&c&m&O=20.

Zařazeno do kategorie PHP.

Předchozí: Jak to ti Španělé vedou

Následující: Správa domén 3. řádu pomocí mod_rewrite

Komentáře

Nikdo ještě nekomentoval. Buď máte fakt rychlou RSS čtečku, nebo jste právě přečetli něco, co nikomu nestojí ani za trochu snahy.

Přidat komentář

Jako heslo je to proto, že lze využít magic wand a odpověď se tak bude pamatovat.

Povolené tagy: b, i, q. Bez jakýchkoli atributů a řádně ukončené. URL se převádí automaticky.

Vyžadováno je pouze jméno (proto je zvýrazněné), text, kód (ten zadáváte jen s vypnutým JavaScriptem - jestli ho nevidíte, nemusíte se o něj starat. Poslední věc, kterou formulář vyžaduje, je stisknutí tlačítka Přidat.

* E-mail slouží především k načtení gravatarů. Zobrazovat se nebude.