Drupal 8's installer and Xdebug don't mix
Anecdotally, Drupal 8 is slower than anything before it - maybe 4x slower. While installing Drupal 8.0.0-beta3 so I could work on upgrading the Masquerade module, I found the installer dreadfully slow. I started a timer when I got to the Batch API-enabled "Install site" page. The installer ran for 10 minutes to get as far as step 32 of 37. Then it errored-out.
An AJAX HTTP error occurred. HTTP Result Code: 200 Debugging information follows. Path: http://localhost/drupal8/core/install.php?langcode=en&profile=standard&i... StatusText: OK ResponseText: ( ! ) Fatal error: Maximum execution time of 30 seconds exceeded in /Users/davidnorman/Sites/drupal8/core/lib/Drupal/Core/Extension/ModuleHandler.php on line 261
I've installed Drupal probably thousands of times and I knew my MacBook Pro Retina, 3rd-generation quad core i7 processor with a SSD wasn't a bottleneck. At the time, I only had one extra PHP extension enabled - Xdebug (see my phpinfo()). It only had a basic configuration. Sometimes I enable things like xdebug.collect_assignments
or xdebug.show_local_vars
, but even those weren't enabled at the time.
[xdebug]zend_extension="/usr/local/Cellar/php56-xdebug/2.2.6/xdebug.so"xdebug.auto_trace = On
To get Drupal to install, I commented the Xdebug zend_extension
at /usr/local/etc/php/5.6/conf.d/ext-xdebug.ini
, did a brew install php56-apcu
, and restarted my MacBook.
After I swapped Xdebug for APCU, the "Install site" portion of the Drupal 8 installer took only 30 seconds to complete and did not time-out, versus the 10 minutes with ultimate failure while Xdebug was enabled.
At this point, I'm seem to be left to conclude that if I wanted to use Xdebug to debug the installer, that my only option is to increase the default 30 second timeout in my /usr/local/etc/php/5.6/php.ini
. Alternatively, if I want to use Xdebug for day-to-day module development, that I'll need to disable Xdebug temporarily to get a local install setup.
Drupal 8 does a lot more stuff to process a page. Core developers have succeeded in moving most of the code to use object oriented methods with namespaces and protected variable spaces, but at the expense of turning a vanilla install into about 76MB. Drupal 7.34 is only 15MB.
To make a point, I inserted a debug_print_backtrace()
in EntityAccessControlHandler::access()
. This is a basic call in core that would check access on anything that's an entity - users, nodes, etc. After Firefox choked on the resulting output, I attempted to make a snapshot of the page using Evernote to link to in this article. Instead, even Evernote told me that the page was too big to capture.
I guess I don't really have any other point to make. It's not like this article is going to make Drupal 8 faster. I don't have advice for making it lightweight. It's what we have to live with now in the supposed pursuit of progress and modern sophistication. I'm just leaving my breadcrumb for other developers who might find it impossible to even get Drupal 8 installed using an environment that worked for Drupal 7 since I was able to get through the "Install site" part of the Drupal 7.34 installer with Xdebug enabled and with APCU disabled in only 14 seconds.
Post categories