Files
archived-presentations/phpday14.html
2015-01-23 01:12:04 -08:00

350 lines
13 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>PHP</title>
<meta name="description" content="PHP">
<meta name="author" content="Rasmus Lerdorf">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
<link rel="stylesheet" href="/reveal.js/css/reveal.css">
<link rel="stylesheet" href="/reveal.js/css/theme/white.css" id="theme">
<!-- For syntax highlighting - note that these are not the generic highlight.js theme files - see https://github.com/nwinkler/reveal-highlight-themes -->
<link rel="stylesheet" href="/styles/xcode.css">
<!-- Override a few styles -->
<style>
/*
Not actually sure why this block isn't being picked up from the syntax highlight css
If you change the syntax highlight theme, copy the first block here
*/
.reveal pre code {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #fff;
color: black;
-webkit-text-size-adjust: none;
}
/* Left-align h3 and h4 if they are p elements */
h3.p {
text-align: left;
}
h4.p {
text-align: left;
}
/* and left-aligned but slightly indented bullet lists */
.reveal ul {
display: block;
margin: 0 0 1em 3em;
}
</style>
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '/reveal.js/css/print/pdf.css' : '/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!--[if lt IE 9]>
<script src="/reveal.js/lib/js/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<div class="reveal">
<!-- Any section element inside of this container is displayed as a slide -->
<div class="slides">
<section>
<h1>PHP</h1>
<h3>phpday.it</h3>
<h3>Verona</h3>
<h3>May 16, 2014</h3>
<a href="http://talks.php.net/phpday14">http://talks.php.net/phpday14</a><br><br>
<p>Rasmus Lerdorf<br>
<small><a href="http://twitter.com/@rasmus">@rasmus</a></small>
</p>
</section>
<section data-background="#000000">
<img src="/presentations/slides/intro/fiat.jpg" width="800" height="597">
</section>
<section>
<section id="performance">
<h2 margin-bottom="2em">PHP 5.5</h2><br>
<h3 class="p">Performance Improvements</h3>
<ul>
<li>Nested calls</li>
<li>Call stack pre-allocated by compiler</li>
<li>Bundled opcode cache</li>
</ul>
</section>
<section id="generators">
<h4 class="p">✔ Generators</h4>
<pre><code>function xrange($start, $end) {
for ($i = $start; $i &lt;= $end; $i ++) {
yield $i;
}
}
foreach (xrange(0, 5) as $i) {
echo $i, &quot;\n&quot;;
}</code></pre>
</section>
<section id="coroutines">
<h4 class="p">✔ Coroutines</h4>
<pre><code>function logger($fileName) {
$fileHandle = fopen($fileName, 'a');
while (true) {
fwrite($fileHandle, yield . &quot;\n&quot;);
}
}
$logger = logger(__DIR__ . '/log');
$logger-&gt;send('Foo');
$logger-&gt;send('Bar');</code></pre>
<p class="p">For an advanced explanation of coroutines, read this article by Nikita Popov</p>
<div align="" style="font-size: ; color: ; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html" target="">Cooperative multitasking using coroutines</a></div><br />
</section>
<section id="finally">
<h4 class="p">✔ finally</h4>
<pre><code>$db = mysqli_connect();
try {
call_some_function($db);
} finally {
mysqli_close($db);
}</code></pre>
</section>
<section id="foreachlist">
<h4 class="p">✔ list() in foreach</h4>
<pre><code>$names = [ ['John','Smith'], ['Fred','Johnson'] ];
foreach($names as list($first,$last)) {
echo $first,$last;
}</code></pre>
</section>
<section id="constarray">
<h4 class="p">✔ Const array/string Dereferencing</h4>
<pre><code>echo array(1, 2, 3)[0]; //output 1
echo &quot;foobar&quot;[3]; //output b
echo [1,3,4][2]; //output 4</code></pre>
</section>
<section id="others">
<h4 class="p">✔ empty() support for functions/expressions</h4>
<h4 class="p">✔ curl upload functionality rewritten</h4>
<h4 class="p">✔ Simplified password hashing API</h4>
<pre><code>// Hash
$hash = password_hash(&quot;super secret&quot;,PASSWORD_BCRYPT);
// To validate $pwd against the stored hash
if (password_verify($pwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}</code></pre>
</section>
<section id="php55_done">
<div align="" style="font-size: ; color: ; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://php.net/migration55" target="">php.net/migration55</a></div><br />
</section> </section>
<section>
<section id="php56">
<h2 margin-bottom="2em">PHP 5.6</h2><br>
<div align="" style="font-size: 2em; color: ; margin-left: 0em; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://php.net/spec" target="">http://php.net/spec</a></div><br />
</section>
<section id="php56variadic">
<h4 class="p">✔ Variadic functions</h4>
<pre><code>class MySQL implements DB {
public function query($query, ...$params) {
$stmt = $this-&gt;pdo-&gt;prepare($query);
$stmt-&gt;execute($params);
return $stmt;
}
}
$q = 'SELECT * FROM users WHERE id = ?';
$user = $db-&gt;query($q, $userID)-&gt;fetch();</code></pre>
</section>
<section id="php56unpack">
<h4 class="p">✔ Argument Unpacking</h4>
<pre><code>// A better call_user_func_args
$args1 = [1, 2, 3];
$args2 = [4, 5, 6];
test(...$args1, ...$args2); // [1, 2, 3, 4, 5, 6]
test(1, 2, 3, ...$args2); // [1, 2, 3, 4, 5, 6]
test(...$args1, 4, 5, 6); // Fatal error: Cannot use positional argument after argument unpacking</code></pre>
</section>
<section id="php56constscalar">
<h4 class="p">✔ Constant scalar expressions</h4>
<pre><code>class Foo {
const FOO = 1 + 1;
const BAR = 1 &lt;&lt; 1;
const GREETING = &quot;HELLO&quot;;
const BAZ = self::GREETING.&quot; WORLD!&quot;
}</code></pre>
</section>
<section id="php56pow">
<h4 class="p">✔ Add right-associative power operator **</h4>
<pre><code>echo 2 ** 3 ** 2; // 512 (not 64)
echo -3 ** 2; // -9 (not 9)
echo 1 - 3 ** 2; // -8
echo ~3 ** 2; // -10 (not 16)</code></pre>
</section>
<section id="php56opoverload">
<h4 class="p">✔ Internal operator overloading for internal features like GMP</h4>
<pre><code>echo 2**512;
echo &quot;\n&quot;;
$n = gmp_init(2);
echo $n**512;</code></pre>
<pre><code>1.3407807929943E+154
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
</code></pre> </section>
<section id="php56use">
<h4 class="p">✔ use function and use const namespace imports</h4>
<pre><code>include 'template.inc';
include 'db.inc';
use function template\header, template\footer, db\query;
header('My Page');
query('select * from stuff');
footer();</code></pre>
</section>
<section id="php56_0">
<h4 class="p">✔ default_charset ini now applies to internal funcs</h4>
<h4 class="p">✔ SSL Peer verification by default</h4>
<h4 class="p">✔ openssl certificate fingerprints</h4>
<h4 class="p">✔ SAN x509 ext matching when verifying host names</h4>
<h4 class="p">✔ automatic DoS prevention of TLS renegotiation attacks</h4>
<h4 class="p">✔ and many more openssl-related options</h4>
</section>
<section id="php56_1">
<h4 class="p">✔ Asynchronous PostgreSQL database connections</h4>
<h4 class="p">✔ Non-blocking PostgreSQL queries</h4>
<h4 class="p">✔ New phpdbg SAPI</h4>
<h4 class="p">✔ Support for > 2GB file uploads</h4>
<h4 class="p">✔ The php://input stream is now re-usable</h4>
<h4 class="p">✔ Added hash_equals() for timing attack safe string comparison</h4>
<h4 class="p">✔ Added gost-crypto (CryptoPro S-box) hash algorithm</h4>
<h4 class="p">✔ FPM workers can now change their apparmor profile</h4>
<h4 class="p">✔ OCI8 Improvements</h4>
</section>
<section id="php56_done">
<div align="" style="font-size: ; color: ; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://php.net/migration56" target="">php.net/migration56</a></div><br />
</section> </section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<h3 class="p">Are your deploys atomic?</h3>
<h3 class="p">Are you sure?</h3>
<h4 class="p">What happens to a request that is currently executing when you deploy?</h4>
</section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<img src="/presentations/slides/intro/dep1.png" width="642" height="300">
</section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<h4 class="p">✔ Don't copy files into current document root</h4>
<h4 class="p">✔ Let existing requests finish on old code</h4>
<h4 class="p">✔ New requests start on new code</h4>
<h4 class="p">✔ Avoid clearing your opcode cache</h4>
<h4 class="p">✔ Minimal impact on production traffic</h4>
</section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<img src="/presentations/slides/intro/dep2.png" width="680" height="428">
</section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<img src="/presentations/slides/intro/dep3.png" width="680" height="428">
</section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<h4 class="p">2 Document Root directories</h4>
<h4 class="p">Symlink /var/www/site toggles between them</h4>
<h4 class="p">realpath() symlink at the web server level</h4>
<h4 class="p">Set Document Root to symlink realpath</h4>
<h4 class="p">Never hardcode the document root in code</h4>
</section>
<section>
<h2 margin-bottom="2em">Deploying Web Apps</h2><br>
<h3 class="p">Apache</h3>
<h4 class="p">http://github.com/etsy/mod_realdoc</h4>
<h3 class="p">nginx</h3>
<h4 class="p">You can use $realpath_root</h4>
<p class="p">eg. fastcgi_param DOCUMENT_ROOT $realpath_root;</p>
<h3 class="p">PHP</h3>
<h4 class="p">http://github.com/etsy/incpath</h4>
</section>
<section>
<div align="" style="font-size: ; color: ; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://codeascraft.com/2013/07/01/atomic-deploys-at-etsy/" target="">codeascraft.com/2013/07/01/atomic-deploys-at-etsy/</a></div><br />
</section>
<section>
<img src="/presentations/slides/intro/lovehack-white-1000.png" width="1001" height="421">
</section>
<section data-background="#000000">
<img src="/presentations/slides/intro/rasmus.jpg" width="523" height="700">
</section>
<section data-background="#000000">
<img src="/presentations/slides/intro/Greenland1.jpg" width="1024" height="685">
</section>
<section data-background="#000000">
<img src="/presentations/slides/intro/Greenland2.jpg" width="1024" height="685">
</section>
<section data-background="#000000">
<img src="/presentations/slides/intro/Greenland3.jpg" width="1024" height="685">
</section>
<section>
<h2>Work on things that matter (to you)</h2>
</section>
<section>
<h4 class="p">We are running out of things that can be solved in isolation with our keyboards</h4>
</section>
<section>
<img src="/presentations/slides/intro/barros1.png" width="480" height="320">
<img src="/presentations/slides/intro/barros2.jpg" width="250" height="196">
<img src="/presentations/slides/intro/barros3.jpg" width="250" height="367">
<img src="/presentations/slides/intro/sasa.jpg" width="600" height="400">
</section>
</div>
</div>
<script src="/reveal.js/lib/js/head.min.js"></script>
<script src="/reveal.js/js/reveal.js"></script>
<script>
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
transitionSpeed: 'fast',
// Optional reveal.js plugins
dependencies: [
{ src: '/reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: '/reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '/reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '/highlight.min.js', async: true, condition: function() { return !!document.querySelector( 'pre code' ); }, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: '/reveal.js/plugin/zoom-js/zoom.js', async: true },
{ src: '/reveal.js/plugin/notes/notes.js', async: true }
]
});
</script>
</body>
</html>