Latest talks
106
extensions-phplondon11.xml
Normal 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
@@ -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
@@ -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>
|
||||
20
slides/internals/apache2-module.xml
Normal 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>
|
||||
11
slides/internals/classes-etc.xml
Normal 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
@@ -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>
|
||||
BIN
slides/internals/concorde.jpg
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
slides/internals/core-extension.jpg
Normal file
|
After Width: | Height: | Size: 187 KiB |
18
slides/internals/core-extensions.xml
Normal 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
|
After Width: | Height: | Size: 117 KiB |
BIN
slides/internals/execute-cache2.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
@@ -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>
|
||||
|
||||
10
slides/internals/extension-loading.xml
Normal 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>
|
||||
BIN
slides/internals/extension.jpg
Normal file
|
After Width: | Height: | Size: 129 KiB |
12
slides/internals/extensions.xml
Normal 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>
|
||||
BIN
slides/internals/external-extension.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
13
slides/internals/external-extensions.xml
Normal 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>
|
||||
31
slides/internals/fastcgi.xml
Normal 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
@@ -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&view=markup</blurb>
|
||||
</slide>
|
||||
BIN
slides/internals/function.jpg
Normal file
|
After Width: | Height: | Size: 52 KiB |
12
slides/internals/functions.xml
Normal 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>
|
||||
BIN
slides/internals/gc-part1-figure1.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
slides/internals/gc-part1-figure2.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
slides/internals/gc-part1-figure3.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
slides/internals/gc-part1-figure4.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
slides/internals/gc-part2-figure1.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
slides/internals/gc-part2-figure2.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
After Width: | Height: | Size: 28 KiB |
19
slides/internals/hooks.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
BIN
slides/internals/internal-extension.jpg
Normal file
|
After Width: | Height: | Size: 172 KiB |
11
slides/internals/internal-extensions.xml
Normal 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>
|
||||
11
slides/internals/internal-variable-types.xml
Normal 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>
|
||||
BIN
slides/internals/modern-parts.jpg
Normal file
|
After Width: | Height: | Size: 96 KiB |
9
slides/internals/namespaces2.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<slide>
|
||||
<title>Namespaces</title>
|
||||
|
||||
<list>
|
||||
<bullet>Allow shorter class names</bullet>
|
||||
<bullet>Is basically glorified copy&paste</bullet>
|
||||
<bullet>No support for %use foobar\\*%</bullet>
|
||||
</list>
|
||||
</slide>
|
||||
25
slides/internals/namespaces3.xml
Normal 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>
|
||||
26
slides/internals/namespaces4.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
17
slides/internals/opcode-overload2.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
17
slides/internals/opcodes-question.xml
Normal 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>
|
||||
BIN
slides/internals/opcodes.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
slides/internals/opcodes.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
slides/internals/overload.jpg
Normal file
|
After Width: | Height: | Size: 108 KiB |
13
slides/internals/overload.xml
Normal 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>
|
||||
12
slides/internals/overview-tutorial.xml
Normal 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>
|
||||
40
slides/internals/overview.xml
Normal 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>
|
||||
@@ -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
|
After Width: | Height: | Size: 133 KiB |
14
slides/internals/pecl.xml
Normal 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>
|
||||
BIN
slides/internals/pickles.jpg
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
slides/internals/replace-php.jpg
Normal file
|
After Width: | Height: | Size: 74 KiB |
12
slides/internals/replacing-functions.xml
Normal 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>
|
||||
9
slides/internals/runcompiletime.xml
Normal 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>
|
||||
31
slides/internals/runcompiletime2.xml
Normal 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>
|
||||
33
slides/internals/runcompiletime3.xml
Normal 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>
|
||||
30
slides/internals/runcompiletime4.xml
Normal 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
|
After Width: | Height: | Size: 142 KiB |
10
slides/internals/streams.xml
Normal 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>
|
||||
20
slides/internals/syntax-changes.xml
Normal 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>
|
||||
8
slides/internals/thanks.xml
Normal 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>
|
||||
11
slides/internals/threaded.xml
Normal 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>
|
||||
BIN
slides/internals/union-jack.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
7
slides/internals/variables11-php4.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
11
slides/internals/why-fast-specific.xml
Normal 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>
|
||||
10
slides/internals/why-not-possible.xml
Normal 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>
|
||||
10
slides/internals/why-replace-php.xml
Normal 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>
|
||||
13
slides/internals/why-wrapping-libs.xml
Normal 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
|
After Width: | Height: | Size: 155 KiB |
12
slides/internals/zend-extensions.xml
Normal 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>
|
||||
BIN
slides/internals/zend-sand.jpg
Normal file
|
After Width: | Height: | Size: 173 KiB |
33
slides/internals/zval.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||