Latest talks

This commit is contained in:
Derick Rethans
2011-09-01 15:42:07 +00:00
parent 1a96b028c0
commit 7bd1e3984e
95 changed files with 1001 additions and 82 deletions

106
extensions-phplondon11.xml Normal file
View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<presentation
template="css"
navmode="html"
navbarbackground="#4373b4"
navbartopiclinks="0"
navColor="#f1fbff"
logo1=""
stylesheet="presentations/slides/ezc/ez.css"
backgroundfixed="1" >
<topic>Debugging</topic>
<title>PHP Extensions - What and Why</title>
<event>PHP London</event>
<location>London, UK</location>
<date>Sep 1st, 2011</date>
<speaker>Derick Rethans</speaker>
<email>derick@derickrethans.nl</email>
<twitter>derickr</twitter>
<url>http://derickrethans.nl/talks.html</url>
<joindin></joindin>
<slide>slides/dbus/title.xml</slide>
<slide>slides/toolbox/me.xml</slide>
<!--
So you've heard that PHP supports extensions. But what are they exactly, what
can you do with them, and what *can't* you do with them? And mostly, why would
you or would you not want to spend time writing them?
This session will introduce you into what PHP extensions are, and what they can
do for you. It will cover cases of when it makes sense to write extensions and
which things you need to think of when deciding whether you want to put the
effort into writing an extension.
The talk then proceeds with a small introduction to the request cycle and PHP's
memory management. It mentions which parts of PHP you could override and which
parts you can hook into. It will also cover things that you can not do with
extensions.
examples
core ext
internal ext
external ext
pecl
zend ext
functions
classes
ini settings
hooks
- startup, shutdown
overloading:
- errors
- compile
- execute
- replacing functions
stream filters
- phar
- encryption
no syntax change
- british php
why:
- wrapping libraries
- fast, specific extensions
- replacing PHP functions
-->
<slide>slides/internals/extensions.xml</slide>
<slide>slides/internals/core-extensions.xml</slide>
<slide>slides/internals/internal-extensions.xml</slide>
<slide>slides/internals/external-extensions.xml</slide>
<slide>slides/internals/pecl.xml</slide>
<slide>slides/internals/zend-extensions.xml</slide>
<slide>slides/internals/overview.xml</slide>
<slide>slides/internals/functions.xml</slide>
<slide>slides/internals/classes-etc.xml</slide>
<slide>slides/internals/hooks.xml</slide>
<slide>slides/internals/overload.xml</slide>
<slide>slides/internals/opcodes-question.xml</slide>
<slide>slides/internals/execute5.xml</slide>
<slide>slides/internals/opcode2.xml</slide>
<slide>slides/internals/execute2.xml</slide>
<slide>slides/internals/opcode-cache.xml</slide>
<slide>slides/internals/opcode-overload2.xml</slide>
<slide>slides/internals/replacing-functions.xml</slide>
<slide>slides/internals/streams.xml</slide>
<slide>slides/internals/syntax-changes.xml</slide>
<slide>slides/internals/why-wrapping-libs.xml</slide>
<slide>slides/internals/why-fast-specific.xml</slide>
<slide>slides/internals/why-replace-php.xml</slide>
<slide>slides/internals/why-not-possible.xml</slide>
<slide>slides/internals/questions.xml</slide>
<slide>slides/internals/thanks.xml</slide>
</presentation>

61
profiling-ezc11.xml Normal file
View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<presentation
template="css"
navmode="html"
navbarbackground="#4373b4"
navbartopiclinks="0"
navColor="#f1fbff"
logo1=""
stylesheet="presentations/slides/ezc/ez.css"
backgroundfixed="1" >
<topic>Debugging</topic>
<title>Profiling PHP Applications</title>
<event>eZ Conference</event>
<location>London, UK</location>
<date>Jun 16, 2011</date>
<speaker>Derick Rethans</speaker>
<email>derick@derickrethans.nl</email>
<twitter>derickr</twitter>
<url>http://derickrethans.nl/talks.html</url>
<joindin>http://joind.in/3382</joindin>
<slide>slides/dbus/title.xml</slide>
<slide>slides/toolbox/me.xml</slide>
<!-- not everything you read on the internet *matters* -->
<!-- not everything you read on the internet is true -->
<slide>slides/profiling/does-not-matter.xml</slide>
<slide>slides/profiling/does-not-matter2.xml</slide>
<!-- benchmark -->
<slide>slides/profiling/is-it-slow.xml</slide>
<slide>slides/profiling/find-out-if-it-is-slow.xml</slide>
<slide>slides/profiling/code-or-data.xml</slide>
<slide>slides/profiling/understand-code.xml</slide>
<slide>slides/profiling/timing-points.xml</slide>
<!-- - data or code bound -->
<!-- - code with debugging/benchmarking/timingpoints -->
<!-- - check over time -->
<!-- understand your code -->
<!-- - inclued -->
<slide>slides/internals/inclued.xml</slide>
<!-- - xdebug tracing -->
<slide>slides/xdebug/why-debugger3.xml</slide>
<slide>slides/xdebug/wtf-happens.xml</slide>
<slide>slides/xdebug/functiontrace-computerized.xml</slide>
<slide>slides/xdebug/wtf-happens2.xml</slide>
<slide>slides/xdebug/trace-tools.xml</slide>
<slide>slides/xdebug/live-demo.xml</slide>
<slide>slides/xdebug/profile2.xml</slide>
<slide>slides/profiling/xhprof.xml</slide>
<slide>slides/xdebug/profiling.xml</slide>
<slide>slides/xdebug/profiling2.xml</slide>
<slide>slides/xdebug/live-demo.xml</slide>
<slide>slides/xdebug/donate.xml</slide>
<slide>slides/profiling/resources.xml</slide>
</presentation>

