SlideShare ist ein Scribd-Unternehmen logo
1 von 69
EIN STALL VOLLER
TRÜFFELSCHWEINE

(PHP)-Profiling-Tools im Überblick


René Bruns - TNG Big Techday
ÜBER MICH

                        René Bruns

               Entwickler seit 2001

               seit 2009 bei Travian Games

               seit 2011 Technical Director




                                               2
UND WER SEID IHR?




                    3
UND WER SEID IHR?

Entwickler?




                    3
UND WER SEID IHR?

Entwickler?




              Systemadministratoren?




                                       3
UND WER SEID IHR?

Entwickler?




              Systemadministratoren?




                                       QA?



                                             3
UND WER SEID IHR?

Entwickler?




              Systemadministratoren?




 C*O?                                  QA?



                                             3
UND WER SEID IHR?

Entwickler?                            Projektmanager?




              Systemadministratoren?




 C*O?                                     QA?



                                                    3
PROFILING?




             4
PROFILING?


Profiler

Es gibt unterschiedliche Problembereiche in der
Softwareentwicklung, die durch ineffiziente Programmierung
ausgelöst werden. Ein Profiler hilft dem Entwickler durch
Analyse und Vergleich von laufenden Programmen die
Problembereiche aufzudecken.
http://de.wikipedia.org/wiki/Profiler_(Programmierung)




                                                             5
AUSGANGSSITUATION


               SLOW!!11!




                           6
PROFILING FRÜHER(?)

class Main
{
    public static function run() {
        $otherClass = new OtherClass();
        $otherClass->doNothingImportant();
        $dummy = new SlowClass();
        $dummy->slowFunction(10);
    }
}

Main::run();




                                             7
PROFILING FRÜHER(?)

class Main
{
    public static function run() {
        $start = microtime(true);
        printf ("Before OC: %f" . PHP_EOL, microtime(true) - $start);
        $otherClass = new OtherClass();
        $otherClass->doNothingImportant();
        printf ("After OC: %f" . PHP_EOL, microtime(true) - $start);
        printf ("Before SC: %f" . PHP_EOL, microtime(true) - $start);
        $dummy = new SlowClass();
        $dummy->slowFunction(10);
        printf ("After SC: %f" . PHP_EOL, microtime(true) - $start);
    }
}

Main::run();




                                                                    8
PROFILING FRÜHER(?)

class Main
{
    public static function run() {
        $start = microtime(true);
        printf ("Before OC: %f" . PHP_EOL, microtime(true) - $start);
        $otherClass = new OtherClass();
        $otherClass->doNothingImportant();
        printf ("After OC: %f" . PHP_EOL, microtime(true) - $start);
        printf ("Before SC: %f" . PHP_EOL, microtime(true) - $start);
        $dummy = new SlowClass();
        $dummy->slowFunction(10);
        printf ("After SC: %f" . PHP_EOL, microtime(true) - $start);
    }
}                               $ php Main.php
                               Before OC: 0.000625
Main::run();
                               After OC: 0.004919
                               Before SC: 0.005099
                               ..........
                               After SC: 10.013932
                                                                    8
PROFILING HEUTE

   Viele verschiedene Fehlerquellen
     Browser
     Frontend
     Backend
     Datenbank
     Services

   Schwachstelle suchen

   Vom Groben in‘s Feine




                                       9
SCHRITT 1: MELDUNG ÜBERPRÜFEN



                      He‘s
                      dead,
                      Jim!
                                10
SCHRITT 2: URSACHE EINKREISEN

                Browser




                                11
SCHRITT 2: URSACHE EINKREISEN

                Browser

                Frontend




                                11
SCHRITT 2: URSACHE EINKREISEN

                Browser

                Frontend

                Backend




                                11
SCHRITT 2: URSACHE EINKREISEN

                Browser

                Frontend

                Backend

                  DB




                                11
BROWSER

   Langsamer JS-Code

   Zu hoher Speicherverbrauch

   Zu viele CSS-Selektoren

   Langsame Ladezeiten
     Zu viele parallele Downloads
     Offen gehaltene Verbindungen
     Netzwerk
     Internet

   Antwort vom Server zu langsam -> Backend



                                               12
GOOGLE CHROME




                13
GOOGLE CHROME




                14
GOOGLE CHROME




                15
GOOGLE CHROME




                16
GOOGLE CHROME




                17
GOOGLE CHROME




                17
GOOGLE CHROME




                18
GOOGLE CHROME




                18
GOOGLE CHROME




                19
GOOGLE CHROME




                19
FRONTEND / BACKEND

   Unnötige Schreib- / Lesezugriffe in Schleifen

   Log-Ausgaben

   Schleifen sind unnötig geschachtelt

   Unnötig langsame Befehle benutzt
     RegExp statt ==

   Externer Service reagiert langsam

   Datenbankabfrage dauert zu lange --> DB




                                                    20
XDEBUG

   PHP Extension by Derick Rethans

   Kann per INI-Direktive aktiviert werden

   breites Einsatzspektrum
     Debugger
     Profiler
     Tracer
     StackTrace-Formatter
     ...

   hoher Memory-/ CPU-/ IO-Footprint

   Niemals(!) dauerhaft im Produktivbetrieb verwenden


                                                         21
XDEBUG




         22
XDEBUG

$ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir=. Main.php
..........




                                                                             22
XDEBUG

$ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir=. Main.php
..........

$ ls -l ca*
-rwxrwxrwx 1 rene staff 4461 11 Jun 13:53 cachegrind.out.69408




                                                                             22
XDEBUG

$ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir=. Main.php
..........

$ ls -l ca*
-rwxrwxrwx 1 rene staff 4461 11 Jun 13:53 cachegrind.out.69408

$ cat cachegrind.out.69408
version: 1
creator: xdebug 2.2.0
cmd: /Volumes/TCDATA/Sourcen/git/ProfilingTalk/Main.php
part: 1
positions: line

