The latest PHP 7.3 has introduced several core changes and deprecation of functionalities. One of the most important change is that the cyclic Garbage Collector has been enhanced. This may result in considerable performance improvements for your average PHP site.
GC Improvement
I did some testing with a quickly done horrible Laravel project that does very stupid things. I ran their tests on a Virtual Machine I spinned up with 32 cores and 64 GB of RAM. Although RAM is abundant nowadays, read/write speed of RAM has not improved significantly. Hence, these results might not differ from a modern laptop you are running. Results – there are some slight difference between PHP 7.2 and 7.3.
So here are the tabulated results.
Test Case | PHP 7.2 | PHP 7.3 |
Repetitive Math Sum #1 | 40.590319871902 | 39.114274024963 |
Repetitive Math Sum #1 | 40.383301973343 | 38.955203056335 |
Repetitive Math Sum #1 | 40.431354999542 | 38.510466814041 |
Repetitive Math Sum #1 | 40.554687976837 | 38.414289951324 |
Repetitive Math Sum #1 | 40.324609994888 | 39.437994003296 |
Repetitive Math Sum #1 | 40.309583902359 | 38.586963891983 |
Repetitive Math Sum #1 | 40.491557121277 | 38.527884960175 |
Repetitive Math Sum #1 | 40.561191082001 | 38.572283983231 |
Repetitive Math Sum #1 | 40.399183988571 | 38.274201154709 |
Repetitive Math Sum #1 | 40.378094911575 | 39.014632940292 |
Repetitive Math Sum #2 | 40.482236862183 | 39.098721981049 |
Repetitive Math Sum #2 | 40.387506008148 | 38.896921873093 |
Repetitive Math Sum #2 | 40.262095928192 | 38.51801609993 |
Repetitive Math Sum #2 | 40.48206114769 | 38.506614923477 |
Repetitive Math Sum #2 | 40.339349985123 | 38.705502033234 |
Repetitive Math Sum #2 | 40.304159879684 | 38.672913074493 |
Repetitive Math Sum #2 | 40.328411102295 | 38.605751991272 |
Repetitive Math Sum #2 | 40.336602926254 | 38.660679101944 |
Repetitive Math Sum #2 | 40.447332143784 | 38.278237819672 |
Repetitive Math Sum #2 | 40.399180173874 | 38.887251138687 |
Repetitive Object Creation & Removal #1 | 47.221386909485 | 42.577863931656 |
Repetitive Object Creation & Removal #1 | 46.490031957626 | 43.560690164566 |
Repetitive Object Creation & Removal #1 | 47.303919792175 | 42.877938985825 |
Repetitive Object Creation & Removal #1 | 47.844959974289 | 42.660858869553 |
Repetitive Object Creation & Removal #1 | 47.971740007401 | 43.204864025116 |
Repetitive Object Creation & Removal #1 | 47.3921251297 | 42.887193202972 |
Repetitive Object Creation & Removal #1 | 46.794338941574 | 43.227856874466 |
Repetitive Object Creation & Removal #1 | 47.045123815536 | 43.104037046432 |
Repetitive Object Creation & Removal #1 | 47.638715028763 | 42.578276157379 |
Repetitive Object Creation & Removal #1 | 47.700441837311 | 42.945841789246 |
Repetitive Object Creation & Removal #2 | 71.102308988571 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 69.664057016373 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 70.938825845718 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 71.190234899521 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 72.151322126389 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 71.034454107285 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 70.705224990845 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 70.763866901398 | Segmentation fault (core dumped) |
Repetitive Object Creation & Removal #2 | 70.451802015305 | free(): invalid pointer |
Repetitive Object Creation & Removal #2 | 70.846419095993 | Segmentation fault (core dumped) |
The raw results are appended at the bottom of the post.
The results we want to take a look at for GC improvement is ‘Repetitive Object Creation & Removal #1’ and ‘Repetitive Object Creation & Removal #2’. The difference between these 2 is that #2 attempts to a manual GC cycle after an ‘unset’ is called. An interesting observation is that PHP 7.3 refuses to handle the terrible circular object references I’ve implanted.
Other than that, we can observe that there’s a slight improvement in execution for #1. Its an average of 47 seconds VS 42 seconds – a five seconds improvement which might translate to an observable slight difference for a typical site that heavily uses classes and objects.
These sites include but are not limited to sites that relies heavily on frameworks, especially those that implement Active Record pattern. WordPress sites might not have much improvements.
Code Optimization
There has been some improvements made to the Zend code optimizer as well. These changes are able to catch some rare cases and optimize them as the previous version would not have. Your code needs to be very bad and had edge cases which the former optimizer could not detect for the speed to improve.
As observed in the results printed above (Repetitive Math Sum #1 & Repetitive Math Sum #2), you’ll notice that there’s only consistent two seconds improvement between PHP 7.2 and PHP 7.3. Do note that the code execution took 40 seconds vs 38 seconds.
Other than that, if you take a look at online benchmarks, you will notice that there are some slight performance improvements. This might not be due to the enhanced GC but rather due to this code optimization improvement. For example, PHP 7.3 Laravel vs PHP 7.2 Laravel.
Mono-atomic timer
Support for mono-atomic timer as a function (hrtimer) has been added. This feature is particularly useful for creating time-sensitive software such as highly available databases which usually uses a mono-atomic clock (sometimes combined with GPS clock) for tuple timestamp. With this, we might even have a new highly available database software programmed in PHP!
A mono-atomic clock is not affected by seconds leap and will only tick forward according to its CPU ticks. Its relatively simple to measure the rough equivalent of 5 seconds in a mono-atomic timer. Usually, you might want to get an average as sleep is not very exact. 5 seconds might actually be 5.000002 seconds or 4.9964 seconds, etc.
<?php
$start = hrtime(true);
sleep(5);
$end = hrtime(true);
$five_seconds_in_mono_atomic = $end - $start;
Xdebug Incompatibility Issue
Apparently, PHP 7.3 is not compatible with Xdebug versions 2.6.x and requires the beta version 2.7.0beta1. More information about this can be seen on the xdebug bug issue.
Deprecation & Support For Enterprises
Support for ODBCRouter and Birdstep has been removed. These were very old unsupported stuff and was deprecated long ago. Overall, there hasn’t been too much of deprecation and incompatibility between PHP 7.2 and 7.3. This means that the upgrade process would be relatively easier as compared to when upgrading from 7.1 to 7.2.
PHP 7.3 will have active support until 6 Dec 2020 whilst security support until 6 Dec 2021. Active support meant that new minor features, improvements, bug fixes and security fixes will be provided. Security support meant that only security fixes will be provided.
All PHP support timeline is visible on the PHP site.
Raw Results
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.590319871902.40.482236862183.47.221386909485. 5 / 5 (100%)71.102308988571
Time: 3.32 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.383301973343.40.387506008148.46.490031957626. 5 / 5 (100%)69.664057016373
Time: 3.28 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.431354999542.40.262095928192.47.303919792175. 5 / 5 (100%)70.938825845718
Time: 3.31 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.554687976837.40.48206114769.47.844959974289. 5 / 5 (100%)71.190234899521
Time: 3.33 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.324609994888.40.339349985123.47.971740007401. 5 / 5 (100%)72.151322126389
Time: 3.34 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.309583902359.40.304159879684.47.3921251297. 5 / 5 (100%)71.034454107285
Time: 3.31 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.491557121277.40.328411102295.46.794338941574. 5 / 5 (100%)70.705224990845
Time: 3.3 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.561191082001.40.336602926254.47.045123815536. 5 / 5 (100%)70.763866901398
Time: 3.31 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.399183988571.40.447332143784.47.638715028763. 5 / 5 (100%)70.451802015305
Time: 3.31 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php72 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..40.378094911575.40.399180173874.47.700441837311. 5 / 5 (100%)70.846419095993
Time: 3.32 minutes, Memory: 19688.00MB
OK (5 tests, 5 assertions)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..39.114274024963.39.098721981049.42.577863931656Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.955203056335.38.896921873093.43.560690164566Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.510466814041.38.51801609993.42.877938985825Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.414289951324.38.506614923477.42.660858869553Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..39.437994003296.38.705502033234.43.204864025116Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.586963891983.38.672913074493.42.887193202972Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.527884960175.38.605751991272.43.227856874466Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.572283983231.38.660679101944.43.104037046432Segmentation fault (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..38.274201154709.38.278237819672.42.578276157379free(): invalid pointer
Aborted (core dumped)
[root@fedora-c-32-64gib-sgp1-01 horrible-site]# php73 vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
..39.014632940292.38.887251138687.42.945841789246Segmentation fault (core dumped)