61
profiling-froscon11.xml Normal file
View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<presentation
template="css"
navmode="html"
navbarbackground="#4373b4"
navbartopiclinks="0"
navColor="#f1fbff"
logo1=""
stylesheet="presentations/slides/ezc/ez.css"
backgroundfixed="1" >
<topic>Debugging</topic>
<title>Profiling PHP Applications</title>
<event>FrOSCon</event>
<location>Sankt Augustin, Germany</location>
<date>Aug 20, 2011</date>
<speaker>Derick Rethans</speaker>
<email>derick@derickrethans.nl</email>
<twitter>derickr</twitter>
<url>http://derickrethans.nl/talks.html</url>
<joindin>http://joind.in/3635</joindin>
<slide>slides/dbus/title.xml</slide>
<slide>slides/toolbox/me.xml</slide>
<!-- not everything you read on the internet *matters* -->
<!-- not everything you read on the internet is true -->
<slide>slides/profiling/does-not-matter.xml</slide>
<slide>slides/profiling/does-not-matter2.xml</slide>
<!-- benchmark -->
<slide>slides/profiling/is-it-slow.xml</slide>
<slide>slides/profiling/find-out-if-it-is-slow.xml</slide>
<slide>slides/profiling/code-or-data.xml</slide>
<slide>slides/profiling/understand-code.xml</slide>
<slide>slides/profiling/timing-points.xml</slide>
<!-- - data or code bound -->
<!-- - code with debugging/benchmarking/timingpoints -->
<!-- - check over time -->
<!-- understand your code -->
<!-- - inclued -->
<slide>slides/internals/inclued.xml</slide>
<!-- - xdebug tracing -->
<slide>slides/xdebug/why-debugger3.xml</slide>
<slide>slides/xdebug/wtf-happens.xml</slide>
<slide>slides/xdebug/functiontrace-computerized.xml</slide>
<slide>slides/xdebug/wtf-happens2.xml</slide>
<slide>slides/xdebug/trace-tools.xml</slide>
<slide>slides/xdebug/live-demo.xml</slide>
<slide>slides/xdebug/profile2.xml</slide>
<slide>slides/profiling/xhprof.xml</slide>
<slide>slides/xdebug/profiling.xml</slide>
<slide>slides/xdebug/profiling2.xml</slide>
<slide>slides/xdebug/live-demo.xml</slide>
<slide>slides/xdebug/donate.xml</slide>
<slide>slides/profiling/resources.xml</slide>
</presentation>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<slide fontsize="6em">
<title>Input: Apache 2 module</title>
<blurb>PHP registers handlers for:</blurb>
<blurb>Mime types:</blurb>
<list>
<bullet>%application/x-httpd-php%</bullet>
<bullet>%application/x-httpd-php-source%</bullet>
</list>
<blurb>On a request, Apache:</blurb>
<list>
<bullet>checks for the MIME type handler</bullet>
<bullet>opens the file</bullet>
<bullet>fills a meta data record</bullet>
<bullet>hands PHP a filepointer</bullet>
</list>
</slide>

View File

@@ -0,0 +1,11 @@
<slide>
<title>Modern parts</title>
<image filename='modern-parts.jpg' align="right" attribution="http://www.flickr.com/photos/jdiggans/92981578"/>
<list>
<bullet>Classes and methods</bullet>
<bullet>Argument description</bullet>
<bullet>Dependencies on other extensions</bullet>
</list>
</slide>

14
slides/internals/cli.xml Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<slide fontsize="6em">
<title>Input: CLI</title>
<blurb>CLI binary is optimized for the command line.</blurb>
<break />
<blurb>On an invocation, PHP itself:</blurb>
<list>
<bullet>checks whether the file exists</bullet>
<bullet>fills in needed environment/SERVER variables</bullet>
<bullet>opens the file, and gives the file pointer to the parser</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

View File

@@ -0,0 +1,18 @@
<slide>
<title>Core</title>
<image filename='core-extension.jpg' align="right" attribution="http://www.flickr.com/photos/teclasorg/2852716499"/>
<blurb>ext/standard</blurb>
<list>
<bullet>Contains all the default PHP functions</bullet>
<bullet>Can not be disabled</bullet>
</list>
<break/>
<blurb>Other core extensions are:</blurb>
<list>
<bullet>ext/date</bullet>
<bullet>|888888|that's it really|</bullet>
</list>
</slide>

BIN
slides/internals/escher.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -4,7 +4,8 @@
<list fontsize="5em">
<bullet>Executor executes opcodes</bullet>
<bullet>116 or 140 different opcodes</bullet>
<bullet>150+ different opcodes for all sorts of things: ZEND_ADD, ZEND_CATCH, ZEND_BIND_TRAITS...</bullet>
<bullet>Each PHP version can introduce new ones (or remove them)</bullet>
<bullet>Per file execution</bullet>
</list>
</slide>

View File

@@ -0,0 +1,10 @@
<slide>
<title>Extension Loading</title>
<list>
<bullet>php.ini is loaded</bullet>
<bullet>zend extensions are loaded</bullet>
<bullet>extensions are loaded</bullet>
<bullet>%dl()% is problematic</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View File