events: Time

fl=/Volumes/TCDATA/Sourcen/git/ProfilingTalk/OtherClass.php
fn=require_once::/Volumes/TCDATA/Sourcen/git/ProfilingTalk/OtherClass.php
1 42

fl=/Volumes/TCDATA/Sourcen/git/ProfilingTalk/SlowClass.php
fn=require_once::/Volumes/TCDATA/Sourcen/git/ProfilingTalk/SlowClass.php
10




                                                                             22
XDEBUG
   Cachegrind-Files können via KCachegrind, WinCachegrind, WebGrind oder PhpStorm-IDE
    ausgewertet werden.

   Bsp. PhpStorm:




                                                                                         23
XDEBUG
   Cachegrind-Files können via KCachegrind, WinCachegrind, WebGrind oder PhpStorm-IDE
    ausgewertet werden.

   Bsp. PhpStorm:




                                                                                         24
XDEBUG




         25
XHPROF

   PHP Extension by Facebook

   Kann codeseitig aktiviert werden

   Profiler only

   sehr schlanker Footprint, daher auch im Livebetrieb
    einsetzbar (Monte Carlo-Algorithmus)




                                                          26
XHPROF

header.php:

include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_lib.php';
include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);



footer.php:
include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_lib.php';
include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_runs.php';

$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'testrene');
echo "http://localhost/~rene/xhprof_html/index.php?run={$run_id}&source=testrenen";




                                                                                  27
XHPROF
$ php -d auto_append_fileo_prepend_file="header.php" -d auto_append_file="footer.php" Main.php
..........
http://localhost/~rene/xhprof_html/index.php?run=4fd61a7e92aeb&source=testrene




                                                                                             28
XHPROF
$ php -d auto_append_fileo_prepend_file="header.php" -d auto_append_file="footer.php" Main.php
..........
http://localhost/~rene/xhprof_html/index.php?run=4fd61a7e92aeb&source=testrene

$ cat 4fd61a7e92aeb.testrene
a:14:{s:23:"main()==>load::Main.php";a:5:{s:2:"ct";i:1;s:2:"wt";i:459;s:3:"cpu";i:1220;s:
2:"mu";i:10408;s:3:"pmu";i:0;}s:43:"main()==>load::ProfilingTalk/OtherClass.php";a:5:{s:
2:"ct";i:1;s:2:"wt";i:798;s:3:"cpu";i:113;s:2:"mu";i:6880;s:3:"pmu";i:0;}s:
47:"main()==>run_init::ProfilingTalk/OtherClass.php";a:5:{s:2:"ct";i:1;s:2:"wt";i:14;s:3:"cpu";i:
10;s:2:"mu";i:1104;s:3:"pmu";i:0;}s:42:"main()==>load::ProfilingTalk/SlowClass.php";a:5:{s:
2:"ct";i:1;s:2:"wt";i:467;s:3:"cpu";i:87;s:2:"mu";i:9648;s:3:"pmu";i:0;}s:
46:"main()==>run_init::ProfilingTalk/SlowClass.php";a:5:{s:2:"ct";i:1;s:2:"wt";i:9;s:3:"cpu";i:
7;s:2:"mu";i:1104;s:3:"pmu";i:0;}s:36:"OtherClass::doNothingImportant==>pow";a:5:{s:
2:"ct";i:1;s:2:"wt";i:1655;s:3:"cpu";i:926;s:2:"mu";i:1176;s:3:"pmu";i:0;}[...]}




                                                                                                28
XHPROF




         29
XHPROF




         30
XHPROF




         30
DATENBANK

   Unnötige Daten geladen

   Kein/falscher Index benutzt

   Daten werden nach der Abfrage noch sortiert

   Langsame IOs

   Falsche Systemeinstellungen (Buffer Sizes, ...)




                                                      31
DB - EXPLAIN

select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join
orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID
= od.OrderID group by LastName, FirstName;




                                                                                 32
DB - EXPLAIN

select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join
orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID
= od.OrderID group by LastName, FirstName;


sqlite> explain query plan [...];

0|0|0|SCAN TABLE employees AS e (~1000000 rows)
0|1|1|SEARCH TABLE orders AS o USING AUTOMATIC COVERING INDEX (EmployeeID=?) (~7 rows)
0|2|2|SEARCH TABLE Order Details AS od USING INDEX sqlite_autoindex_Order Details_1
(OrderID=?) (~10 rows)
0|0|0|USE TEMP B-TREE FOR GROUP BY




                                                                                 32
DB - EXPLAIN

select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join
orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID
= od.OrderID group by LastName, FirstName;


sqlite> explain query plan [...];

0|0|0|SCAN TABLE employees AS e (~1000000 rows)
0|1|1|SEARCH TABLE orders AS o USING AUTOMATIC COVERING INDEX (EmployeeID=?) (~7 rows)
0|2|2|SEARCH TABLE Order Details AS od USING INDEX sqlite_autoindex_Order Details_1
(OrderID=?) (~10 rows)
0|0|0|USE TEMP B-TREE FOR GROUP BY


sqlite> explain [...];
0|Trace|0|0|0||00|
1|SorterOpen|3|5|0|keyinfo(2,BINARY,BINARY)|00|
2|Integer|0|7|0||00|
3|Integer|0|6|0||00|
4|Null|0|10|11||00|
5|Gosub|9|74|0||00|
6|Goto|0|81|0||00|
7|OpenRead|0|120|0|3|00|



                                                                                 32
SCHRITT 3: ERFOLG PRÜFEN

   Hat die Optimierung etwas gebracht?

   Vorher-Nachher-Check

   Lasttests

   Tools
      Apache Benchmark (AB)
      JMeter




                                          33
APACHE BENCHMARK (AB)
$ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.2.21
Server Hostname:        localhost
Server Port:            80

Document Path:          /~rene/talk/Main.php
Document Length:        11 bytes

