mirror of
https://github.com/php/presentations.git
synced 2026-03-23 23:22:22 +01:00
DatabaseMonth talk
This commit is contained in:
55
dmonth.xml
Normal file
55
dmonth.xml
Normal file
@@ -0,0 +1,55 @@
|
||||
<presentation
|
||||
template="simple"
|
||||
navmode="html"
|
||||
titlecolor="#000000"
|
||||
navbarbackground="#bbbbbb"
|
||||
navbartopiclinks="0"
|
||||
logo1="images/php-med-trans.png"
|
||||
titlesize="6em"
|
||||
navbarheight="3.5em"
|
||||
examplebackground="#ffffff"
|
||||
outputbackground="#ffffff"
|
||||
exampleclass="noshadow"
|
||||
exampleoutputclass="noshadow"
|
||||
>
|
||||
|
||||
<topic>PHP</topic>
|
||||
<title>PHP, MySQL and the LAMP Stack</title>
|
||||
<event>Database Month</event>
|
||||
<location>New York City</location>
|
||||
<date>May 13, 2013</date>
|
||||
<speaker>Rasmus Lerdorf</speaker>
|
||||
<url>http://talks.php.net/show/dmonth</url>
|
||||
<twitter>@rasmus</twitter>
|
||||
|
||||
<slide>slides/intro/titlepage.xml</slide>
|
||||
|
||||
<slide>slides/intro/nold.xml</slide>
|
||||
<slide>slides/intro/nold2.xml</slide>
|
||||
<slide>slides/intro/nold3.xml</slide>
|
||||
<slide>slides/intro/eco.xml</slide>
|
||||
<slide>slides/intro/wwht1.xml</slide>
|
||||
<slide>slides/intro/wwht2.xml</slide>
|
||||
|
||||
<slide>slides/intro/2013_title.xml</slide>
|
||||
|
||||
<slide>slides/intro/php54.xml</slide>
|
||||
<slide>slides/intro/perf54.xml</slide>
|
||||
<slide>slides/intro/php54_trip.xml</slide>
|
||||
|
||||
<slide>slides/intro/nmysqlnd1.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd2.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd3.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd4.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd5.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd6.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd7.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd8.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd9.xml</slide>
|
||||
<slide>slides/intro/nmysqlnd10.xml</slide>
|
||||
|
||||
<slide>slides/intro/php55.xml</slide>
|
||||
|
||||
<slide>slides/intro/key_2013.xml</slide>
|
||||
|
||||
</presentation>
|
||||
@@ -12,6 +12,7 @@
|
||||
<link fontsize="2.5em" marginleft="2em" leader="5.2->5.3: " href="http://php.net/migration53"/>
|
||||
<link fontsize="2.5em" marginleft="2em" leader="5.3->5.4: " href="http://php.net/migration54"/>
|
||||
<link fontsize="2.5em" marginleft="2em" leader="5.4->5.5: " href="http://php.net/migration55"/>
|
||||
<link fontsize="2.5em" marginleft="2em" leader="mysqlnd: " href="http://php.net/mysqlnd"/>
|
||||
<link fontsize="2.5em" marginleft="2em" leader="Wiki: " href="http://wiki.php.net"/>
|
||||
<link fontsize="2.5em" marginleft="2em" leader="Bugs: " href="http://bugs.php.net"/>
|
||||
</slide>
|
||||
|
||||
21
slides/intro/nmysqlnd1.xml
Normal file
21
slides/intro/nmysqlnd1.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<slide title="mysqlnd">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">New MySQL Native Driver</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> PHP-specific MySQL client library</bullet>
|
||||
<bullet> Much less copying data around</bullet>
|
||||
<bullet> Better L1/L2 cache usage</bullet>
|
||||
</list>
|
||||
|
||||
<break lines="1" />
|
||||
<blurb fontsize="6em">Tight Integration with PHP</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> Memory manager</bullet>
|
||||
<bullet> Streams</bullet>
|
||||
<bullet> Internal zval caching</bullet>
|
||||
<bullet> Persistent connections</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
BIN
slides/intro/nmysqlnd10.png
Normal file
BIN
slides/intro/nmysqlnd10.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
12
slides/intro/nmysqlnd10.xml
Normal file
12
slides/intro/nmysqlnd10.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<slide title="mysqlnd_memcache">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Innodb Memcache plugin</blurb>
|
||||
<image filename="nmysqlnd10.png" width="813" height="276" align="center"/>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> transparent SQL to memcache</bullet>
|
||||
<bullet> not for standalone memcached</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
14
slides/intro/nmysqlnd2.xml
Normal file
14
slides/intro/nmysqlnd2.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<slide title="mysqlnd">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Unique features</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> Async queries</bullet>
|
||||
<bullet> Improved persistent connections</bullet>
|
||||
<bullet> Performance statistics calls</bullet>
|
||||
<bullet> mysqli_fetch_all()</bullet>
|
||||
<bullet> Plugin API</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
45
slides/intro/nmysqlnd3.xml
Normal file
45
slides/intro/nmysqlnd3.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<slide title="Async Queries">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="4em">3 normal queries</blurb>
|
||||
<example fontsize="2em" marginleft="7em" result='0' title=""><![CDATA[<?php
|
||||
$dbs = $ids = [];
|
||||
for ($i = 1; $i <= 3; $i++) {
|
||||
$dbs[$i] = new mysqli("db_host_$i", $user, $pass, "users");
|
||||
}
|
||||
foreach($dbs as $db) {
|
||||
$result = $db->query("SELECT id from users where age > 21");
|
||||
while($row = mysqli_fetch_assoc($result)) {
|
||||
$ids[] = $row['id'];
|
||||
}
|
||||
}
|
||||
]]></example>
|
||||
|
||||
<blurb fontsize="4em">3 async queries</blurb>
|
||||
<example fontsize="2em" marginleft="7em" result='0' title=""><![CDATA[<?php
|
||||
$dbs = $ids = [];
|
||||
for ($i = 1; $i <= 3; $i++) {
|
||||
$dbs[$i] = new mysqli("db_host_$i", $user, $pass, "users");
|
||||
}
|
||||
foreach($dbs as $db) {
|
||||
$result = $db->query("SELECT id from users where age > 21", MYSQLI_ASYNC);
|
||||
}
|
||||
$all_dbs = $read = $err = $rej = $dbs;
|
||||
do {
|
||||
if (!mysqli_poll($read, $err, $rej, 1)) {
|
||||
continue;
|
||||
}
|
||||
foreach($all_dbs as $id => $db) {
|
||||
if ($result = mysqli_reap_async_query($db)) {
|
||||
while($row = mysqli_fetch_assoc($result)) {
|
||||
$ids[] = $row['id'];
|
||||
}
|
||||
mysqli_free_result($result);
|
||||
unset($all_dbs[$id]);
|
||||
}
|
||||
}
|
||||
} while (count($all_dbs) > 0);
|
||||
]]></example>
|
||||
|
||||
</slide>
|
||||
19
slides/intro/nmysqlnd4.xml
Normal file
19
slides/intro/nmysqlnd4.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<slide title="Query stats">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="4em">mysqlnd stats example</blurb>
|
||||
<example fontsize="2em" marginleft="7em" result='1' title=""><![CDATA[<?php
|
||||
$db = mysqli_connect("localhost", "root", null, "mysql");
|
||||
$result = mysqli_query($db, "SELECT * from user");
|
||||
$users = mysqli_fetch_all($result);
|
||||
|
||||
$client_stats = mysqli_get_client_stats();
|
||||
echo "<pre>".print_r($client_stats,true)."</pre>";
|
||||
|
||||
// You can also get stats per connection
|
||||
$conn_stats = mysqli_get_connection_stats($db);
|
||||
echo "<pre>".print_r($conn_stats,true)."</pre>";
|
||||
]]></example>
|
||||
|
||||
</slide>
|
||||
13
slides/intro/nmysqlnd5.xml
Normal file
13
slides/intro/nmysqlnd5.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<slide title="mysqlnd">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Plugins</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> mysqlnd_ms - replication and load balancing</bullet>
|
||||
<bullet> mysqlnd_qc - query cache</bullet>
|
||||
<bullet> mysqlnd_uh - user handler</bullet>
|
||||
<bullet> mysqlnd_memcache - to access innodb memcache daemon</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
15
slides/intro/nmysqlnd6.xml
Normal file
15
slides/intro/nmysqlnd6.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<slide title="mysqlnd_ms">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Replication and Load balancing</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> ms = master/slave</bullet>
|
||||
<bullet> lazy connections</bullet>
|
||||
<bullet> read/write splitting</bullet>
|
||||
<bullet> various slave load balancing strategies</bullet>
|
||||
<bullet> partitioning and sharding via query hints</bullet>
|
||||
<bullet> and much more - see http://php.net/mysqlnd_ms</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
17
slides/intro/nmysqlnd7.xml
Normal file
17
slides/intro/nmysqlnd7.xml
Normal file
@@ -0,0 +1,17 @@
|
||||
<slide title="mysqlnd_qc">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Query caching</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> Caches queries locally</bullet>
|
||||
<bullet marginleft="3em" type="dot"> in-process hash</bullet>
|
||||
<bullet marginleft="3em" type="dot"> APC user cache</bullet>
|
||||
<bullet marginleft="3em" type="dot"> memcache</bullet>
|
||||
<bullet marginleft="3em" type="dot"> sqlite</bullet>
|
||||
<bullet marginleft="3em" type="dot"> user-defined</bullet>
|
||||
<bullet> Either all or hinted queries</bullet>
|
||||
<bullet> TTL or user-defined cache invalidation</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
57
slides/intro/nmysqlnd8.xml
Normal file
57
slides/intro/nmysqlnd8.xml
Normal file
@@ -0,0 +1,57 @@
|
||||
<slide title="mysqlnd_uh">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">User Handler</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> Lets you hook almost anything</bullet>
|
||||
<bullet> monitor queries and prepared statements</bullet>
|
||||
<bullet> audit db usage and sql injection</bullet>
|
||||
</list>
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<example fontsize="2em" marginleft="7em" result='0' title=""><![CDATA[<?php
|
||||
class conn_proxy extends MysqlndUhConnection {
|
||||
public function query($res, $query) {
|
||||
debug_print_backtrace();
|
||||
return parent::query($res, $query);
|
||||
}
|
||||
}
|
||||
class stmt_proxy extends MysqlndUhPreparedStatement {
|
||||
public function prepare($res, $query) {
|
||||
debug_print_backtrace();
|
||||
return parent::prepare($res, $query);
|
||||
}
|
||||
}
|
||||
mysqlnd_uh_set_connection_proxy(new conn_proxy());
|
||||
mysqlnd_uh_set_statement_proxy(new stmt_proxy());
|
||||
|
||||
printf("Proxies installed...\n");
|
||||
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
|
||||
var_dump($pdo->query("SELECT 1 AS _one FROM DUAL")->fetchAll(PDO::FETCH_ASSOC));
|
||||
|
||||
$mysqli = new mysqli("localhost", "root", "", "test");
|
||||
$mysqli->prepare("SELECT 1 AS _two FROM DUAL");
|
||||
]]></example>
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Output</blurb>
|
||||
<example fontsize="2em" marginleft="7em" hide='1' result='r' title=""><![CDATA[
|
||||
<pre>
|
||||
#0 conn_proxy->query(Resource id #19, SELECT 1 AS _one FROM DUAL)
|
||||
#1 PDO->query(SELECT 1 AS _one FROM DUAL) called at [example.php:19]
|
||||
array(1) {
|
||||
[0]=>
|
||||
array(1) {
|
||||
["_one"]=>
|
||||
string(1) "1"
|
||||
}
|
||||
}
|
||||
#0 stmt_proxy->prepare(Resource id #753, SELECT 1 AS _two FROM DUAL)
|
||||
#1 mysqli->prepare(SELECT 1 AS _two FROM DUAL) called at [example.php:22]
|
||||
</pre>
|
||||
]]></example>
|
||||
|
||||
</slide>
|
||||
13
slides/intro/nmysqlnd9.xml
Normal file
13
slides/intro/nmysqlnd9.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<slide title="mysqlnd_mux">
|
||||
|
||||
<break lines="1" />
|
||||
|
||||
<blurb fontsize="6em">Connection Multiplexer</blurb>
|
||||
<list fontsize="4em" marginleft="1.5em">
|
||||
<bullet> still early development</bullet>
|
||||
<bullet> essentially connection pooling</bullet>
|
||||
<bullet> keeps a cache of established connections</bullet>
|
||||
<bullet> tries to manage this cache intelligently</bullet>
|
||||
</list>
|
||||
|
||||
</slide>
|
||||
Reference in New Issue
Block a user