@@ -0,0 +1,12 @@
<slide>
<title>What?</title>
<image filename='extension.jpg' align="right" attribution="http://www.flickr.com/photos/94466642@N00/5161663232"/>
<list>
<bullet>Extensions add functionality to PHP</bullet>
<bullet>Extensions replace functionality in PHP</bullet>
<bullet>PHP's extension mechanism is easy</bullet>
<bullet>PHP's extension mechanism is |999999|(too)| powerful</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -0,0 +1,13 @@
<slide>
<title>External</title>
<image filename='external-extension.jpg' align="right" attribution="http://www.flickr.com/photos/sarahreido/4387746215"/>
<blurb>Everything not in the core distribution</blurb>
<list>
<bullet>Are often not compiled into PHP, but instead are compiled as shared
objects</bullet>
<bullet>Sometimes make their way into the core distribution, and sometimes
they are moved away</bullet>
</list>
</slide>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<slide fontsize="6em">
<title>Input: FastCGI</title>
<blurb>Useful for Lighttpd and IIS</blurb>
<break />
<blurb>FastCGI runs as a daemon:</blurb>
<list>
<bullet>Process control by the webserver</bullet>
<bullet>Request logic through the FastCGI module</bullet>
</list>
<example>
fastcgi.server = ( ".php" =>
((
"bin-path" => "/usr/local/php/5.3dev/bin/php-cgi",
"socket" => "/tmp/php80.socket",
"max-procs" => 1,
"idle-timeout" => 20,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "1",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"bin-copy-environment" => (
"PATH", "SHELL", "USER"
),
"broken-scriptfilename" => "enable"
))
)
</example>
</slide>

19
slides/internals/fpm.xml Normal file
View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<slide fontsize="6em">
<title>Input: FastCGI Process Manager (FPM)</title>
<blurb>Replacement for FastCGI?</blurb>
<break />
<blurb>FPM manages a pool of PHP daemons:</blurb>
<break />
<example>
fastcgi.server = ( ".php" =>
((
"host" => "127.0.0.1",
"port" => "9020"
))
)
</example>
<blurb>http://svn.php.net/viewvc/php/php-src/trunk/sapi/fpm/php-fpm.conf.in?revision=305775&amp;view=markup</blurb>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -0,0 +1,12 @@
<slide>
<title>Traditional parts</title>
<image filename='parts.jpg' align="right" attribution="http://www.flickr.com/photos/bensutherland/4451724655"/>
<list>
<bullet>Module init/shutdown</bullet>
<bullet>Request init/shutdown</bullet>
<bullet>Functions</bullet>
<bullet>Configuration (INI) settings</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -1,28 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<slide fontsize="6em">
<title>Garbage Collection</title>
<slide>
<title>Garbage Collections</title>
<subtitle>Garbage Creation</subtitle>
<list>
<bullet>Collects all the variable containers into a buffer</bullet>
<bullet>Once buffer is full, the algorithm runs to reclaim space</bullet>
<bullet>Can be turned on and off at will: *gc_enable()*, *gc_disable()*</bullet>
<bullet>Drastically reduces memory usage for testing eZ Components (2.4GB->500MB)</bullet>
</list>
<example>
GC Statistics
-------------
Runs: 124
Collected: 2434961
Root buffer length: 4
Root buffer peak: 10000
<example>$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );</example>
Possible Remove from Marked
Root Buffered buffer grey
-------- -------- ----------- ------
ZVAL 13233645 2444651 2106657 18967079
ZOBJ 41671687 2120597 1218587 2475517
</example>
<!--
# vim: encoding=utf8
-->
<example>a: (refcount=1, is_ref=0)=array (
'meaning' => (refcount=1, is_ref=0)='life',
'number' => (refcount=1, is_ref=0)=42
)</example>
<image align="center" filename="gc-part1-figure1.png" />
</slide>

16
slides/internals/gc2.xml Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Garbage Creation</subtitle>
<example>$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );</example>
<example>a: (refcount=1, is_ref=0)=array (
'meaning' => (refcount=2, is_ref=0)='life',
'number' => (refcount=1, is_ref=0)=42,
'life' => (refcount=2, is_ref=0)='life'
)</example>
<image align="center" filename="gc-part1-figure2.png" />
</slide>

15
slides/internals/gc3.xml Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Garbage Creation</subtitle>
<example><![CDATA[$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );]]></example>
<example>a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...
)</example>
<image align="center" filename="gc-part1-figure3.png" />
</slide>

15
slides/internals/gc4.xml Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Garbage Creation</subtitle>
<example><![CDATA[$a = array( 'one' );
$a[] =& $a;
unset( $a );]]></example>
<example>(refcount=1, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=1, is_ref=1)=...
)</example>
<image align="center" filename="gc-part1-figure4.png" />
</slide>

7
slides/internals/gc5.xml Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Cleaning Up</subtitle>
<image align="center" filename="gc-part2-figure1.png" />
</slide>

18
slides/internals/gc6.xml Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Cleaning Up</subtitle>
<blurb>Some general statements:</blurb>
<list>
<bullet>If a refcount is increased, it's still in use and therefore not garbage.</bullet>
<bullet>If the refcount is decreased and hits zero, the zval can be freed and is thus not garbage.</bullet>
<bullet>So only refcount decrements to a non-zero value need to be checked.</bullet>
</list>
<break/>
<blurb>
The basic algorithm checks whether it is possible to decrease their refcount by
one, and then check which of the zvals have a refcount of zero.
</blurb>
</slide>

7
slides/internals/gc7.xml Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Cleaning Up</subtitle>
<image align="center" filename="gc-part2-figure2.png" pdf-scale="0.6"/>
</slide>

13
slides/internals/gc8.xml Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<slide>
<title>Garbage Collections</title>
<subtitle>Cleaning Up</subtitle>
<list>
<bullet>The buffer contains 10.000 entries</bullet>
<bullet>GC can be turned on or off (%zend.enable_gc()% and %gc_enable()%/%gc_disable()%).</bullet>
<bullet>Force collection with %gc_collect_cycles()%.</bullet>
<bullet>There are still some bugs.</bullet>
</list>
</slide>