Concurrency Level:      10
Time taken for tests:   56.692 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      22300 bytes
HTML transferred:       1100 bytes
Requests per second:    1.76 [#/sec] (mean)
Time per request:       5669.198 [ms] (mean)
Time per request:       566.920 [ms] (mean, across all concurrent requests)
Transfer rate:          0.38 [Kbytes/sec] received

Connection Times (ms)
              min mean[+/-sd] median     max
Connect:        0 3660 2329.9  5022      6356
Processing:     0 1758 3060.0     0     11378
Waiting:        0 1757 3059.9     0     11377
Total:       5010 5417 1403.8  5030     11378

Percentage of the requests served within a certain time (ms)
  50%   5030
  66%   5040
  75%   5052
  80%   5063
  90%   6316
  95% 11378        vorher
  98% 11378
  99% 11378
 100% 11378 (longest request)




                                                                              34
APACHE BENCHMARK (AB)
$ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
                                             $ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php
Benchmarking localhost (be patient).....done This is ApacheBench, Version 2.3 <$Revision: 655654 $>
                                             Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
                                             Licensed to The Apache Software Foundation, http://www.apache.org/
Server Software:        Apache/2.2.21
Server Hostname:        localhost            Benchmarking localhost (be patient).....done
Server Port:            80

Document Path:           /~rene/talk/Main.php Server Software:        Apache/2.2.21
Document Length:         11 bytes             Server Hostname:        localhost
                                              Server Port:            80
Concurrency Level:       10
Time taken for tests:    56.692 seconds       Document Path:          /~rene/talk/Main.php
Complete requests:       100                  Document Length:        11 bytes
Failed requests:         0
Write errors:            0                    Concurrency Level:      10
Total transferred:       22300 bytes          Time taken for tests:   5.395 seconds
HTML transferred:        1100 bytes           Complete requests:      100
Requests per second:     1.76 [#/sec] (mean) Failed requests:         0
Time per request:        5669.198 [ms] (mean) Write errors:           0
Time per request:        566.920 [ms] (mean, across transferred:
                                              Total all concurrent requests)
                                                                      22300 bytes
Transfer rate:           0.38 [Kbytes/sec] received
                                              HTML transferred:       1100 bytes
                                              Requests per second:    18.54 [#/sec] (mean)
Connection Times (ms)                         Time per request:       539.458 [ms] (mean)
               min mean[+/-sd] median    max Time per request:        53.946 [ms] (mean, across all concurrent requests)
Connect:         0 3660 2329.9    5022   6356 Transfer rate:          4.04 [Kbytes/sec] received
Processing:      0 1758 3060.0       0  11378
Waiting:         0 1757 3059.9       0  11377 Connection Times (ms)
Total:        5010 5417 1403.8    5030  11378                min mean[+/-sd] median   max
                                              Connect:         0 395 217.3     531    577
Percentage of the requests served within a certain time (ms) 0 142 214.4
                                              Processing:                        1    559
  50%    5030                                 Waiting:         0 142 214.6       0    559
  66%    5040                                 Total:         512 538 14.9      535    577
  75%    5052
  80%    5063
                   vorher
                                              Percentage of the requests served within a certain time (ms)
  90%    6316                                   50%    535
  95% 11378                                     66%    541
  98% 11378                                     75%    553

                                                                             nachher
  99% 11378                                     80%    555
 100% 11378 (longest request)                   90%    559
                                                95%    559
                                                98%    566
                                                99%    577
                                               100%    577 (longest request)

                                                                                                                           34
APACHE JMETER

   verteilte Lasttests

   Java-Programm

   Client-Server-Architektur

   Testen von
      HTTP/S
      SOAP
      DB‘s via JDBC
      SMTP, POP3, IMAP
      ...




                                35
JMETER - TESTPLAN ERSTELLEN

   Manuell oder per HTTP Proxy Server




                                         36
JMETER - TESTPLAN ERSTELLEN

   Manuell oder per HTTP Proxy Server




                                         37
JMETER - TESTPLAN ERSTELLEN

   Manuell oder per HTTP Proxy Server




                                         37
JMETER - TESTPLAN ERSTELLEN

   Manuell oder per HTTP Proxy Server




                                         37
JMETER - USER EINLOGGEN




                          38
JMETER - USER EINLOGGEN




                          39
JMETER - USER EINLOGGEN




                          39
JMETER - USER EINLOGGEN




                          39
JMETER - USER EINLOGGEN




                          39
JMETER - PARALLELE ZUGRIFFE




                              40
JMETER - PARALLELE ZUGRIFFE




                              41
JMETER - BERICHTE




                    42
LINKLISTE

  Google Chrome: https://www.google.com/chrome
  Chrome DevTools: https://developers.google.com/chrome-
   developer-tools/?hl=de

    Xdebug: http://xdebug.org/
    PHPStorm: http://www.jetbrains.com/phpstorm/
    KCachegrind: http://kcachegrind.sourceforge.net
    WinCacheGrind: http://sourceforge.net/projects/wincachegrind/
    Webgrind: http://code.google.com/p/webgrind/

  XHProf: http://php.net/xhprof

  AB: http://httpd.apache.org/docs/2.0/programs/ab.html

  Jmeter: http://jmeter.apache.org/




                                                                     43
FRAGEN?
GERNE AUCH SPÄTER:
MAIL: R.BRUNS@TRAVIANGAMES.COM
TWITTER: @RENEBRUNS

Weitere ähnliche Inhalte

Was ist angesagt?

An introduction to PHP 5.4
An introduction to PHP 5.4An introduction to PHP 5.4
An introduction to PHP 5.4Giovanni Derks
 
Introduction to Node.JS
Introduction to Node.JSIntroduction to Node.JS
Introduction to Node.JSEueung Mulyana
 
PHP 5.6 New and Deprecated Features
PHP 5.6  New and Deprecated FeaturesPHP 5.6  New and Deprecated Features
PHP 5.6 New and Deprecated FeaturesMark Niebergall
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersChang W. Doh
 
Php programming file
Php programming  filePhp programming  file
Php programming fileJi NG
 
Google app engine python
Google app engine   pythonGoogle app engine   python
Google app engine pythonEueung Mulyana
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf Conference
 
Happy porting x86 application to android
Happy porting x86 application to androidHappy porting x86 application to android
Happy porting x86 application to androidOwen Hsu
 
Uazaa uma-farsa-parte 2
Uazaa uma-farsa-parte 2Uazaa uma-farsa-parte 2
Uazaa uma-farsa-parte 2devninjabr
 
Finding 0days at Arab Security Conference
Finding 0days at Arab Security ConferenceFinding 0days at Arab Security Conference
Finding 0days at Arab Security ConferenceRodolpho Concurde
 
Laravel 4 package development
Laravel 4 package developmentLaravel 4 package development
Laravel 4 package developmentTihomir Opačić
 
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Phuoc Nguyen
 
Laura Garcia - Shodan API and Coding Skills [rooted2019]
Laura Garcia - Shodan API and Coding Skills [rooted2019]Laura Garcia - Shodan API and Coding Skills [rooted2019]
Laura Garcia - Shodan API and Coding Skills [rooted2019]RootedCON
 
Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.
Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.
Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.Chems Mrad
 
49368010 projectreportontraininganddevelopment(1)
49368010 projectreportontraininganddevelopment(1)49368010 projectreportontraininganddevelopment(1)
49368010 projectreportontraininganddevelopment(1)Kritika910
 
DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)
DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)
DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)Alejandro Hernández
 

