com presentations: Tweak presentation further: expotec.html expotec.xml slides/intro/php7_2016s.xml
[email protected] (Rasmus Lerdorf) Fri, 26 Aug 2016 17:16:17 +0000
| Newsgroups | php.pres |
|---|---|
| Message-ID | <[email protected]> |
Commit: e48df921dc54489253891e2f24210c91e8a994a0 Author: Rasmus Lerdorf <[email protected]> Fri, 26 Aug 2016 14:16:17 -0300 Parents: 9dbac6954cd9cb2f3236ea73a4e52920b82b7728 Branches: master Link: http://git.php.net/?p=presentations.git;a=commitdiff;h=e48df921dc54489253891e2f24210c91e8a994a0 Log: Tweak presentation further Changed paths: M expotec.html M expotec.xml A slides/intro/php7_2016s.xml
diff_e48df921dc54489253891e2f24210c91e8a994a0.txt
(text/plain, 30.6 KB)
diff --git a/expotec.html b/expotec.html
index 06e5254..79f39e3 100644
--- a/expotec.html
+++ b/expotec.html
@@ -135,183 +135,6 @@ Notice: Undefined variable: notes in /home/rasmus/src/web/pres2/reveal_template.
<li style="font-size: 1em;">Lower memory usage, sometimes drastically lower</li>
</ul>
</section>
-<section id="php7pcache1">
- <p class="p" style="font-size:1.1em;text-align:left;">✔ Persistent secondary file-based cache for OPCache</p>
- <img src="/presentations/slides/intro/pcache.png" width="" height="">
- </section>
-<section id="php7pcache3">
- <pre><code class="ini" data-trim style="font-size:1.1em;">; --enable-opcache-file
-; php.ini
-opcache.file_cache=/var/tmp
-
-; php-cli.ini
-opcache.enable_cli=1
-opcache.file_cache=/var/tmp
-opcache.file_cache_only=1</code></pre>
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">$ time composer >/dev/null
-real 0m0.040s
-user 0m0.032s
-sys 0m0.004s
-
-$ time composer >/dev/null
-real 0m0.019s
-user 0m0.016s
-sys 0m0.000s
-
-$ time php -d opcache.enable=0 /usr/local/bin/composer >/dev/null
-real 0m0.033s
-user 0m0.032s
-sys 0m0.000s</code></pre>
- </section>
-<section id="php7pcache4">
- <pre><code class="shell nohighlight" data-trim style="font-size:0.78em;">/var/tmp
-├── 7eeb6fe88104116c27c5650ddd83abf0
-│ └── usr
-│ └── local
-│ └── bin
-│ └── composer.bin
-└── 7eeb6fe88104116c27c5650ddd83abf0phar:
- └── usr
- └── local
- └── bin
- └── composer
- ├── bin
- │ └── composer.bin
- ├── src
- │ ├── bootstrap.php.bin
- │ └── Composer
- │ ├── Command
- │ │ ├── AboutCommand.php.bin
- │ │ ├── ArchiveCommand.php.bin
- │ │ ├── ClearCacheCommand.php.bin
- │ │ ├── Command.php.bin
- │ │ ├── ConfigCommand.php.bin
- │ │ ├── CreateProjectCommand.php.bin
- │ │ ├── DependsCommand.php.bin
- │ │ ├── DiagnoseCommand.php.bin
- │ │ ├── DumpAutoloadCommand.php.bin
- │ │ ├── GlobalCommand.php.bin
- │ │ ├── Helper
- │ │ │ └── DialogHelper.php.bin
- │ │ ├── HomeCommand.php.bin
- │ │ ├── InitCommand.php.bin
- │ │ ├── InstallCommand.php.bin
- │ │ ├── LicensesCommand.php.bin
- │ │ ├── RemoveCommand.php.bin
- │ │ ├── RequireCommand.php.bin
- │ │ ├── RunScriptCommand.php.bin
- │ │ ├── SearchCommand.php.bin
- │ │ ├── SelfUpdateCommand.php.bin
- │ │ ├── ShowCommand.php.bin
- │ │ ├── StatusCommand.php.bin
- │ │ ├── UpdateCommand.php.bin
- │ │ └── ValidateCommand.php.bin
- │ ├── Composer.php.bin
- │ ├── Console
- │ │ └── Application.php.bin
- │ ├── Factory.php.bin
- │ ├── IO
- │ │ ├── BaseIO.php.bin
- │ │ ├── ConsoleIO.php.bin
- │ │ └── IOInterface.php.bin
- │ ├── Package
- │ │ ├── BasePackage.php.bin
- │ │ └── PackageInterface.php.bin
- │ ├── Script
- │ │ └── ScriptEvents.php.bin
- │ └── Util
- │ └── ErrorHandler.php.bin
- └── vendor
- ├── autoload.php.bin
- ├── composer
- │ ├── autoload_classmap.php.bin
- │ ├── autoload_namespaces.php.bin
- │ ├── autoload_psr4.php.bin
- │ ├── autoload_real.php.bin
- │ └── ClassLoader.php.bin
- └── symfony
- └── console
- └── Symfony
- └── Component
- └── Console
- ├── Application.php.bin
- ├── Command
- │ ├── Command.php.bin
- │ ├── HelpCommand.php.bin
- │ └── ListCommand.php.bin
- ├── Descriptor
- │ ├── ApplicationDescription.php.bin
- │ ├── DescriptorInterface.php.bin
- │ ├── Descriptor.php.bin
- │ ├── JsonDescriptor.php.bin
- │ ├── MarkdownDescriptor.php.bin
- │ ├── TextDescriptor.php.bin
- │ └── XmlDescriptor.php.bin
- ├── Formatter
- │ ├── OutputFormatterInterface.php.bin
- │ ├── OutputFormatter.php.bin
- │ ├── OutputFormatterStyleInterface.php.bin
- │ ├── OutputFormatterStyle.php.bin
- │ └── OutputFormatterStyleStack.php.bin
- ├── Helper
- │ ├── DebugFormatterHelper.php.bin
- │ ├── DescriptorHelper.php.bin
- │ ├── DialogHelper.php.bin
- │ ├── FormatterHelper.php.bin
- │ ├── HelperInterface.php.bin
- │ ├── Helper.php.bin
- │ ├── HelperSet.php.bin
- │ ├── InputAwareHelper.php.bin
- │ ├── ProcessHelper.php.bin
- │ ├── ProgressHelper.php.bin
- │ ├── QuestionHelper.php.bin
- │ ├── TableHelper.php.bin
- │ ├── Table.php.bin
- │ └── TableStyle.php.bin
- ├── Input
- │ ├── ArgvInput.php.bin
- │ ├── ArrayInput.php.bin
- │ ├── InputArgument.php.bin
- │ ├── InputAwareInterface.php.bin
- │ ├── InputDefinition.php.bin
- │ ├── InputInterface.php.bin
- │ ├── InputOption.php.bin
- │ └── Input.php.bin
- └── Output
- ├── ConsoleOutputInterface.php.bin
- ├── ConsoleOutput.php.bin
- ├── NullOutput.php.bin
- ├── OutputInterface.php.bin
- ├── Output.php.bin
- └── StreamOutput.php.bin
-
-32 directories, 87 files</code></pre>
- </section>
-<section id="php7ast">
- <p class="p" style="font-size:1.1em;text-align:left;">✔ Abstract Syntax Tree!!</p>
- <pre><code data-trim style="font-size:1.1em;">echo substr("abc", [1,2]);</code></pre>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.8em;">% phan -a test.php
-AST_STMT_LIST @ 1
- 0: AST_STMT_LIST @ 2
- 0: AST_ECHO @ 2
- 0: AST_CALL @ 2
- 0: AST_NAME @ 2
- flags: NAME_NOT_FQ (1)
- 0: "substr"
- 1: AST_ARG_LIST @ 2
- 0: "abc"
- 1: AST_ARRAY @ 2
- 0: AST_ARRAY_ELEM @ 2
- flags: 0
- 0: 1
- 1: null
- 1: AST_ARRAY_ELEM @ 2
- flags: 0
- 0: 2
- 1: null</code></pre>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.8em;">% phan test.php
-test.php:2 TypeError arg#2(start) is int[] but substr() takes int</code></pre>
- </section>
<section id="php7excep">
<p class="p" style="font-size:1.1em;text-align:left;">✔ Exceptions on Fatals</p>
<pre><code data-trim style="font-size:1.1em;">function call_method($obj) {
@@ -413,45 +236,6 @@ function cmp_php7($a, $b) {
return $a <=> $b;
}</code></pre>
</section>
-<section id="php7assert">
- <p class="p" style="font-size:1.1em;text-align:left;">✔ Zero-cost Assertions</p>
- <pre><code data-trim style="font-size:1.1em;">function test($arg) {
- assert($arg > 20 && $arg < 110, "$arg is invalid");
-}
-ini_set('zend.assertions',0); test(16);
-ini_set('zend.assertions',1); test(17);
-ini_set('assert.exception',1); test(18);</code></pre>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.9em;">Warning: assert(): 17 is invalid failed in file on line 2
-Fatal error: Uncaught AssertionError: 18 is invalid in file:2
-Stack trace:
-#0 file(2): assert(false, '18 is invalid')
-#1 file(6): test(18)
-#2 {main}
- thrown in file on line 2</code></pre>
- <pre><code class="ini" data-trim style="font-size:1.1em;">; Completely skip compiling assert() calls
-; (can only be set in php.ini)
-zend.assertions = -1</code></pre>
- </section>
-<section id="php7closecall">
- <p class="p" style="font-size:1.1em;text-align:left;">✔ Added Closure::call()</p>
- <pre><code data-trim style="font-size:1.1em;">$f = function () {
- return $this->n;
-};
-class MyClass {
- private $n = 42;
-}
-$myC = new MyClass;
-$c = $f->bindTo($myC, "MyClass");
-$c();</code></pre>
- <pre><code data-trim style="font-size:1.1em;">$f = function () {
- return $this->n;
-};
-class MyClass {
- private $n = 42;
-}
-$myC = new MyClass;
-$f->call($myC);</code></pre>
- </section>
<section id="php7cleanups">
<p class="p" style="font-size:1.1em;text-align:left;">✔ Removal of many deprecated features<BR/>
(Your PHP4 code will break!)</p>
@@ -561,8 +345,8 @@ $bytes = random_bytes(10);
var_dump( $int );
var_dump( bin2hex($bytes) );</code></pre>
- <pre class="output" style="font-size:1.2em;">int(-221)
-string(20) "f083364202516c8c5845"
+ <pre class="output" style="font-size:1.2em;">int(-363)
+string(20) "98ee21d594529d55a327"
</pre> </section> </section>
<section>
<section id="php7perfdetail">
@@ -625,87 +409,48 @@ Hugepagesize: 2048 kB</code></pre>
<h1 style="text-align:center;">JIT?</h1>
</section> </section>
<section>
- <section id="smem">
- <p class="p" style="font-size:1.3em;text-align:left;">Measuring Memory Use</p>
- <ul>
- <li style="font-size: 0.8em;list-style-type: none;">VSZ - Virtual Memory Size (swapped out, shared libs, everything)</li>
- <li style="font-size: 0.8em;list-style-type: none;">RSS - Resident Set Size (everything not swapped out)</li>
- <li style="font-size: 0.8em;list-style-type: none;">SIZE - Data segment of the process</li>
- </ul>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.9em;">debian:/home/rasmus# ps ef -o command,vsize,rss,size -C php-fpm
-COMMAND VSZ RSS SIZE
-php-fpm: master process (/u 459152 9912 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304
- \_ php-fpm: pool www 459152 7732 3304</code></pre>
- </section>
-<section id="smemtop">
- <p class="p" style="font-size:1.3em;text-align:left;">top isn't helpful either</p>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.9em;">debian:/home/rasmus# top -p $(pgrep -d , php-fpm)
-top - 07:04:14 up 19 days, 15:21, 1 user, load average: 0.00, 0.04, 0.51
-Tasks: 11 total, 0 running, 11 sleeping, 0 stopped, 0 zombie
-%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
-KiB Mem: 16355868 total, 15789244 used, 566624 free, 493148 buffers
-KiB Swap: 0 total, 0 used, 0 free. 13514376 cached Mem
-
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
-13950 root 20 0 459152 9912 6016 S 0.0 0.1 0:00.02 php-fpm
-13951 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13952 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13953 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13954 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13955 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13956 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13957 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13958 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13959 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm
-13960 www-data 20 0 459152 7732 3836 S 0.0 0.0 0:00.00 php-fpm</code></pre>
+ <section id="drupalbench">
+
+<div id="drupalbench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/drupalbench.js"></script>
+ </section> </section>
+ <section>
+ <section id="wpbench">
+
+<div id="wpbench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/wpbench.js"></script>
</section>
-<section id="smembaseintro">
- <p class="p" style="font-size:1.3em;text-align:left;">smem!</p>
- <ul>
- <li style="font-size: 0.8em;list-style-type: none;">USS - Unique Set Size</li>
- <li style="font-size: 0.8em;list-style-type: none;">PSS - Proportional Set Size</li>
- <li style="font-size: 0.8em;list-style-type: none;">RSS - Resident Set Size</li>
- </ul>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.9em;">debian:/home/rasmus# smem -t -k -U www-data -P ".*php-fpm"
- PID User Command Swap USS PSS RSS
-12570 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12571 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12572 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12573 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12574 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12575 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12576 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12577 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12578 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
-12579 www-data php-fpm: pool www 0 156.0K 621.0K 7.6M
--------------------------------------------------------------------------------
- 10 1 0 1.5M 6.1M 75.9M</code></pre>
+<section id="fdo">
+ <p class="p" style="font-size:1.1em;text-align:center;">GCC Feedback-Directed Optimization (FDO)</p>
+ <pre><code class="shell nohighlight" data-trim style="font-size:1em;">$ make clean
+$ make -j8 prof-gen
+...
+$ sapi/cgi/php-cgi -T 1000 /var/www/wordpress/index.php > /dev/null
+$ make prof-clean
+$ make -j8 prof-use</code></pre>
</section>
-<section id="smemload">
- <p class="p" style="font-size:1.3em;text-align:left;">Serving Drupal 8</p>
- <pre><code class="shell nohighlight" data-trim style="font-size:0.9em;">debian:/home/rasmus# smem -t -k -U www-data -P ".*php-fpm"
- PID User Command Swap USS PSS RSS
-13233 www-data php-fpm: pool www 0 792.0K 1.3M 9.2M
-13231 www-data php-fpm: pool www 0 792.0K 1.3M 9.2M
-13235 www-data php-fpm: pool www 0 792.0K 1.3M 9.2M
-13232 www-data php-fpm: pool www 0 796.0K 1.3M 9.2M
-13234 www-data php-fpm: pool www 0 792.0K 1.3M 9.3M
-13227 www-data php-fpm: pool www 0 808.0K 1.3M 9.2M
-13229 www-data php-fpm: pool www 0 808.0K 1.3M 9.2M
-13230 www-data php-fpm: pool www 0 808.0K 1.3M 9.2M
-13226 www-data php-fpm: pool www 0 808.0K 1.3M 9.2M
-13228 www-data php-fpm: pool www 0 808.0K 1.3M 9.3M
--------------------------------------------------------------------------------
- 10 1 0 7.8M 12.9M 92.4M</code></pre>
+<section id="wpbench_fdo">
+
+<div id="wpbench_fdo_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/wpbench_fdo.js"></script>
+ </section> </section>
+ <section>
+ <section id="bbbench">
+
+<div id="bbbench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/bbbench.js"></script>
+ </section> </section>
+ <section>
+ <section id="moodlebench">
+
+<div id="moodlebench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/moodlebench.js"></script>
+ </section> </section>
+ <section>
+ <section id="wardrobebench">
+
+<div id="wardrobebench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/wardrobebench.js"></script>
</section> </section>
<section>
<section id="smembase">
diff --git a/expotec.xml b/expotec.xml
index 8eb44cc..c76a8fc 100644
--- a/expotec.xml
+++ b/expotec.xml
@@ -24,10 +24,15 @@
<slide>slides/intro/titlepage.xml</slide>
-<slide>slides/intro/php7_2016.xml</slide>
+<slide>slides/intro/php7_2016s.xml</slide>
<slide>slides/intro/php7_perf.xml</slide>
-<slide>slides/intro/smem.xml</slide>
+<slide>slides/intro/nov3/drupalbench.xml</slide>
+<slide>slides/intro/nov3/wpbench.xml</slide>
+<slide>slides/intro/nov3/bbbench.xml</slide>
+<slide>slides/intro/nov3/moodlebench.xml</slide>
+<slide>slides/intro/nov3/wardrobebench.xml</slide>
+
<slide>slides/intro/smembase.xml</slide>
<slide>slides/intro/smemdrupal.xml</slide>
<slide>slides/intro/smemwp.xml</slide>
diff --git a/slides/intro/php7_2016s.xml b/slides/intro/php7_2016s.xml
new file mode 100644
index 0000000..12eb059
--- /dev/null
+++ b/slides/intro/php7_2016s.xml
@@ -0,0 +1,275 @@
+<slide title="" section="php7">
+
+<image filename="php7trans-200.png" />
+
+<blurb fontsize="1.1em" align="left">✔ engine improvements</blurb>
+<list>
+<bullet fontsize="1em">100%+ performance gain on most real-world applications</bullet>
+<bullet fontsize="1em">Lower memory usage, sometimes drastically lower</bullet>
+</list>
+
+<break lines="1" section="php7excep"/>
+<blurb fontsize="1.1em" align="left">✔ Exceptions on Fatals</blurb>
+<example fontsize="1.1em" result='0' title=""><![CDATA[
+function call_method($obj) {
+ $obj->method();
+}
+call_method(null);
+]]></example>
+<example fontsize="0.85em" result='0' title="" type="shell nohighlight"><![CDATA[
+Fatal error: Uncaught Error: Call to a member function method() on null in file:2
+Stack trace:
+#0 file(4): call_method(NULL)
+#1 {main}
+ thrown in file on line 2
+]]></example>
+
+<example fontsize="1.1em" result='0' title=""><![CDATA[
+<?php
+try {
+ call_method(null);
+} catch (Error $e) {
+ echo "Caught Exception: {$e->getMessage()}\n";
+}
+]]></example>
+<example fontsize="0.85em" result='0' title="" type="shell nohighlight"><![CDATA[
+Caught Exception: Call to a member function method() on null
+]]></example>
+
+<break lines="1" section="php7hier"/>
+<blurb fontsize="2em" align="center">PHP 7 Exception Hierarchy</blurb>
+<break lines="1"/>
+<list fontsize="1.5em">
+<bullet fontsize="1.5em" type="none">|ab5c5c|Throwable|</bullet>
+<bullet fontsize="1.25em" marginleft="2em" type="none">➥ |ab5c5c|Exception| implements Throwable</bullet>
+<bullet fontsize="1.25em" marginleft="2em" type="none">➥ |ab5c5c|Error| implements Throwable</bullet>
+<bullet fontsize="1em" marginleft="4em" type="none">➥ |ab5c5c|TypeError| extends Error</bullet>
+<bullet fontsize="1em" marginleft="4em" type="none">➥ |ab5c5c|ParseError| extends Error</bullet>
+</list>
+
+<break lines="1" section="php7ret"/>
+<blurb fontsize="1.1em" align="left">✔ Return Types</blurb>
+<example fontsize="1.1em" result='0' title=""><![CDATA[
+function get_config(): array {
+ return 42;
+}
+get_config();
+]]></example>
+<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
+Fatal error: Uncaught TypeError: Return value of get_config() must be
+of the type array, integer returned in file:2
+Stack trace:
+#0 file(4): get_config()
+#1 {main}
+ thrown in file on line 2
+]]></example>
+<break lines="1" section="php7STH"/>
+
+<blurb fontsize="1.1em" align="left">✔ Coercive Scalar Types</blurb>
+
+<example fontsize="1.1em" result='0' title=""><![CDATA[
+function logmsg(string $msg, int $level, float $severity) {
+ var_dump($msg); // string(1) "1"
+ var_dump($level); // int(2)
+ var_dump($severity); // float(3)
+}
+logmsg(1, "2.5 bananas", 3);
+]]></example>
+<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
+Notice: A non well formed numeric value encountered in file on line 2
+]]></example>
+<blurb fontsize="1.1em" align="left">✔ Strict Scalar Types</blurb>
+<example fontsize="1.1em" result='0' title=""><![CDATA[
+declare(strict_types=1);
+...
+logmsg(1, "2.5", 3);
+]]></example>
+<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
+Fatal error: Uncaught TypeError: Argument 1 passed to logmsg() must be of the
+type string, integer given, called in file on line 7 and defined in file:3
+Stack trace:
+#0 file(7): logmsg(1, '2.5', 3)
+#1 {main}
+ thrown in file on line 2
+]]></example>
+
+<break lines="1" section="php7anon"/>
+<blurb fontsize="1.1em" align="left">✔ Anonymous Classes</blurb>
+<example fontsize="1.2em" result='0' title=""><![CDATA[
+<?php
+return new class($controller) implements Page {
+ public function __construct($controller) {
+ /* ... */
+ }
+ /* ... */
+};
+
+class MyObject extends MyStuff {
+ public function getInterface() {
+ return new class implements MyInterface {
+ /* ... */
+ };
+ }
+}
+]]></example>
+
+<break lines="1" section="php7coalesce"/>
+<blurb fontsize="1.1em" align="left">✔ Coalesce Operator</blurb>
+<example fontsize="1.5em" result='0' title=""><![CDATA[
+<?php
+$a = NULL;
+$b = 0;
+$c = 2;
+
+echo $a ?? $b; // 0
+echo $c ?? $b; // 2
+echo $a ?? $b ?? $c; // 0
+echo $a ?? $x ?? $c; // 2
+]]></example>
+
+<break lines="1" section="Spaceship"/>
+<blurb fontsize="1.1em" align="left">✔ Spaceship Operator</blurb>
+<image filename="lego-php-astronaut.png" width="230" height="345"/>
+<example fontsize="1.1em" result='0' title=""><![CDATA[
+<?php
+
+function cmp_php5($a, $b) {
+ return ($a < $b) ? -1 : (($a >$b) ? 1 : 0);
+}
+
+function cmp_php7($a, $b) {
+ return $a <=> $b;
+}
+]]></example>
+
+<break lines="1" section="php7cleanups"/>
+<blurb fontsize="1.1em" align="left">✔ Removal of many deprecated featuresBR/
+ (Your PHP4 code will break!)</blurb>
+<example result='0' title=""><![CDATA[
+- ext/ereg (use ext/pcre instead)
+- preg_replace() eval modifier (use preg_replace_callback() instead)
+- ext/mysql (use ext/mysqli or ext/pdo_mysql instead)
+- Assignment of new by reference
+- Scoped calls of non-static methods from incompatible $this context
+
+- dl() in php-fpm
+- set_magic_quotes_runtime() and magic_quotes_runtime()
+- set_socket_blocking() (use stream_set_blocking() instead)
+- mcrypt_generic_end() (use mcrypt_generic_deinit() instead)
+- mcrypt_ecb, mcrypt_cbc, mcrypt_cfb and mcrypt_ofb
+ (use mcrypt_encrypt() and mcrypt_decrypt() instead)
+- datefmt_set_timezone_id() and IntlDateFormatter::setTimeZoneID()
+ (use datefmt_set_timezone() or IntlDateFormatter::setTimeZone() instead)
+
+- xsl.security_prefs (use XsltProcessor::setSecurityPrefs() instead)
+- iconv.input_encoding, iconv.output_encoding, iconv.internal_encoding,
+ mbstring.http_input, mbstring.http_output and mbstring.internal_encoding
+ (use php.input_encoding, php.internal_encoding and php.output_encoding instead)
+
+- $is_dst parameter of the mktime() and gmmktime() functions
+- # style comments in ini files (use ; style comments instead)
+- String category names in setlocale() (use LC_* constants instead)
+- Unsafe curl file uploads (use CurlFile instead)
+- PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT driver option
+ (use PDO::ATTR_EMULATE_PREPARES instead)
+- CN_match and SNI_server_name stream context option (use peer_name instead)
+]]></example>
+
+
+<break lines="1" section="php7reserved"/>
+<blurb fontsize="1.1em" align="left">✔ New reserved words:</blurb>
+<list>
+<bullet fontsize="1em" type="none">bool</bullet>
+<bullet fontsize="1em" type="none">int</bullet>
+<bullet fontsize="1em" type="none">float</bullet>
+<bullet fontsize="1em" type="none">string</bullet>
+<bullet fontsize="1em" type="none">null</bullet>
+<bullet fontsize="1em" type="none">false</bullet>
+<bullet fontsize="1em" type="none">true</bullet>
+<bullet fontsize="1em" type="none">resource</bullet>
+<bullet fontsize="1em" type="none">object</bullet>
+<bullet fontsize="1em" type="none">mixed</bullet>
+<bullet fontsize="1em" type="none">numeric</bullet>
+</list>
+
+<break lines="1" section="php7num"/>
+
+<blurb fontsize="1.1em" align="left">✔ 64-bit integer support on Windows</blurb>
+<blurb fontsize="1.1em" align="left">✔ Cleanup edge-case integer overflow/underflow</blurb>
+<blurb fontsize="1.1em" align="left">✔ Support for strings with length >= 2^31 bytes in 64 bit builds.</blurb>
+<blurb fontsize="1.1em" align="left">✔ Parse error on invalid numeric literals</blurb>
+<example result='0' title=""><![CDATA[
+<?php
+$mask = 0855; // Parse error: Invalid numeric literal
+]]></example>
+
+<break lines="1" section="php7UVS"/>
+
+<blurb fontsize="1.1em" align="left">✔ Uniform variable syntax</blurb>
+
+<example result='0' title=""><![CDATA[
+<?php
+// left-to-right
+$this->$belongs_to['column']
+// vs.
+$this->{$belongs_to['column']}
+
+// support missing combinations of operations
+$foo()['bar']()
+[$obj1, $obj2][0]->prop
+getStr(){0}
+
+// support nested ::
+$foo['bar']::$baz
+$foo::$bar::$baz
+$foo->bar()::baz()
+
+// support nested ()
+foo()()
+$foo->bar()()
+Foo::bar()()
+$foo()()
+
+// support operations on arbitrary (...) expressions
+(...)['foo']
+(...)->foo
+(...)->foo()
+(...)::$foo
+(...)::foo()
+(...)()
+
+// two more practical examples for the last point
+(function() { ... })()
+($obj->closure)()
+
+// support all operations on dereferencable scalars
+// (not very useful)
+"string"->toLower()
+[$obj, 'method']()
+'Foo'::$bar
+]]></example>
+
+<break lines="1" section="php7unicode"/>
+
+<blurb fontsize="1.1em" align="left">✔ Unicode Codepoint Escape Syntax</blurb>
+<example fontsize="1.2em" result='1' title=""><![CDATA[
+<?php
+echo "\u{202E}Right-to-left text";
+
+echo " \u{26BD}";
+]]></example>
+
+<blurb fontsize="1.1em" align="left">✔ ICU IntlChar class added to intl extension</blurb>
+
+<break lines="1" section="php7csprng"/>
+<blurb fontsize="1.1em" align="left">✔ CSPRNG</blurb>
+<example fontsize="1.2em" result='1' title=""><![CDATA[
+<?php
+$int = random_int(-500, 500);
+$bytes = random_bytes(10);
+
+var_dump( $int );
+var_dump( bin2hex($bytes) );
+]]></example>
+
+</slide>