BIN
slides/internals/hooks.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,19 @@
<slide>
<title>Extension hooks</title>
<image filename='hooks.jpg' align="right" attribution="http://www.flickr.com/photos/rogerss1/2770106311"/>
<blurb>Normal extensions</blurb>
<list>
<bullet>Module and request init and shutdown; and post module deinitialisation</bullet>
<bullet>phpinfo()</bullet>
</list>
<break/>
<blurb>Zend extensions</blurb>
<list>
<bullet>statement calls</bullet>
<bullet>all sorts of internal handlers: activate/deactivate functions,
op_array handler, op_array contructor and destructor</bullet>
</list>
</slide>

View File

@@ -22,11 +22,11 @@ dot -Tpng -o inclued-classes.png inclued.out.dot</example>
<div effect="fade-in-out">
<blurb>Include overview: %inclued-includes.png%:</blurb>
<image filename="inclued-includes.png"/>
<image filename="inclued-includes.png" y-offset="12" pdf-float="1" x-offset="1" pdf-scale="0.5"/>
</div>
<div effect="fade-in-out">
<blurb>Class hiearchy: %inclued-classes.png%:</blurb>
<image filename="inclued-classes.png"/>
<image filename="inclued-classes.png" y-offset="12" pdf-float="1" x-offset="16" pdf-scale="0.5"/>
</div>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@@ -0,0 +1,11 @@
<slide>
<title>Internal</title>
<image filename='internal-extension.jpg' align="right" attribution="http://www.flickr.com/photos/quakecon/3416461263"/>
<blurb>Everything in ext/</blurb>
<list>
<bullet>Are compiled into PHP</bullet>
<bullet>Can most of the time be compiled as shared extensions as well ← distributions like to do that |888888|(too much)|</bullet>
</list>
</slide>

View File

@@ -0,0 +1,11 @@
<slide>
<title>Variables</title>
<subtitle>Compiler Types</subtitle>
<example><![CDATA[#define IS_CONST (1<<0)
#define IS_TMP_VAR (1<<1)
#define IS_VAR (1<<2)
#define IS_UNUSED (1<<3) /* Unused variable */
#define IS_CV (1<<4) /* Compiled variable */
]]></example>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@@ -0,0 +1,9 @@
<slide>
<title>Namespaces</title>
<list>
<bullet>Allow shorter class names</bullet>
<bullet>Is basically glorified copy&amp;paste</bullet>
<bullet>No support for %use foobar\\*%</bullet>
</list>
</slide>

View File

@@ -0,0 +1,25 @@
<slide>
<title>Namespaces</title>
<example><![CDATA[<?php
namespace foobar;
class log
{
function logThat($message)
{
echo "Logging {$message}\n";
}
}
?>]]></example>
<blurb>foobarlog.php</blurb>
<break/>
<example><![CDATA[<?php
require 'foobarlog.php';
use foobar\log as log;
$log = new \foobar\log;
$log = new log;
$log->logThat( "yeah!" );
?>]]></example>
<blurb>namespace.php</blurb>
</slide>

View File

@@ -0,0 +1,26 @@
<slide>
<title>Namespaces</title>
<example><![CDATA[
line # * op fetch ext return operands
---------------------------------------------------------------------------------
]]></example>
<example><![CDATA[
5 5 EXT_STMT
6 ZEND_FETCH_CLASS :1 'foobar%5Clog'
7 EXT_FCALL_BEGIN
8 NEW $2 :1
9 DO_FCALL_BY_NAME 0
10 EXT_FCALL_END
11 ASSIGN !0, $2
]]></example>
<example><![CDATA[
6 12 EXT_STMT
13 ZEND_FETCH_CLASS :5 'foobar%5Clog'
14 EXT_FCALL_BEGIN
15 NEW $6 :5
16 DO_FCALL_BY_NAME 0
17 EXT_FCALL_END
18 ASSIGN !0, $6
]]></example>
</slide>

View File

@@ -2,8 +2,7 @@
<title>Compiler Caches</title>
<subtitle>How it works</subtitle>
<image filename="execute-cache.png" class="spaced" pdf-scale="0.6"/>
<break lines="5"/>
<image filename="execute-cache2.png" class="spaced" pdf-scale="0.6"/>
<list>
<bullet>In general, each source file is compiled once</bullet>
<bullet>Compilation overhead becomes inconsequential</bullet>

View File

@@ -0,0 +1,17 @@
<slide>
<title>Opcode overloading</title>
<image filename='overload.jpg' align="right" attribution="http://www.flickr.com/photos/3059349393/3709115244"/>
<blurb>|00bb00|Good:|</blurb>
<list>
<bullet>*Scream:* For making PHP ignore the %@% operator</bullet>
<bullet>*Xdebug:* For code coverage, and for making PHP ignore the %@% operator</bullet>
</list>
<break/>
<blurb>|dd0000|Bad:|</blurb>
<list>
<bullet>*Operator*: Allows for operator overloading|888888|, but also demands that you hand over your first-born|</bullet>
</list>
</slide>

View File

@@ -8,11 +8,19 @@
<bullet>One for every script element</bullet>
</list>
<blurb>Contains execution info for a function</blurb>
<list>
<bullet>name, filename, flags, start and end line, doc block</bullet>
<bullet>argument information</bullet>
<bullet>opcodes that contain instructions</bullet>
</list>
<blurb>Opcode</blurb>
<list fontsize="4em" marginleft="2em">
<bullet>Basic execution unit</bullet>
<bullet>Two operands</bullet>
<bullet>One result</bullet>
<bullet>%znode%s during compilation, %zend_op% containing everything at runtime</bullet>
</list>
</slide>

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<slide fontsize="6em">
<title>Compiling</title>
<subtitle>Diagram</subtitle>
<title>Compiling: Diagram</title>
<break lines="2"/>
<image align="center" filename="compile.png" pdf-scale="1.0"/>
</slide>

View File