Was ist angesagt? (20)

An introduction to PHP 5.4
An introduction to PHP 5.4An introduction to PHP 5.4
An introduction to PHP 5.4
 
Understand study
Understand studyUnderstand study
Understand study
 
Introduction to Node.JS
Introduction to Node.JSIntroduction to Node.JS
Introduction to Node.JS
 
WAF protections and bypass resources
WAF protections and bypass resourcesWAF protections and bypass resources
WAF protections and bypass resources
 
PHP 5.6 New and Deprecated Features
PHP 5.6  New and Deprecated FeaturesPHP 5.6  New and Deprecated Features
PHP 5.6 New and Deprecated Features
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for Beginners
 
Php programming file
Php programming  filePhp programming  file
Php programming file
 
Google app engine python
Google app engine   pythonGoogle app engine   python
Google app engine python
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
Happy porting x86 application to android
Happy porting x86 application to androidHappy porting x86 application to android
Happy porting x86 application to android
 
Uazaa uma-farsa-parte 2
Uazaa uma-farsa-parte 2Uazaa uma-farsa-parte 2
Uazaa uma-farsa-parte 2
 
Finding 0days at Arab Security Conference
Finding 0days at Arab Security ConferenceFinding 0days at Arab Security Conference
Finding 0days at Arab Security Conference
 
Laravel 4 package development
Laravel 4 package developmentLaravel 4 package development
Laravel 4 package development
 
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
 
Laura Garcia - Shodan API and Coding Skills [rooted2019]
Laura Garcia - Shodan API and Coding Skills [rooted2019]Laura Garcia - Shodan API and Coding Skills [rooted2019]
Laura Garcia - Shodan API and Coding Skills [rooted2019]
 
Learning Dtrace
Learning DtraceLearning Dtrace
Learning Dtrace
 
Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.
Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.
Introduction To Embedding The PH7 PHP Engine in a C/C++ Host Application.
 
Php version 7
Php version 7Php version 7
Php version 7
 
49368010 projectreportontraininganddevelopment(1)
49368010 projectreportontraininganddevelopment(1)49368010 projectreportontraininganddevelopment(1)
49368010 projectreportontraininganddevelopment(1)
 
DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)
DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)
DotDotPwn Fuzzer - Black Hat 2011 (Arsenal)
 

Andere mochten auch

Destitute Evaluation
Destitute EvaluationDestitute Evaluation
Destitute Evaluationhkeegan
 
Undang undang-republik-indonesia-nomor-5-tahun-2014
Undang undang-republik-indonesia-nomor-5-tahun-2014Undang undang-republik-indonesia-nomor-5-tahun-2014
Undang undang-republik-indonesia-nomor-5-tahun-2014Arief Widjaya
 
Uu0122012 full 2 pendidikan tinggi
Uu0122012 full 2 pendidikan tinggiUu0122012 full 2 pendidikan tinggi
Uu0122012 full 2 pendidikan tinggiArief Widjaya
 
Education issues
Education issuesEducation issues
Education issuesianjames64
 
[Tony buzan] speed_memory(book_fi.org)
[Tony buzan] speed_memory(book_fi.org)[Tony buzan] speed_memory(book_fi.org)
[Tony buzan] speed_memory(book_fi.org)Arief Widjaya
 
Destitute Evaluation
Destitute EvaluationDestitute Evaluation
Destitute Evaluationhkeegan
 
First Class Idea
First Class IdeaFirst Class Idea
First Class Ideaianjames64
 
Digitale Postkamer voor Gemeenten
Digitale Postkamer voor GemeentenDigitale Postkamer voor Gemeenten
Digitale Postkamer voor GemeentenChristian Zierleyn
 
Introduction To Scrum
Introduction To ScrumIntroduction To Scrum
Introduction To ScrumMartin Proulx
 
Surat edaran tubel 2015(1)
Surat edaran tubel 2015(1)Surat edaran tubel 2015(1)
Surat edaran tubel 2015(1)Arief Widjaya
 
Uu no. 38 th 2014 ttg keperawatan
Uu no. 38 th 2014 ttg keperawatanUu no. 38 th 2014 ttg keperawatan
Uu no. 38 th 2014 ttg keperawatanArief Widjaya
 
Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...
Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...
Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...renebruns
 
Errorcorrection1
Errorcorrection1Errorcorrection1
Errorcorrection1ianjames64
 
