com presentations: Two example reveal.js presentations generated with pres2reveal: phpdaymx13.html sunshinephp14.html
[email protected] (Rasmus Lerdorf)
| Newsgroups | php.pres |
|---|---|
| Message-ID | <[email protected]> |
Commit: 928bc719e4527ab0405b4f8277b3acca0f4437b9 Author: Rasmus Lerdorf <[email protected]> Tue, 11 Mar 2014 11:10:15 -0700 Parents: 5e31954b679da4715200a98436dc34d455ae2f83 Branches: master Link: http://git.php.net/?p=presentations.git;a=commitdiff;h=928bc719e4527ab0405b4f8277b3acca0f4437b9 Log: Two example reveal.js presentations generated with pres2reveal Changed paths: A phpdaymx13.html A sunshinephp14.html
diff_928bc719e4527ab0405b4f8277b3acca0f4437b9.txt
(text/plain, 29 KB)
diff --git a/phpdaymx13.html b/phpdaymx13.html
new file mode 100644
index 0000000..0df0df2
--- /dev/null
+++ b/phpdaymx13.html
@@ -0,0 +1,584 @@
+<!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">
+
+ <link rel="stylesheet" href="/reveal.js/css/reveal.min.css">
+ <link rel="stylesheet" href="/samdark.css" id="theme">
+
+ <!-- For syntax highlighting -->
+ <link rel="stylesheet" href="/github.css">
+
+ <!-- If the query includes 'print-pdf', include the PDF print sheet -->
+ <script>
+ if( window.location.search.match( /print-pdf/gi ) ) {
+ var link = document.createElement( 'link' );
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = '/reveal.js/css/print/pdf.css';
+ document.getElementsByTagName( 'head' )[0].appendChild( link );
+ }
+ </script>
+
+ <!--[if lt IE 9]>
+ <script src="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></h3>
+ <h3>Mexico City</h3>
+ <h3>Nov. 16, 2013</h3>
+ <a href="http://talks.php.net/show/phpdaymx">http://talks.php.net/show/phpdaymx</a><br><br>
+ <p>Rasmus Lerdorf<br>
+ <small><a href="http://twitter.com/@rasmus">@rasmus</a></small>
+ </p>
+ </section>
+ <section>
+ <h2 margin-bottom="2em">1993</h2><br>
+ <pre><code data-trim class="php">#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#define ishex(x) (((x) >= '0' && (x) <= '9') || ((x) >= 'a' &&
+ (x) <= 'f') || ((x) >= 'A' && (x) <= 'F'))
+
+int htoi(char *s) {
+ int value;
+ char c;
+
+ c = s[0];
+ if(isupper(c)) c = tolower(c);
+ value=(c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
+
+ c = s[1];
+ if(isupper(c)) c = tolower(c);
+ value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
+
+ return(value);
+}
+
+void main(int argc, char *argv[]) {
+ char *params, *data, *dest, *s, *tmp;
+ char *name, *age;
+
+ puts("Content-type: text/html\r\n");
+ puts("<HTML><HEAD><TITLE>Form Example</TITLE></HEAD>");
+ puts("<BODY><H1>My Example Form</H1>");
+ puts("<FORM action=\"form.cgi\" method=\"GET\">");
+ puts("Name: <INPUT type=\"text\" name=\"name\">");
+ puts("Age: <INPUT type=\"text\" name=\"age\">");
+ puts("<BR><INPUT type=\"submit\">");
+ puts("</FORM>");
+
+ data = getenv("QUERY_STRING");
+ if(data && *data) {
+ params = data; dest = data;
+ while(*data) {
+ if(*data=='+') *dest=' ';
+ else if(*data == '%' && ishex(*(data+1))&&ishex(*(data+2))) {
+ *dest = (char) htoi(data + 1);
+ data+=2;
+ } else *dest = *data;
+ data++;
+ dest++;
+ }
+ *dest = '\0';
+ s = strtok(params,"&");
+ do {
+ tmp = strchr(s,'=');
+ if(tmp) {
+ *tmp = '\0';
+ if(!strcmp(s,"name")) name = tmp+1;
+ else if(!strcmp(s,"age")) age = tmp+1;
+ }
+ } while(s=strtok(NULL,"&"));
+
+ printf("Hi %s, you are %s years old\n",name,age);
+ }
+ puts("</BODY></HTML>");
+}
+</code></pre>
+ </section>
+ <section>
+ <h2 margin-bottom="2em">1993</h2><br>
+ <pre><code data-trim class="php">use CGI qw(:standard);
+print header;
+print start_html('Form Example'),
+ h1('My Example Form'),
+ start_form,
+ "Name: ", textfield('name'),
+ p,
+ "Age: ", textfield('age'),
+ p,
+ submit,
+ end_form;
+if(param()) {
+ print "Hi ",em(param('name')),
+ "You are ",em(param('age')),
+ " years old";
+}
+print end_html;</code></pre>
+ </section>
+ <section>
+ <h2 margin-bottom="2em">1994</h2><br>
+ <pre><code data-trim class="php"><html><head><title>Form Example</title></head>
+<body><h1>My Example Form</h1>
+<form action="form.phtml" method="POST">
+Name: <input type="text" name="name">
+Age: <input type="text" name="age">
+<br><input type="submit">
+</form>
+<?if($name):?>
+Hi <?echo $name?>, you are <?echo $age?> years old
+<?endif?>
+</body></html></code></pre>
+ </section>
+ <section>
+ <h3 class="p">Focus on the Ecosystem</h3>
+ <ul>
+ <li>LAMP wasn't an accident</li>
+ <li>Robustness, Performance and Security</li>
+ <li><font color="ff2233">♥</font> shared hosting ISPs</li>
+ </ul>
+ <h3 class="p">Scale</h3>
+ <ul>
+ <li>Scaling up is expected</li>
+ <li>Scaling down is surprisingly hard</li>
+ <li>Doing both is rocket science</li>
+ </ul>
+ </section>
+ <section>
+ <h3 class="p">What was he thinking?</h3>
+ <ul>
+ <li>Case insensitive function names?</li>
+ <li>Naming inconsistencies?</li>
+ <li>What's with the $ signs?</li>
+ <li>Globals?</li>
+ <li>register_globals?</li>
+ <li>magic_quotes?</li>
+ </ul>
+ <h3 class="p">OMGWTFBBQ?</h3>
+ <pre><code data-trim class="php">
+array_search($needle, $haystack);
+strstr($haystack, $needle);
+in_array($needle, $haystack);
+substr_count($haystack, $needle);
+array_key_exists($needle, $haystack);
+strchr($haystack, $needle);
+</code></pre>
+ </section>
+ <section>
+ <h3 class="p">Performance</h3>
+ <ul>
+ <li>mod_php</li>
+ <li>shared-nothing perfect sandbox model</li>
+ </ul>
+ <h3 class="p">Robustness</h3>
+ <ul>
+ <li>SQL LIMIT clause</li>
+ <li>Promote Prefork shared-nothing model</li>
+ </ul>
+ <h3 class="p">Security</h3>
+ <ul>
+ <li>max_execution_time</li>
+ <li>memory_limit</li>
+ <li>safe mode</li>
+ </ul>
+ </section>
+ <section>
+ <h2>2013</h2>
+ </section>
+ <section>
+ <section id="php54perf">
+ <h2 margin-bottom="2em">PHP 5.4</h2><br>
+ <h3 class="p">Performance Improvements</h3>
+ <ul>
+ <li>FastCGI request handling</li>
+ <li>better memory handling</li>
+ <li>startup/shutdown</li>
+ <li>repeated run-time function binding</li>
+ <li>string constants</li>
+ <li>access to global constants</li>
+ <li>access to static properties</li>
+ <li>empty hashes</li>
+ <li>@ operator</li>
+ <li>unserialize()</li>
+ </ul>
+ </section>
+<section id="php54page2">
+ <h4 class="p">✔ Built-in Web Server</h4>
+ <h4 class="p">✔ Traits aka Horizontal Code Reuse</h4>
+ <p class="p"> (Compiler-assisted Copy-and-Paste)</p>
+ <h4 class="p">✔ Short Array Syntax</h4>
+ <pre><code data-trim class="php">
+$a = [1, 2, 3];
+$b = ['foo' => 'orange', 'bar' => 'apple'];
+</code></pre>
+ </section>
+<section id="php54page3">
+ <h4 class="p">✔ Function Array Dereferencing</h4>
+ <pre><code data-trim class="php">
+function fruits() {
+ return array('apple', 'banana', 'orange');
+}
+echo fruits()[0]; // Outputs: apple
+?></code></pre>
+ <h4 class="p">✔ $this from current scope supported in Closures</h4>
+ <pre><code data-trim class="php">
+class Foo {
+ private $prop = "bar";
+ public function getPrinter() {
+ return function() { echo ucfirst($this->prop); };
+ }
+}
+
+$a = new Foo;
+$func = $a->getPrinter();
+$func(); // Outputs: Bar
+?></code></pre>
+ </section>
+<section id="php54page4">
+ <h4 class="p">✔ <?= is now always available</h4>
+ <h4 class="p">✔ New Session Object</h4>
+ <h4 class="p">✔ Callable Typehint</h4>
+ <h4 class="p">✔ Better support for asian chars in htmlspecialchars/htmlentities</h4>
+ <h4 class="p">✔ Multibyte support is now configurable at runtime</h4>
+ <h4 class="p">✔ JSON Improvements</h4>
+ <ul>
+ <li>JsonSerializable</li>
+ </ul>
+ <pre><code data-trim class="php">
+class Foo implements JsonSerializable {
+ private $data = 'Bar';
+ public function jsonSerialize() {
+ return array('data'=>$this->data);
+ }
+}
+echo json_encode(new Foo); // Outputs: {"data":"Bar"}</code></pre>
+ </section>
+<section id="php54page5">
+ <h4 class="p">✔ mysqlnd used by default everywhere</h4>
+ <h4 class="p">✔ iterator support added to mysqli (mysqli_result implements Traversable)</h4>
+ <h4 class="p">✔ Binary notation</h4>
+ <pre><code data-trim class="php">
+$mask = 0b010101;
+</code></pre>
+ <h4 class="p">✔ AES Support added to OpenSSL</h4>
+ <h4 class="p">✔ Tokyo Cabinet and DB5 support added to dba</h4>
+ <h4 class="p">✔ Added stack frame count arg to debug_backtrace()</h4>
+ <h4 class="p">✔ $_SERVER['REQUEST_TIME_FLOAT'] added</h4>
+ <h4 class="p">✔ Apache 2.4 support on Windows</h4>
+ </section> </section>
+ <section>
+ <section id="php54perf1">
+ <h2 margin-bottom="2em">5.4 Performance</h2><br>
+ <p class="p">
+PHP 5.4 + Opcache vs. PHP 5.3 + APC
+</p>
+<p>user cpu</p>
+ <img src="/presentations/slides/intro/php54_cpu.png" width="732" height="415">
+ </section>
+<section id="php54perf2">
+<p>system cpu</p>
+ <img src="/presentations/slides/intro/php54_system.png" width="732" height="416">
+ </section>
+<section id="php54perf3">
+<p>memory</p>
+ <img src="/presentations/slides/intro/php54_mem.png" width="732" height="416">
+ </section>
+<section id="php54perf4">
+<p>latency</p>
+ <img src="/presentations/slides/intro/php54_latency.png" width="732" height="415">
+ </section> </section>
+ <section>
+ <section id="php54trip1">
+ <h2 margin-bottom="2em">Watch out for...</h2><br>
+ <p class="p">✔ default charset is UTF-8 instead of ISO-8859-1</p>
+ <pre><code data-trim class="php">
+echo htmlspecialchars("abc".chr(0xE0)."def"); // 5.3 "abc�def"
+echo htmlspecialchars("abc".chr(0xE0)."def", NULL, 'UTF-8'); // 5.3 ""
+echo htmlspecialchars("abc".chr(0xE0)."def"); // 5.4 ""
+echo htmlspecialchars("abc".chr(0xE0)."def", ENT_IGNORE); // 5.4 "abcdef"</code></pre>
+ <p class="p">✔ array to string conversion notice</p>
+ <pre><code data-trim class="php">
+echo [1,2,3];
+// Notice: Array to string conversion in test.php code on line 1
+
+array_diff([1,2,3], [1,2, [3] ]);
+// Notice: Array to string conversion in test.php on line 2
+</code></pre>
+ <p class="p">✔ register_globals completely removed</p>
+ <p class="p">✔ magic quotes completely removed</p>
+ </section>
+<section id="php54trip2">
+ <p class="p">✔ removed variable break/continue</p>
+ <pre><code data-trim class="php">
+$var = 'label';
+while(1) {
+ break $var;
+ continue $var;
+}
+label:</code></pre>
+ <p class="p">✔ max_input_vars (default 1000)</p>
+ <p class="p">✔ "callable", "insteadof" and "trait" are now reserved words</p>
+ </section>
+<section id="php54trip3">
+ <p class="p">✔ extending an abstract constructor must match the signature</p>
+ <pre><code data-trim class="php">
+ abstract class Base {
+ abstract public function __construct();
+ }
+ class Foo extends Base {
+ public function __construct($bar) {}
+// FATAL Declaration of Foo::__construct() must be compatible
+// with Base::__construct()
+ }
+</code></pre>
+ <p class="p">✔ stream_select() preserves keys of array arg</p>
+ <p class="p">✔ XSLT writes are disabled by default</p>
+ <p class="p">✔ mcrypt_generic_end() removed in favour of mcrypt_generic_deinit()</p>
+ <p class="p">✔ mysql_list_dbs() removed</p>
+ <p class="p">✔ PDO needs at least mysql client lib 4.1 now</p>
+ <p class="p">✔ Datetime ignores TZ env var and falls back to UTC if none set</p>
+ <p class="p">✔ Tiger hash output fixed - See bug 61307</p>
+ </section> </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 data-trim class="php">
+function xrange($start, $end) {
+ for ($i = $start; $i <= $end; $i ++) {
+ yield $i;
+ }
+}
+foreach (xrange(0, 5) as $i) {
+ echo $i, "\n";
+}</code></pre>
+ </section>
+<section id="finally">
+ <h4 class="p">✔ finally</h4>
+ <pre><code data-trim class="php">
+$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 data-trim class="php">
+$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 data-trim class="php">
+echo array(1, 2, 3)[0]; //output 1
+echo "foobar"[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 data-trim class="php">
+// Hash
+$hash = password_hash("super secret",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>
+ <section>
+ <section id="php56">
+ <h2 margin-bottom="2em">PHP 5.6</h2><br>
+ <h4 class="p">✔ Variadic functions</h4>
+ <pre><code data-trim class="php">
+class MySQL implements DB {
+ public function query($query, ...$params) {
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($params);
+ return $stmt;
+ }
+}
+
+$q = 'SELECT * FROM users WHERE id = ?';
+$user = $db->query($q, $userID)->fetch();</code></pre>
+ </section>
+<section id="php56unpack">
+ <h4 class="p">✔ Argument Unpacking</h4>
+ <pre><code data-trim class="php">
+// 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); // [1, 2, 3, 4, 5, 6]</code></pre>
+ <h4 class="p">✔ Constant scalar expressions</h4>
+ <pre><code data-trim class="php">
+class Foo {
+ const FOO = 1 + 1;
+ const BAR = 1 << 1;
+ const GREETING = "HELLO";
+ const BAZ = self::GREETING." WORLD!"
+}</code></pre>
+ </section>
+<section id="php56pow">
+ <h4 class="p">✔ Add right-associative power operator **</h4>
+ <pre><code data-trim class="php">
+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>
+ <h4 class="p">✔ Internal operator overloading for internal features like GMP</h4>
+ <pre><code data-trim class="php">
+echo 2**512;
+echo "\n";
+$n = gmp_init(2);
+echo $n**512;
+</code></pre>
+ <pre><code data-trim class="php">1.3407807929943E+154
+13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
+ </code></pre> </section>
+<section id="php56use">
+ <h4 class="p">✔ use function and use const namespace imports</h4>
+ <pre><code data-trim class="php">
+include 'template.inc';
+include 'db.inc';
+use function template\header, template\footer, db\query;
+
+header('My Page');
+query('select * from stuff');
+footer(); </code></pre>
+ <h4 class="p">✔ SSL Peer verification by default</h4>
+ <h4 class="p">✔ New phpdbg SAPI</h4>
+ <h4 class="p">✔ Support for > 2GB file uploads</h4>
+ <h4 class="p">✔ OCI8 Improvements</h4>
+ </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>
+ <h2 margin-bottom="2em">Conclusion</h2><br>
+ <ul>
+ <li>Still running PHP 5.2 or 5.3? Upgrade now!</li>
+ <li>Test your code on PHP 5.5 and upgrade soon</li>
+ <li>Help us test PHP 5.6</li>
+ <li>Contribute!</li>
+ </ul>
+ </section>
+ </div>
+
+ </div>
+
+ <script src="/reveal.js/lib/js/head.min.js"></script>
+ <script src="/reveal.js/js/reveal.min.js"></script>
+
+ <script>
+
+ // Full list of configuration options available here:
+ // https://github.com/hakimel/reveal.js#configuration
+ Reveal.initialize({
+ controls: true,
+ progress: true,
+ history: true,
+ center: true,
+ backgroundTransition: 'none',
+
+ theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
+ transition: Reveal.getQueryHash().transition || 'none', // default/cube/page/concave/zoom/linear/fade/none
+
+ // Parallax scrolling
+ // parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
+ // parallaxBackgroundSize: '2100px 900px',
+
+ // Optional libraries used to extend on reveal.js
+ dependencies: [
+ { src: '/reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
+ { src: '/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
+ { src: '/reveal.js/plugin/zoom-js/zoom.js', async: true, callback: function() { return !!document.body.classList; } },
+ { src: '/reveal.js/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
+ ]
+ });
+
+ </script>
+
+ </body>
+</html>
diff --git a/sunshinephp14.html b/sunshinephp14.html
new file mode 100644
index 0000000..407a326
--- /dev/null
+++ b/sunshinephp14.html
@@ -0,0 +1,295 @@
+<!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">
+
+ <link rel="stylesheet" href="/reveal.js/css/reveal.min.css">
+ <link rel="stylesheet" href="/samdark.css" id="theme">
+
+ <!-- For syntax highlighting -->
+ <link rel="stylesheet" href="/github.css">
+
+ <!-- If the query includes 'print-pdf', include the PDF print sheet -->
+ <script>
+ if( window.location.search.match( /print-pdf/gi ) ) {
+ var link = document.createElement( 'link' );
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = '/reveal.js/css/print/pdf.css';
+ document.getElementsByTagName( 'head' )[0].appendChild( link );
+ }
+ </script>
+
+ <!--[if lt IE 9]>
+ <script src="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>SunshinePHP</h3>
+ <h3>Miami</h3>
+ <h3>Feb.7, 2014</h3>
+ <a href="http://talks.php.net/show/sunshinephp14">http://talks.php.net/show/sunshinephp14</a><br><br>
+ <p>Rasmus Lerdorf<br>
+ <small><a href="http://twitter.com/@rasmus">@rasmus</a></small>
+ </p>
+ </section>
+ <section>
+ <img src="/presentations/slides/intro/lovehack-white-1000.png" width="1001" height="421">
+ </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 data-trim class="php">
+function xrange($start, $end) {
+ for ($i = $start; $i <= $end; $i ++) {
+ yield $i;
+ }
+}
+foreach (xrange(0, 5) as $i) {
+ echo $i, "\n";
+}</code></pre>
+ </section>
+<section id="finally">
+ <h4 class="p">✔ finally</h4>
+ <pre><code data-trim class="php">
+$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 data-trim class="php">
+$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 data-trim class="php">
+echo array(1, 2, 3)[0]; //output 1
+echo "foobar"[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 data-trim class="php">
+// Hash
+$hash = password_hash("super secret",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>
+ <section>
+ <section id="php56">
+ <h2 margin-bottom="2em">PHP 5.6</h2><br>
+ <h4 class="p">✔ Variadic functions</h4>
+ <pre><code data-trim class="php">
+class MySQL implements DB {
+ public function query($query, ...$params) {
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($params);
+ return $stmt;
+ }
+}
+
+$q = 'SELECT * FROM users WHERE id = ?';
+$user = $db->query($q, $userID)->fetch();</code></pre>
+ </section>
+<section id="php56unpack">
+ <h4 class="p">✔ Argument Unpacking</h4>
+ <pre><code data-trim class="php">
+// 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); // [1, 2, 3, 4, 5, 6]</code></pre>
+ <h4 class="p">✔ Constant scalar expressions</h4>
+ <pre><code data-trim class="php">
+class Foo {
+ const FOO = 1 + 1;
+ const BAR = 1 << 1;
+ const GREETING = "HELLO";
+ const BAZ = self::GREETING." WORLD!"
+}</code></pre>
+ </section>
+<section id="php56pow">
+ <h4 class="p">✔ Add right-associative power operator **</h4>
+ <pre><code data-trim class="php">
+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>
+ <h4 class="p">✔ Internal operator overloading for internal features like GMP</h4>
+ <pre><code data-trim class="php">
+echo 2**512;
+echo "\n";
+$n = gmp_init(2);
+echo $n**512;
+</code></pre>
+ <pre><code data-trim class="php">1.3407807929943E+154
+13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
+ </code></pre> </section>
+<section id="php56use">
+ <h4 class="p">✔ use function and use const namespace imports</h4>
+ <pre><code data-trim class="php">
+include 'template.inc';
+include 'db.inc';
+use function template\header, template\footer, db\query;
+
+header('My Page');
+query('select * from stuff');
+footer(); </code></pre>
+ <h4 class="p">✔ SSL Peer verification by default</h4>
+ <h4 class="p">✔ New phpdbg SAPI</h4>
+ <h4 class="p">✔ Support for > 2GB file uploads</h4>
+ <h4 class="p">✔ OCI8 Improvements</h4>
+ </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>
+ <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</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.min.js"></script>
+
+ <script>
+
+ // Full list of configuration options available here:
+ // https://github.com/hakimel/reveal.js#configuration
+ Reveal.initialize({
+ controls: true,
+ progress: true,
+ history: true,
+ center: true,
+ backgroundTransition: 'none',
+
+ theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
+ transition: Reveal.getQueryHash().transition || 'none', // default/cube/page/concave/zoom/linear/fade/none
+
+ // Parallax scrolling
+ // parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
+ // parallaxBackgroundSize: '2100px 900px',
+
+ // Optional libraries used to extend on reveal.js
+ dependencies: [
+ { src: '/reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
+ { src: '/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
+ { src: '/reveal.js/plugin/zoom-js/zoom.js', async: true, callback: function() { return !!document.body.classList; } },
+ { src: '/reveal.js/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
+ ]
+ });
+
+ </script>
+
+ </body>
+</html>