@@ -0,0 +1,17 @@
<slide>
<title>Opcode overloading</title>
<image filename='overload.jpg' align="right" attribution="http://www.flickr.com/photos/3059349393/3709115244"/>
<blurb>Good:</blurb>
<list>
<bullet>*Scream:* For making PHP ignore the %@% operator</bullet>
<bullet>*Xdebug:* For code coverage, ignoring the %@% operator</bullet>
</list>
<break/>
<blurb>|dd0000|Bad:|</blurb>
<list>
<bullet>*Operator*: Allows for operator overloading|888888|, but also demands your first-born|</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@@ -0,0 +1,13 @@
<slide>
<title>Overloading</title>
<image filename='overload.jpg' align="right" attribution="http://www.flickr.com/photos/3059349393/3709115244"/>
<list>
<bullet>Error handler: Xdebug, SOAP</bullet>
<bullet>Exception throwing handler</bullet>
<bullet>Compiler and executor: APC and other caches, funcall, Xdebug</bullet>
<bullet>Setting of headers</bullet>
<bullet>Opcodes: Xdebug|aaaaaa|, operator|</bullet>
</list>
</slide>

View File

@@ -0,0 +1,12 @@
<slide>
<title>Overview</title>
<list>
<bullet>Request Cycle</bullet>
<bullet>Parsing and Compiling</bullet>
<bullet>Execution Internals</bullet>
<bullet>Run-time vs. compile-time</bullet>
<bullet>Variables and Garbage Collection</bullet>
<bullet>Execution Internals</bullet>
</list>
</slide>

View File

@@ -0,0 +1,40 @@
<slide>
<title>A few examples...</title>
<list class="tiny">
<bullet>*Core distribution:* bcmath *bz2* calendar com_dotnet ctype curl date
dba dom enchant ereg exif fileinfo filter ftp *gd* gettext gmp hash iconv
imap interbase intl *json* ldap libxml mbstring mcrypt mssql mysql mysqli
mysqlnd oci8 odbc openssl pcntl *pcre* pdo pdo_dblib pdo_firebird pdo_mysql
pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline
recode *reflection* *session* shmop simplexml skeleton snmp soap sockets spl
sqlite sqlite3 *standard* sybase_ct sysvmsg sysvsem sysvshm tidy tokenizer
wddx xml *xmlreader* xmlrpc xmlwriter xsl zip zlib</bullet>
<bullet>*PECL:* activescript adt amfext amqp apache_accessor *apc* apd apm
archive ares automap axis2 bbcode bcompiler bitset blenc bloomy bz2_filter
cairo chasen *classkit* colorer courierauth cpdf crack cubrid cvsclient
cybercash cybermut cyrus daffodildb date dazuko db dbase dbdo dbplus dbus
dbx demoext *dio* docblock domxml doublemetaphone drizzle dtrace ecasound
enchant *esmtp* etpan event expect fam fbsql fdf ffi filepro flitetts
framegrab freeimage fribidi fuse gdchart *gearman* gender geoip gmagick gnupg
gupnp haru hidef html_parse htscanner http hwapi hyperwave ibm_db2 id3 idn
iisfunc imagick ims inclued informix ingres inotify intercept intl iptcdata
ixsfunc judy kadm5 kakasi krb5 ktaglib lchash libevent libexif litespeed
llvm lua lzf mailparse markdown maxdb mcal mcrypt_filter mcve mdbtools
memcache *memcached* memsession memtrack ming mnogosearch mono mqseries
msession msql muscat myphp mysqlnd_mc mysqlnd_ms mysqlnd_pscache mysqlnd_qc
mysqlnd_sip mysqlnd_uh namazu ncurses Net_Gopher netools newt notes ntuser
oauth ocal *oggvorbis* openal opendirectory openssl operator optimizer oracle
ovrimos pam paradox params parsekit parse_tree pdf pdo_4d pdo_ibm pdo_ids
pdo_informix pdo_user *perl* pfpro phar philter phk phpdoc picosql
pop3 prephp preprocessor printer proctitle ps python qtdom radius rar rb
rpc rpmreader rrd rsvg rsync runkit sam sasl satellite scream sdo selinux
servlet session_pgsql shp simple_cvs smbc smtp sndfile solr sphinx
spl_types spplus spread sqlite ssdeep ssh2 statgrab stats stem stomp svn
swf swish sybase tcc tclink tcpwrap tdb tests textcat threads timezonedb
*translit* txforward unicode uploadprogress usblib uuid v8js valkyrie varnish
vpopmail w32api wbxml weakref win32ps win32scheduler win32service win32std
*wincache* wxwidgets xattr *xdiff* xdom xhprof xmgrace xml xmlrpci xmms xquery
xrange xslcache xslt yaf yami yaml yaz yp zeroconf zip zlib_filter</bullet>
</list>
</slide>

View File

@@ -8,7 +8,7 @@
<bullet>Lexical analyze script source</bullet>
<bullet>Divide into logical blocks of characters</bullet>
<bullet>Give special blocks a meaning</bullet>
<bullet>%flex% (but only 2.5.4!)</bullet>
<bullet>%re2c% (%flex% originally)</bullet>
</list>
<blurb>The Parse Error: </blurb>

BIN
slides/internals/parts.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

14
slides/internals/pecl.xml Normal file
View File