Speaking Online APAC 2013
Speaking Online APAC 2013Speaking Online APAC 2013
Speaking Online APAC 2013ianjames64
 
Gemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan Schrotenboer
Gemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan SchrotenboerGemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan Schrotenboer
Gemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan SchrotenboerChristian Zierleyn
 

Andere mochten auch (18)

Destitute Evaluation
Destitute EvaluationDestitute Evaluation
Destitute Evaluation
 
Undang undang-republik-indonesia-nomor-5-tahun-2014
Undang undang-republik-indonesia-nomor-5-tahun-2014Undang undang-republik-indonesia-nomor-5-tahun-2014
Undang undang-republik-indonesia-nomor-5-tahun-2014
 
Uu no 36_2014
Uu no 36_2014Uu no 36_2014
Uu no 36_2014
 
Uu0122012 full 2 pendidikan tinggi
Uu0122012 full 2 pendidikan tinggiUu0122012 full 2 pendidikan tinggi
Uu0122012 full 2 pendidikan tinggi
 
Uu no 36_2014 full
Uu no 36_2014 fullUu no 36_2014 full
Uu no 36_2014 full
 
Education issues
Education issuesEducation issues
Education issues
 
[Tony buzan] speed_memory(book_fi.org)
[Tony buzan] speed_memory(book_fi.org)[Tony buzan] speed_memory(book_fi.org)
[Tony buzan] speed_memory(book_fi.org)
 
Destitute Evaluation
Destitute EvaluationDestitute Evaluation
Destitute Evaluation
 
First Class Idea
First Class IdeaFirst Class Idea
First Class Idea
 
Digitale Postkamer voor Gemeenten
Digitale Postkamer voor GemeentenDigitale Postkamer voor Gemeenten
Digitale Postkamer voor Gemeenten
 
Introduction To Scrum
Introduction To ScrumIntroduction To Scrum
Introduction To Scrum
 
Surat edaran tubel 2015(1)
Surat edaran tubel 2015(1)Surat edaran tubel 2015(1)
Surat edaran tubel 2015(1)
 
Uu no. 38 th 2014 ttg keperawatan
Uu no. 38 th 2014 ttg keperawatanUu no. 38 th 2014 ttg keperawatan
Uu no. 38 th 2014 ttg keperawatan
 
Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...
Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...
Einblicke in die Fussangeln der weltweiten Browserspieleentwicklung - GameCam...
 
Errorcorrection1
Errorcorrection1Errorcorrection1
Errorcorrection1
 
Speaking Online APAC 2013
Speaking Online APAC 2013Speaking Online APAC 2013
Speaking Online APAC 2013
 
Gemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan Schrotenboer
Gemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan SchrotenboerGemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan Schrotenboer
Gemeente Midden-Drenthe gaat zaaksgewijs digitaal, door Jan Schrotenboer
 
Agile for managers
Agile for managersAgile for managers
Agile for managers
 

Ähnlich wie Ein Stall voller Trüffelschweine - (PHP-)Profiling-Tools im Überblick

2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Herokuronnywang_tw
 
Why we choose Symfony2
Why we choose Symfony2Why we choose Symfony2
Why we choose Symfony2Merixstudio
 
Chicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - MediaflyChicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - MediaflyMediafly
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Toolsrjsmelo
 
Php through the eyes of a hoster
Php through the eyes of a hosterPhp through the eyes of a hoster
Php through the eyes of a hosterCombell NV
 
The power of linux advanced tracer [POUG18]
The power of linux advanced tracer [POUG18]The power of linux advanced tracer [POUG18]
The power of linux advanced tracer [POUG18]Mahmoud Hatem
 
Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11Combell NV
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014biicode
 
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...Valeriy Kravchuk
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php PresentationAlan Pinstein
 
AFUP Lorraine - Symfony Webpack Encore
AFUP Lorraine - Symfony Webpack EncoreAFUP Lorraine - Symfony Webpack Encore
AFUP Lorraine - Symfony Webpack EncoreEngineor
 
Kubernetes Navigation Stories – DevOpsStage 2019, Kyiv
Kubernetes Navigation Stories – DevOpsStage 2019, KyivKubernetes Navigation Stories – DevOpsStage 2019, Kyiv
Kubernetes Navigation Stories – DevOpsStage 2019, KyivAleksey Asiutin
 
The why and how of moving to php 8
The why and how of moving to php 8The why and how of moving to php 8
The why and how of moving to php 8Wim Godden
 
Expressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffExpressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffAdam Culp
 
Make your application expressive
Make your application expressiveMake your application expressive
Make your application expressiveChristian Varela
 
You're Off the Hook: Blinding Security Software
You're Off the Hook: Blinding Security SoftwareYou're Off the Hook: Blinding Security Software
You're Off the Hook: Blinding Security SoftwareCylance
 
Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)dantleech
 
Php Inside - confoo 2011 - Derick Rethans
Php Inside -  confoo 2011 - Derick RethansPhp Inside -  confoo 2011 - Derick Rethans
Php Inside - confoo 2011 - Derick RethansBachkoutou Toutou
 

Ähnlich wie Ein Stall voller Trüffelschweine - (PHP-)Profiling-Tools im Überblick (20)

2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku
 
Why we choose Symfony2
Why we choose Symfony2Why we choose Symfony2
Why we choose Symfony2
 
More about PHP
More about PHPMore about PHP
More about PHP
 
Chicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - MediaflyChicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - Mediafly
 
PHP Development Tools
PHP  Development ToolsPHP  Development Tools
PHP Development Tools
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Tools
 
Php through the eyes of a hoster
Php through the eyes of a hosterPhp through the eyes of a hoster
Php through the eyes of a hoster
 