@@ -0,0 +1,14 @@
<slide>
<title>PECL</title>
<image filename='pickles.jpg' align="right" attribution="http://www.flickr.com/photos/24013072@N05/6027561697"/>
<blurb>PECL: PHP Extension C Library</blurb>
<list>
<bullet>http://pecl.php.net</bullet>
<bullet>A whole load of extensions for various interesting (and odd things)</bullet>
<bullet>Are installed with the *PECL* tool</bullet>
<bullet>Used to be called "Siberia"</bullet>
<bullet>Don't really have to be hosted in PHP's SVN repository, on the PECL website</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -0,0 +1,12 @@
<slide>
<title>Replacing functions</title>
<image filename='function.jpg' align="right" attribution="http://www.flickr.com/photos/vestman/4908148942"/>
<list>
<bullet>Replaces a function pointer in the symbol table with a new one</bullet>
<bullet>You can also use it for methods</bullet>
<bullet>Xdebug uses it to replace %var_dump% with %xdebug_var_dump%</bullet>
<bullet>You can only replace internal functions |888888|(unless you're %runkit%/%classkit% and you'd like some pain)|</bullet>
</list>
</slide>

View File

@@ -0,0 +1,9 @@
<slide>
<title>Runtime vs Compile-time Inheritance</title>
<list>
<bullet>%__autoload()% vs. %require()%/%include()%</bullet>
<bullet>early/late binding</bullet>
<bullet>Consequences for opcode-caches</bullet>
</list>
</slide>

View File

@@ -0,0 +1,31 @@
<slide>
<title>Runtime vs Compile-time Inheritance</title>
<example><![CDATA[<?php
abstract class gargleblaster
{
abstract function make();
}
?> ]]></example>
<blurb>gargleblaster.php</blurb>
<break/>
<example><![CDATA[<?php
class slartibartfast extends gargleblaster
{
function make()
{
echo "Aw\n";
}
}
?>]]></example>
<blurb>slartibartfast.php</blurb>
<break/>
<example><![CDATA[<?php
require 'gargleblaster.php';
require 'slartibartfast.php';
$a = new slartibartfast();
?>]]></example>
<blurb>abstract-compiletime.php</blurb>
</slide>

View File

@@ -0,0 +1,33 @@
<slide>
<title>Runtime vs Compile-time Inheritance</title>
<example><![CDATA[<?php
abstract class gargleblaster
{
abstract function make();
}
?> ]]></example>
<blurb>gargleblaster.php</blurb>
<break/>
<example><![CDATA[<?php
class slartibartfast extends gargleblaster
{
function make()
{
echo "Aw\n";
}
}
?>]]></example>
<blurb>slartibartfast.php</blurb>
<break/>
<example><![CDATA[<?php
function __autoload($className)
{
require "{$className}.php";
}
$a = new slartibartfast();
?>]]></example>
<blurb>abstract-compiletime.php</blurb>
</slide>

View File

@@ -0,0 +1,30 @@
<slide>
<title>Runtime vs Compile-time Inheritance</title>
<example><![CDATA[filename: /home/httpd/html/test/runtime-compiletime/slartibartfast.php
function name: (null)
number of ops: 5
compiled vars: none
line # * op fetch ext return operands
--------------------------------------------------------------------------------
3 0 > EXT_STMT
1 NOP
2 NOP
15 3 EXT_STMT
4 > RETURN 1]]></example>
<blurb>Compile-time</blurb>
<break/>
<example><![CDATA[filename: /home/httpd/html/test/runtime-compiletime/slartibartfast.php
function name: (null)
number of ops: 5
compiled vars: none
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > EXT_STMT
1 ZEND_FETCH_CLASS :0 'gargleblaster'
2 ZEND_DECLARE_INHERITED_CLASS $1 '%00slartibartfast%2Fhome%2Fhttpd%2Fhtml%2Ftest%2Fruntime-compiletime%2Fslartibartfast.php0x7f1d791d8031', 'slartibartfast'
15 3 EXT_STMT
4 > RETURN 1]]></example>
<blurb>Run-time</blurb>
</slide>

BIN
slides/internals/stream.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

@@ -0,0 +1,10 @@
<slide>
<title>Streams</title>
<image filename='stream.jpg' align="right" attribution="http://www.flickr.com/photos/quinet/2786214505"/>
<list>
<bullet>*Wrappers:* Wrap around file reading and writing operations with a "protocol" (f.e.: %http://compress.bzip2%)</bullet>
<bullet>*Filters:* On the fly encrypting/decrypting filter (f.e.: *mcrypt_filter*)</bullet>
</list>
</slide>

View File

@@ -0,0 +1,20 @@
<slide>
<title>British PHP</title>
<image filename='union-jack.jpg' align="right" attribution="http://www.flickr.com/photos/princess_l_88/5657601138/"/>
<example><![CDATA[<?php
$marmiteIsFor = 'trashcan';
echo 'Hello World.';
?>]]></example>
<blurb align="center"></blurb>
<example><![CDATA[<?php
£marmiteIsFor = 'biscuits';
announce 'Good morrow, fellow subjects of the Crown.';
?>]]></example>
<list>
<bullet>Sadly, this you can't do.</bullet>
<bullet>However...</bullet>
</list>
</slide>

View File

@@ -0,0 +1,8 @@
<slide template="white" type="title">
<title>Thanks!</title>
<break lines="8"/>
<blurb class="event-presenter">Derick Rethans - :-:email:-: - twitter: @:-:twitter:-:</blurb>
<blurb class="pres-url-small">:-:url:-:</blurb>
<blurb class="pres-url-small">:-:joindin:-:</blurb>
</slide>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<slide>
<title>Threaded Web Servers</title>
<list>
<bullet>PHP is thread safe</bullet>
<bullet>Most extensions are thread safe</bullet>
<bullet>Whether libraries are, it depends</bullet>
<bullet>FastCGI/FPM is your solution</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<slide fontsize="6em">
<title>Variables</title>
<subtitle>Objects in PHP 4</subtitle>
<image align="center" filename="object-php4.png" pdf-scale="0.45"/>
</slide>

View File

@@ -3,8 +3,5 @@
<title>Variables</title>
<subtitle>Objects in PHP 5</subtitle>
<image align="center" filename="object-php5.png" pdf-scale="0.5"/>
<!--
# vim: encoding=utf8
-->
<image align="center" filename="object-php5.png" pdf-scale="0.4"/>
</slide>

View File

@@ -9,13 +9,10 @@
<bullet>main script</bullet>
<bullet>function</bullet>
<bullet>class method</bullet>
<bullet>path analysis and dead code analysis</bullet>
</list>
<break/>
<blurb>Usage:</blurb>
<example><![CDATA[cvs -d :pserver:cvsread@cvs.xdebug.org:/repository login
# passwd = srmread
cvs -d :pserver:cvsread@cvs.xdebug.org:/repository co -d vld vle
cd vld
phpize && make && make install
<example><![CDATA[pecl install vld
php -dextension=vld.so -dvld.active=1 script.php]]></example>
</slide>

View File

@@ -0,0 +1,11 @@
<slide>
<title>Why extensions?</title>
<subtitle>They are faster than raw PHP code</subtitle>
<image filename='concorde.jpg' align="right" attribution="http://www.flickr.com/photos/james_gordon_los_angeles/5597919621"/>
<list>
<bullet>It's just too slow in normal PHP: %ssh2%, %openssl%</bullet>
<bullet>Specific uses: %QuickHash%</bullet>
</list>
</slide>

View File

@@ -0,0 +1,10 @@
<slide>
<title>Why extensions?</title>
<subtitle>Impossible in just PHP</subtitle>
<image filename='escher.jpg' align="right" attribution="http://www.flickr.com/photos/robbie73/2644689893"/>
<list>
<bullet>Not everything is possible in pure PHP: %apc%, %com%, %xdebug%, %xhprof%</bullet>
</list>
</slide>

View File

@@ -0,0 +1,10 @@
<slide>
<title>Why extensions?</title>
<subtitle>Performance bottlenecks</subtitle>
<image filename='replace-php.jpg' align="right" attribution="http://www.flickr.com/photos/thatguyfromcchs08/2300190277/"/>
<list>
<bullet>Your code is really slow, and need something quicker: %twig%</bullet>
</list>
</slide>

View File

@@ -0,0 +1,13 @@
<slide>
<title>Why extensions?</title>
<subtitle>Wrapping libraries</subtitle>
<image filename='wrap.jpg' align="right"/>
<list>
<bullet>General use libraries: %re2%</bullet>
<bullet>Specific use libraries: %cybermut%, %pam%</bullet>
<bullet>Libraries that you have written yourself, or your company</bullet>
<bullet>Missing database support, or new webscale things like %mongodb%</bullet>
</list>
</slide>

BIN
slides/internals/wrap.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

View File

@@ -0,0 +1,12 @@
<slide>
<title>"Zend" Extensions</title>
<image filename='zend-sand.jpg' align="right" attribution="http://www.flickr.com/photos/mikebaird/3464803900"/>
<blurb>Zend Extensions</blurb>
<list>
<bullet>Provide a few more (very specialized hooks)</bullet>
<bullet>Are not necessarily made by Zend (the company)</bullet>
<bullet>Xdebug is one of them!</bullet>
</list>
</slide>

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

33
slides/internals/zval.xml Normal file
View File

@@ -0,0 +1,33 @@
<slide>
<title>Variables</title>
<subtitle>The Zed-val</subtitle>
<example><![CDATA[typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};]]></example>
<example>#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9</example>
</slide>

View File

@@ -3,12 +3,12 @@
<title>PHP Accelerators</title>
<list>
<li>*APC*: active development, PHP license</li>
<li>*eAcclerator*: GPL</li>
<li>*PHP Accelerator*: updated, but not improved</li>
<li>*Turck MM Cache*: abandonned</li>
<li>*XCache*: new</li>
<li>*Zend Platform*: commercial</li>
<bullet>*APC*: active development, PHP license</bullet>
<bullet>*eAcclerator*: GPL</bullet>
<bullet>*PHP Accelerator*: updated, but not improved</bullet>
<bullet>*Turck MM Cache*: abandonned</bullet>
<bullet>*XCache*: new</bullet>
<bullet>*Zend Platform*: commercial</bullet>
</list>
</slide>

View File

@@ -2,7 +2,7 @@
<title>Compiler Caches</title>
<subtitle>How it works</subtitle>
<image filename="how_ccache.png" class="spaced" pdf-scale="0.6"/>
<image filename="execute-cache.png" class="spaced" pdf-scale="0.6"/>
<break lines="5"/>
<list>
<bullet>In general, each source file is compiled once</bullet>

View File

@@ -2,7 +2,7 @@
<title>Compiler Caches</title>
<subtitle>What can be optimized</subtitle>
<image filename="lifecycle.png" class="spaced"/>
<image filename="execute-normal.png" class="spaced"/>
<break lines="5"/>
<list>
<bullet>This cycle happens for every include file, not just for the "main" script</bullet>

View File

@@ -2,7 +2,7 @@
<title>Is it my code that is slow?</title>
<div effect="fade-out">
<blurb>There could be multiple reasons why the application is slow:</blurb>
<blurb>Multiple possible reasons:</blurb>
<list>
<bullet>The database is slow</bullet>
<bullet>There is lots of IO</bullet>

View File

@@ -3,11 +3,11 @@
<div effect="fade-out">
<break lines="10"/>
<blurb class="large" align="center">I can only say one thing</blurb>
<blurb class="large" align="center">I can only say one thing:</blurb>
</div>
<div effect="fade-in">
<break lines="3"/>
<image filename="bullshit.png" align="center" pdf-scale="0.8"/>
<image filename="bullshit.png" align="center" x-offset="13" pdf-scale="0.7" y-offset="2" float="1"/>
</div>
</slide>

View File

@@ -6,7 +6,6 @@
<bullet>check ~/.siegerc and set the %logfile% setting</bullet>
<bullet>Create a file with urls:<example><![CDATA[http://derickrethans.nl/
http://derickrethans.nl/spatial-indexes-data-sqlite.html
http://derickrethans.nl/using-openstreetmap-with-flickr.html
http://derickrethans.nl/who.html]]></example></bullet>
<bullet>run against your code: %siege -c 4 -r 10 -f /tmp/urls.txt%</bullet>
</list>

View File

@@ -11,43 +11,37 @@
<div effect="fade-in-out">
<blurb>eZ Publish:</blurb>
<image filename="ezpublish-time.png"/>
<image filename="ezpublish-time.png" pdf-scale="0.4" y-offset="2.0" x-offset="19" pdf-float="1"/>
</div>
<div effect="fade-in-out">
<blurb>Symfony:</blurb>
<image filename="symfony-time.png"/>
<image filename="symfony-time.png" pdf-scale="0.4" y-offset="8.25" x-offset="19" pdf-float="1"/>
</div>
<div effect="fade-in-out">
<blurb>Zeta Components:</blurb>
<image align="right" filename="zeta-time.png"/>
<image align="right" filename="zeta-time.png" pdf-scale="0.4" y-offset="13.5" x-offset="19" pdf-float="1"/>
<example><![CDATA[<?php
// Get the one and only instance of the ezcDebug.
$debug = ezcDebug::getInstance();
// Start the accumulator.
$debug->startTimer( "Program runtime", "Accumulators" );
$debug->switchTimer( "Start", "Program runtime" );
// The name of the timer is: "Hello world" and it will be
// placed in the group: "output".
$debug->startTimer ("Hello world", "output" );
echo "Hello world<br/>";
$debug->stopTimer( "Hello world" );
// Replace the "Start" timer for "Half the way".
$debug->switchTimer( "Half the way", "Start" );
// Measure the time of writing "cruel world".
$debug->startTimer( "Goodbye cruel world", "output" );
echo "Goodbye cruel world<br/>";
$debug->stopTimer( "Goodbye cruel world" );
// Stop the last timer.
$debug->switchTimer( "Stop", "Half the way" );
$debug->stopTimer( "Stop" );
// Get HTML output.
$output = $debug->generateOutput();
?>]]></example>

View File

@@ -93,7 +93,7 @@ extension=htscanner.so</example>
</div>
<div effect="fade-in-out">
<image filename="xhgui.png"/>
<image filename="xhgui.png" pdf-scale="0.5" x-offset="16"/>
</div>
</slide>

View File

@@ -4,7 +4,7 @@
<break lines="3"/>
<blurb>Derick Rethans</blurb>
<image filename="../tdd/derick_photo.jpg" align="right" pdf-scale="0.2"/>
<image filename="../tdd/derick_photo.jpg" align="right" pdf-float="1" x-offset="21.3" pdf-scale="0.25"/>
<list>
<bullet>Dutchman living in London</bullet>
<bullet>PHP development</bullet>

View File

@@ -3,7 +3,7 @@
<title>Profiling</title>
<subtitle>KCacheGrind's Call Graph and Source Annotations</subtitle>
<image filename="pg4.png" marginright="2em" align="right" pdf-scale="0.3"/>
<image filename="pg4.png" marginright="2em" align="right" pdf-float="1" x-offset="15" y-offset="0" pdf-scale="0.6"/>
<break/>
<list fontsize="4em">
<bullet>Call graph</bullet>

View File

@@ -4,9 +4,9 @@
<div effect="fade-out">
<blurb>One bundled with Xdebug:</blurb>
<example>
php ~/dev/php/xdebug/trunk/contrib/tracefile-analyser.php
php ~/dev/php/xdebug/trunk/contrib/tracefile-analyser.php time-own 5
...
Showing the 25 most costly calls sorted by 'time-own'.
Showing the 5 most costly calls sorted by 'time-own'.
Inclusive Own
function #calls time memory time memory
@@ -16,20 +16,6 @@ preg_match 2986 0.3718 1016336
{main} 1 6.4562 7335704 0.3476 -15198832
next 432 0.2386 0 0.2386 0
count 3302 0.2132 0 0.2123 0
ezcQuerySelectSqlite->from 434 0.4076 715880 0.1522 -663944
ezcDocumentRstTokenizer->tokenizeString 1 0.4426 817840 0.1431 435888
ezcQuery::arrayFlatten 1303 0.1929 780360 0.1344 642792
drBlogApi->fetchMetaData 433 0.3938 2381928 0.1160 -1440896
ezcQuerySelect->select 434 0.2590 189496 0.1099 -437048
ezcQueryExpression->getIdentifier 870 0.1937 0 0.1093 -603752
ezcQuerySelect->where 435 0.2155 104792 0.0917 -537512
PDO->prepare 434 0.0885 622072 0.0885 622072
array_key_exists 107 0.0884 0 0.0884 0
join 1740 0.0882 258264 0.0882 258264
ezcDocumentRstParser->parse 4 2.3933 1427376 0.0757 -140208
ezcBase::loadFile 88 0.1599 5988856 0.0747 3585136
ezcDocumentRstStack->shift 715 1.0971 -59360 0.0719 80520
DateTime->__construct 866 0.0710 488 0.0710 488
</example>
</div>
<div effect="fade-in-out">

View File

@@ -7,6 +7,6 @@
<bullet>About 8 years old</bullet>
<bullet>Works on "every" operating system</bullet>
<bullet>Version 2.1 released earlier this year</bullet>
<bullet>PHP 5.1, 5.2, 5.3 and trunk</bullet>
<bullet>PHP 5.1, 5.2, 5.3, 5.4 and trunk</bullet>
</list>
</slide>