The power of linux advanced tracer [POUG18]
The power of linux advanced tracer [POUG18]The power of linux advanced tracer [POUG18]
The power of linux advanced tracer [POUG18]
 
Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
AFUP Lorraine - Symfony Webpack Encore
AFUP Lorraine - Symfony Webpack EncoreAFUP Lorraine - Symfony Webpack Encore
AFUP Lorraine - Symfony Webpack Encore
 
Kubernetes Navigation Stories – DevOpsStage 2019, Kyiv
Kubernetes Navigation Stories – DevOpsStage 2019, KyivKubernetes Navigation Stories – DevOpsStage 2019, Kyiv
Kubernetes Navigation Stories – DevOpsStage 2019, Kyiv
 
The why and how of moving to php 8
The why and how of moving to php 8The why and how of moving to php 8
The why and how of moving to php 8
 
Expressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffExpressive Microservice Framework Blastoff
Expressive Microservice Framework Blastoff
 
Make your application expressive
Make your application expressiveMake your application expressive
Make your application expressive
 
You're Off the Hook: Blinding Security Software
You're Off the Hook: Blinding Security SoftwareYou're Off the Hook: Blinding Security Software
You're Off the Hook: Blinding Security Software
 
Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)
 
Php Inside - confoo 2011 - Derick Rethans
Php Inside -  confoo 2011 - Derick RethansPhp Inside -  confoo 2011 - Derick Rethans
Php Inside - confoo 2011 - Derick Rethans
 

Kürzlich hochgeladen

HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 

Kürzlich hochgeladen (20)

HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 

Ein Stall voller Trüffelschweine - (PHP-)Profiling-Tools im Überblick

  • 1. EIN STALL VOLLER TRÜFFELSCHWEINE (PHP)-Profiling-Tools im Überblick René Bruns - TNG Big Techday
  • 2. ÜBER MICH René Bruns  Entwickler seit 2001  seit 2009 bei Travian Games  seit 2011 Technical Director 2
  • 3. UND WER SEID IHR? 3
  • 4. UND WER SEID IHR? Entwickler? 3
  • 5. UND WER SEID IHR? Entwickler? Systemadministratoren? 3
  • 6. UND WER SEID IHR? Entwickler? Systemadministratoren? QA? 3
  • 7. UND WER SEID IHR? Entwickler? Systemadministratoren? C*O? QA? 3
  • 8. UND WER SEID IHR? Entwickler? Projektmanager? Systemadministratoren? C*O? QA? 3
  • 10. PROFILING? Profiler Es gibt unterschiedliche Problembereiche in der Softwareentwicklung, die durch ineffiziente Programmierung ausgelöst werden. Ein Profiler hilft dem Entwickler durch Analyse und Vergleich von laufenden Programmen die Problembereiche aufzudecken. http://de.wikipedia.org/wiki/Profiler_(Programmierung) 5
  • 11. AUSGANGSSITUATION SLOW!!11! 6
  • 12. PROFILING FRÜHER(?) class Main { public static function run() { $otherClass = new OtherClass(); $otherClass->doNothingImportant(); $dummy = new SlowClass(); $dummy->slowFunction(10); } } Main::run(); 7
  • 13. PROFILING FRÜHER(?) class Main { public static function run() { $start = microtime(true); printf ("Before OC: %f" . PHP_EOL, microtime(true) - $start); $otherClass = new OtherClass(); $otherClass->doNothingImportant(); printf ("After OC: %f" . PHP_EOL, microtime(true) - $start); printf ("Before SC: %f" . PHP_EOL, microtime(true) - $start); $dummy = new SlowClass(); $dummy->slowFunction(10); printf ("After SC: %f" . PHP_EOL, microtime(true) - $start); } } Main::run(); 8
  • 14. PROFILING FRÜHER(?) class Main { public static function run() { $start = microtime(true); printf ("Before OC: %f" . PHP_EOL, microtime(true) - $start); $otherClass = new OtherClass(); $otherClass->doNothingImportant(); printf ("After OC: %f" . PHP_EOL, microtime(true) - $start); printf ("Before SC: %f" . PHP_EOL, microtime(true) - $start); $dummy = new SlowClass(); $dummy->slowFunction(10); printf ("After SC: %f" . PHP_EOL, microtime(true) - $start); } } $ php Main.php Before OC: 0.000625 Main::run(); After OC: 0.004919 Before SC: 0.005099 .......... After SC: 10.013932 8
  • 15. PROFILING HEUTE  Viele verschiedene Fehlerquellen  Browser  Frontend  Backend  Datenbank  Services  Schwachstelle suchen  Vom Groben in‘s Feine 9
  • 16. SCHRITT 1: MELDUNG ÜBERPRÜFEN He‘s dead, Jim! 10
  • 17. SCHRITT 2: URSACHE EINKREISEN Browser 11
  • 18. SCHRITT 2: URSACHE EINKREISEN Browser Frontend 11
  • 19. SCHRITT 2: URSACHE EINKREISEN Browser Frontend Backend 11
  • 20. SCHRITT 2: URSACHE EINKREISEN Browser Frontend Backend DB 11
  • 21. BROWSER  Langsamer JS-Code  Zu hoher Speicherverbrauch  Zu viele CSS-Selektoren  Langsame Ladezeiten  Zu viele parallele Downloads  Offen gehaltene Verbindungen  Netzwerk  Internet  Antwort vom Server zu langsam -> Backend 12
  • 32. FRONTEND / BACKEND  Unnötige Schreib- / Lesezugriffe in Schleifen  Log-Ausgaben  Schleifen sind unnötig geschachtelt  Unnötig langsame Befehle benutzt  RegExp statt ==  Externer Service reagiert langsam  Datenbankabfrage dauert zu lange --> DB 20
  • 33. XDEBUG  PHP Extension by Derick Rethans  Kann per INI-Direktive aktiviert werden  breites Einsatzspektrum  Debugger  Profiler  Tracer  StackTrace-Formatter  ...  hoher Memory-/ CPU-/ IO-Footprint  Niemals(!) dauerhaft im Produktivbetrieb verwenden 21
  • 34. XDEBUG 22
  • 35. XDEBUG $ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir=. Main.php .......... 22
  • 36. XDEBUG $ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir=. Main.php .......... $ ls -l ca* -rwxrwxrwx 1 rene staff 4461 11 Jun 13:53 cachegrind.out.69408 22
  • 37. XDEBUG $ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir=. Main.php .......... $ ls -l ca* -rwxrwxrwx 1 rene staff 4461 11 Jun 13:53 cachegrind.out.69408 $ cat cachegrind.out.69408 version: 1 creator: xdebug 2.2.0 cmd: /Volumes/TCDATA/Sourcen/git/ProfilingTalk/Main.php part: 1 positions: line events: Time fl=/Volumes/TCDATA/Sourcen/git/ProfilingTalk/OtherClass.php fn=require_once::/Volumes/TCDATA/Sourcen/git/ProfilingTalk/OtherClass.php 1 42 fl=/Volumes/TCDATA/Sourcen/git/ProfilingTalk/SlowClass.php fn=require_once::/Volumes/TCDATA/Sourcen/git/ProfilingTalk/SlowClass.php 10 22
  • 38. XDEBUG  Cachegrind-Files können via KCachegrind, WinCachegrind, WebGrind oder PhpStorm-IDE ausgewertet werden.  Bsp. PhpStorm: 23
  • 39. XDEBUG  Cachegrind-Files können via KCachegrind, WinCachegrind, WebGrind oder PhpStorm-IDE ausgewertet werden.  Bsp. PhpStorm: 24
  • 40. XDEBUG 25
  • 41. XHPROF  PHP Extension by Facebook  Kann codeseitig aktiviert werden  Profiler only  sehr schlanker Footprint, daher auch im Livebetrieb einsetzbar (Monte Carlo-Algorithmus) 26
  • 42. XHPROF header.php: include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_lib.php'; include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_runs.php'; xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); footer.php: include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_lib.php'; include_once '/usr/lib/php/pear/xhprof_lib/utils/xhprof_runs.php'; $xhprof_data = xhprof_disable(); $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, 'testrene'); echo "http://localhost/~rene/xhprof_html/index.php?run={$run_id}&source=testrenen"; 27
  • 43. XHPROF $ php -d auto_append_fileo_prepend_file="header.php" -d auto_append_file="footer.php" Main.php .......... http://localhost/~rene/xhprof_html/index.php?run=4fd61a7e92aeb&source=testrene 28
  • 44. XHPROF $ php -d auto_append_fileo_prepend_file="header.php" -d auto_append_file="footer.php" Main.php .......... http://localhost/~rene/xhprof_html/index.php?run=4fd61a7e92aeb&source=testrene $ cat 4fd61a7e92aeb.testrene a:14:{s:23:"main()==>load::Main.php";a:5:{s:2:"ct";i:1;s:2:"wt";i:459;s:3:"cpu";i:1220;s: 2:"mu";i:10408;s:3:"pmu";i:0;}s:43:"main()==>load::ProfilingTalk/OtherClass.php";a:5:{s: 2:"ct";i:1;s:2:"wt";i:798;s:3:"cpu";i:113;s:2:"mu";i:6880;s:3:"pmu";i:0;}s: 47:"main()==>run_init::ProfilingTalk/OtherClass.php";a:5:{s:2:"ct";i:1;s:2:"wt";i:14;s:3:"cpu";i: 10;s:2:"mu";i:1104;s:3:"pmu";i:0;}s:42:"main()==>load::ProfilingTalk/SlowClass.php";a:5:{s: 2:"ct";i:1;s:2:"wt";i:467;s:3:"cpu";i:87;s:2:"mu";i:9648;s:3:"pmu";i:0;}s: 46:"main()==>run_init::ProfilingTalk/SlowClass.php";a:5:{s:2:"ct";i:1;s:2:"wt";i:9;s:3:"cpu";i: 7;s:2:"mu";i:1104;s:3:"pmu";i:0;}s:36:"OtherClass::doNothingImportant==>pow";a:5:{s: 2:"ct";i:1;s:2:"wt";i:1655;s:3:"cpu";i:926;s:2:"mu";i:1176;s:3:"pmu";i:0;}[...]} 28
  • 45. XHPROF 29
  • 46. XHPROF 30
  • 47. XHPROF 30
  • 48. DATENBANK  Unnötige Daten geladen  Kein/falscher Index benutzt  Daten werden nach der Abfrage noch sortiert  Langsame IOs  Falsche Systemeinstellungen (Buffer Sizes, ...) 31
  • 49. DB - EXPLAIN select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID = od.OrderID group by LastName, FirstName; 32
  • 50. DB - EXPLAIN select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID = od.OrderID group by LastName, FirstName; sqlite> explain query plan [...]; 0|0|0|SCAN TABLE employees AS e (~1000000 rows) 0|1|1|SEARCH TABLE orders AS o USING AUTOMATIC COVERING INDEX (EmployeeID=?) (~7 rows) 0|2|2|SEARCH TABLE Order Details AS od USING INDEX sqlite_autoindex_Order Details_1 (OrderID=?) (~10 rows) 0|0|0|USE TEMP B-TREE FOR GROUP BY 32
  • 51. DB - EXPLAIN select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID = od.OrderID group by LastName, FirstName; sqlite> explain query plan [...]; 0|0|0|SCAN TABLE employees AS e (~1000000 rows) 0|1|1|SEARCH TABLE orders AS o USING AUTOMATIC COVERING INDEX (EmployeeID=?) (~7 rows) 0|2|2|SEARCH TABLE Order Details AS od USING INDEX sqlite_autoindex_Order Details_1 (OrderID=?) (~10 rows) 0|0|0|USE TEMP B-TREE FOR GROUP BY sqlite> explain [...]; 0|Trace|0|0|0||00| 1|SorterOpen|3|5|0|keyinfo(2,BINARY,BINARY)|00| 2|Integer|0|7|0||00| 3|Integer|0|6|0||00| 4|Null|0|10|11||00| 5|Gosub|9|74|0||00| 6|Goto|0|81|0||00| 7|OpenRead|0|120|0|3|00| 32
  • 52. SCHRITT 3: ERFOLG PRÜFEN  Hat die Optimierung etwas gebracht?  Vorher-Nachher-Check  Lasttests  Tools  Apache Benchmark (AB)  JMeter 33
  • 53. APACHE BENCHMARK (AB) $ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient).....done Server Software: Apache/2.2.21 Server Hostname: localhost Server Port: 80 Document Path: /~rene/talk/Main.php Document Length: 11 bytes Concurrency Level: 10 Time taken for tests: 56.692 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 22300 bytes HTML transferred: 1100 bytes Requests per second: 1.76 [#/sec] (mean) Time per request: 5669.198 [ms] (mean) Time per request: 566.920 [ms] (mean, across all concurrent requests) Transfer rate: 0.38 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 3660 2329.9 5022 6356 Processing: 0 1758 3060.0 0 11378 Waiting: 0 1757 3059.9 0 11377 Total: 5010 5417 1403.8 5030 11378 Percentage of the requests served within a certain time (ms) 50% 5030 66% 5040 75% 5052 80% 5063 90% 6316 95% 11378 vorher 98% 11378 99% 11378 100% 11378 (longest request) 34
  • 54. APACHE BENCHMARK (AB) $ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ $ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php Benchmarking localhost (be patient).....done This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Server Software: Apache/2.2.21 Server Hostname: localhost Benchmarking localhost (be patient).....done Server Port: 80 Document Path: /~rene/talk/Main.php Server Software: Apache/2.2.21 Document Length: 11 bytes Server Hostname: localhost Server Port: 80 Concurrency Level: 10 Time taken for tests: 56.692 seconds Document Path: /~rene/talk/Main.php Complete requests: 100 Document Length: 11 bytes Failed requests: 0 Write errors: 0 Concurrency Level: 10 Total transferred: 22300 bytes Time taken for tests: 5.395 seconds HTML transferred: 1100 bytes Complete requests: 100 Requests per second: 1.76 [#/sec] (mean) Failed requests: 0 Time per request: 5669.198 [ms] (mean) Write errors: 0 Time per request: 566.920 [ms] (mean, across transferred: Total all concurrent requests) 22300 bytes Transfer rate: 0.38 [Kbytes/sec] received HTML transferred: 1100 bytes Requests per second: 18.54 [#/sec] (mean) Connection Times (ms) Time per request: 539.458 [ms] (mean) min mean[+/-sd] median max Time per request: 53.946 [ms] (mean, across all concurrent requests) Connect: 0 3660 2329.9 5022 6356 Transfer rate: 4.04 [Kbytes/sec] received Processing: 0 1758 3060.0 0 11378 Waiting: 0 1757 3059.9 0 11377 Connection Times (ms) Total: 5010 5417 1403.8 5030 11378 min mean[+/-sd] median max Connect: 0 395 217.3 531 577 Percentage of the requests served within a certain time (ms) 0 142 214.4 Processing: 1 559 50% 5030 Waiting: 0 142 214.6 0 559 66% 5040 Total: 512 538 14.9 535 577 75% 5052 80% 5063 vorher Percentage of the requests served within a certain time (ms) 90% 6316 50% 535 95% 11378 66% 541 98% 11378 75% 553 nachher 99% 11378 80% 555 100% 11378 (longest request) 90% 559 95% 559 98% 566 99% 577 100% 577 (longest request) 34
  • 55. APACHE JMETER  verteilte Lasttests  Java-Programm  Client-Server-Architektur  Testen von  HTTP/S  SOAP  DB‘s via JDBC  SMTP, POP3, IMAP  ... 35
  • 56. JMETER - TESTPLAN ERSTELLEN  Manuell oder per HTTP Proxy Server 36
  • 57. JMETER - TESTPLAN ERSTELLEN  Manuell oder per HTTP Proxy Server 37
  • 58. JMETER - TESTPLAN ERSTELLEN  Manuell oder per HTTP Proxy Server 37
  • 59. JMETER - TESTPLAN ERSTELLEN  Manuell oder per HTTP Proxy Server 37
  • 60. JMETER - USER EINLOGGEN 38
  • 61. JMETER - USER EINLOGGEN 39
  • 62. JMETER - USER EINLOGGEN 39
  • 63. JMETER - USER EINLOGGEN 39
  • 64. JMETER - USER EINLOGGEN 39
  • 65. JMETER - PARALLELE ZUGRIFFE 40
  • 66. JMETER - PARALLELE ZUGRIFFE 41
  • 68. LINKLISTE  Google Chrome: https://www.google.com/chrome  Chrome DevTools: https://developers.google.com/chrome- developer-tools/?hl=de  Xdebug: http://xdebug.org/  PHPStorm: http://www.jetbrains.com/phpstorm/  KCachegrind: http://kcachegrind.sourceforge.net  WinCacheGrind: http://sourceforge.net/projects/wincachegrind/  Webgrind: http://code.google.com/p/webgrind/  XHProf: http://php.net/xhprof  AB: http://httpd.apache.org/docs/2.0/programs/ab.html  Jmeter: http://jmeter.apache.org/ 43
  • 69. FRAGEN? GERNE AUCH SPÄTER: MAIL: R.BRUNS@TRAVIANGAMES.COM TWITTER: @RENEBRUNS

Hinweis der Redaktion

  1. * Kurz vor der Anfrage: Profiling-Situation\n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. Kennt so oder so &amp;#xE4;hnlich wahrscheinlich jeder\n
  11. \n
  12. \n
  13. \n
  14. Never trust a user\n
  15. Entlang der App-Schichten\n
  16. Entlang der App-Schichten\n
  17. Entlang der App-Schichten\n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n