Deploy HHVM on PHP

Deploy HHVM on PHP

HHVM doesn’t and have no plans to support 32 bit operating system. As we are running Debian 7.8 Wheezy (on Plesk), we will install it from prebuilt packages.

sudo apt-get install software-properties-common
wget -O - | sudo apt-key add -
sudo add-apt-repository "deb $(lsb_release -sc) main"
sudo apt-get update
sudo apt-get -y install hhvm

To test it’s working, type:

hhvm --help

Now, we want to use HHVM in the FastCGI mode.

By reading this script /usr/share/hhvm/ I found out that only one file needs to be included: /etc/nginx/hhvm.conf

include /etc/nginx/hhvm.conf;

Warning: HHVM has incorporated a lot of commonly used PHP extensions. However, if an application uses a PHP extension that hasn’t been incorporated yet, choosing HHVM will break the application. The complete list of PHP extensions that have been ported over to HHVM is here

Make HHVM start at boot:

sudo update-rc.d hhvm defaults
Watch out of ports and sockets

As detected from here, we are communication with php-fpm by sockets. If this would not be the case, we would need to change HHVM port. But for our current situation it’s safe to communicate to HHVM via port.

grep "listen =" /etc/php5/fpm/pool.d/*.conf

But I could also switch to using HHVM via sockets, but for now - I won’t.

Sources & Articles

    location ~ \.php$ {
        try_files /5cfdacfc84ded7cb25fbc0ad678ef7be.htm @php;

    location @php {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/lib/php5-fpm/web23.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;

HHVM: Prebuilt packages on Ubuntu 15.04 (vivid) · facebook/hhvm Wiki

Install HHVM with package manager

Prebuilt packages on Ubuntu 15.04

That file contains only this:

location ~ \.(hh|php)$ {
    fastcgi_keep_conn on;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;

HHVM is installed. *

  • Running PHP web scripts with HHVM is done by having your
  • webserver talk to HHVM over FastCGI. Install nginx or Apache,
  • and then:
  • $ sudo /usr/share/hhvm/
  • $ sudo /etc/init.d/hhvm restart
  • (if using nginx) $ sudo /etc/init.d/nginx restart
  • (if using apache) $ sudo /etc/init.d/apache restart
  • Detailed FastCGI directions are online at:
  • If you’re using HHVM to run web scripts, you probably want it
  • to start at boot:
  • $ sudo update-rc.d hhvm defaults
  • Running command-line scripts with HHVM requires no special setup:
  • $ hhvm whatever.php
  • You can use HHVM for /usr/bin/php even if you have php-cli
  • installed:
  • $ sudo /usr/bin/update-alternatives \
  • –install /usr/bin/php php /usr/bin/hhvm 60

Test the HHVM

First, I want to create phpinfo() files, both for PHP and HHVM:

cd /var/www/
echo "<?php phpinfo(); ?>" >nfo.php
wget -O nfo_hhvm.php


Making your own High Performance WordPress Server | Zach Adams | Boise Web Design and Development - Making your own WPEngine-Like High Performance WordPress Server

joostlaan/hhvm-laravel Repository | Docker Hub Registry - Repositories of Docker Images

HHVM permissions

We have to allow group write permissions to files in Wordpress:

# Permissions for HHVM
find . -type d -exec chmod 775 {} \;
find . -type f -exec chmod 664 {} \;

Also, add this to wp-config.php, but it’s not necessary:

if (defined('HHVM_VERSION')) {
  define('FS_CHMOD_DIR', 0775);
  define('FS_CHMOD_FILE', 0664);

  define('FS_METHOD', 'direct');

In this way, all new files created by WP itself will have adequate permissions. I also think that the line with FS_METHOD is not really required.

Those more permissive permissions, as set above, are nicely explained in WordPress Codex: Changing File Permissions « WordPress Codex

HHVM runs under www-data user, same as nginx. On ISPConfig, www-data user is already part of client? groups, so no additional settings are necessary.

Also, if switching again to PHP-FPM, and some dirs were created by HHVM, we also need to add a user of PHP-FPM to the HHVM’s group:

usermod -a -G www-data web1

Fastest way to set wanted owners is:

# Ownership
chown -R --reference . *

Add HHVM to services

Add these to /usr/lib/systemd/system/hhvm.service:

Description=HHVM HipHop Virtual Machine (FCGI)

ExecStartPre=-/usr/bin/mkdir -p /var/run/hhvm
ExecStartPre=-/usr/bin/chown nobody /var/run/hhvm
ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nobody --mode daemon -vServer.Type=fastcgi -vServer.Port=9000


And do some systemctl work to make it start automatically:

systemctl enable hhvm
systemctl start hhvm
systemctl status hhvm

Building and installing hhvm on CentOS 7.x · facebook/hhvm Wiki How to use HHVM with systemd / journald / syslog? · Issue #4785 · facebook/hhvm include systemd init setup files in hhvm proper? · Issue #4520 · facebook/hhvm

Problems with HHVM


cat <<'EOF' >> /etc/nginx/fastcgi_params

# Increase maximum execution time in seconds (default was 30)
fastcgi_read_timeout 600;


Nginx timeout + PHP-FPM/HHVM

There is a problem in HHVM and it’s cUrl extension:

Installing composer using vagrant, hhvm

Error in SlowTimer [5241ms] at curl:


curl_setopt($ch_2, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt($ch_2, CURLOPT_TIMEOUT, 86400); curl_setopt($ch_2, CURLOPT_LOW_SPEED_LIMIT, 10240); curl_setopt($ch_2, CURLOPT_LOW_SPEED_TIME, 60);

ResourceLimit.SocketDefaultTimeout=30 # in seconds Http.SlowQueryThreshold=30000 # in milliseconds (took me half an hour to figure this one out)

Building a Better PHP — Part 2: Using HHVM

? hhvm.http.default_timeout

; max_execution_time alternative

the max_execution_time value defined in the php.ini.

The ini setting max_execution_time is for CLI scripts. For a server you want to set hhvm.server.request_timeout_seconds=5. Also note that this will set a timeout for the request not just script execution, so if the script has been queued for longer than this timeout it won’t run at all. I verified that this works with the FastCGI server in my environment.

You can use the hhvm.server.connection_timeout_seconds INI setting, which defaults to 120, to control how long a FastCGI request will last for.

How to Purge Nginx FastCGI Cache from WordPress Admin Panel | WEBVISION

How to Install nginx and google pagespeed on Ubuntu 15.04 (Vivid Vervet) Dashboard ‹ — WordPress How To Use Multiple PHP Versions (PHP-FPM & FastCGI) With ISPConfig 3 (Ubuntu 13.04)

Running HHVM with fallback to PHP-FPM phpinfo() ISPConfig

linux - How to execute a command whenever a file changes? - Super User Why don’t you buy | Parked Domains Install WordPress with HHVM, Nginx and MariaDB on an Ubuntu 12.04 LTS | Linux VPS Hosting Blog HHVM, MariaDB and Nginx Make WordPress Fly - Intro “Call to undefined function force_ssl_admin()” - Google Search Get Google to fall in love with you - in 9 steps | Wordtracker Academy Search Console - Crawl Errors - How to Set Up LEMH (Linux, Nginx, MariaDB, HHVM) Stack in Ubuntu Server - Make Tech Easier ISPConfig HHVM Wow HHVM is fast…too bad it doesn’t run my code « HHVM Getting WordPress running on HHVM « HHVM hhvm wordpress compatibility - Google Search WP Engine Sponsors John James Jacoby to Work on HHVM Compatibility with BuddyPress HHVM for Varying Vagrant Vagrants: WordPress Development on Speed hgv/provisioning/roles/nginx/templates/nas/wp/www/sites at master · wpengine/hgv Database: koviljaca_rs - Adminer

Debugging HHVM falling over | Web Hosting Talk HHVM 3.0 / Hack with Nginx cannot access file in directory with 770 permissions on Ubuntu 13.10 while having group membership - Stack Overflow HHVM and directory permissions · Issue #150 · roots/trellis HHVM seems to fail on some group permission s · Issue #2248 · facebook/hhvm

500 hphp_invoke white screen of dead · Issue #3667 · facebook/hhvm php - HHVM returns error 500 - Stack Overflow php - nginx - laravel - hhvm-Fastcgi get error 500 - Stack Overflow WooCommerce ‘Place Order’ 500 Error on HHVM | WEBVISION hhvm toString php error · Issue #5551 · facebook/hhvm WordPress › Support » Fatal error: Call to undefined function wp() in wp-blog-header.php on line 18

Trying to fix that HHVM:

hhvm timeout - Google Search INI Settings · facebook/hhvm Wiki hhvm max_execution_time - Google Search Hack and HHVM: Runtime Configuration - Manual Hack and HHVM: set_time_limit - Manual max_execution_time ignored · Issue #4124 · facebook/hhvm max_execution_time hhvm · Issue #4209 · facebook/hhvm Config Litespeed with HHVM FastCGI | LiteSpeed Support Forums api - PHP curl maximum execution time using hhvm - Stack Overflow hhvm SlowTimer at curl - Google Search Hack and HHVM: curl_setopt - Manual Hack and HHVM: curl_setopt - Manual hhvm/builtins_curl.hhi at master · facebook/hhvm SlowTimer at curl - Google Search Installing composer using vagrant, hhvm, and Ubuntu 14.04 - Stack Overflow Building a Better PHP — Part 2: Using HHVM Disqus - Speed up Composer by using HHVM, including a SlowTimer error fix - resourcelimit.socketdefaulttimeout=30 - Google Search Thought I’d update this classic comic for us PHP guys (and gals)… XKDC’s “compiling” : PHP failed to load Hack and HHVM: Runtime Configuration - Manual HHVM-3.3.0 InvalidArgumentException · Issue #3797 · facebook/hhvm Hack and HHVM: Runtime Configuration - Manual max_execution_time hhvm · Issue #4209 · facebook/hhvm HHVMinfo phpinfo() Ubuntu Manpage: CURLOPT_TIMEOUT - set maximum time the request is allowed to take c++ - libcurl - Strange timeout after 5 seconds - Stack Overflow Download is not resuming using Curl C API - Stack Overflow PHP Manual: curl_setopt

W3 Total Cache compatibility

Warning: Parameter 1 to W3_Plugin_TotalCache::ob_callback() expected to be a reference Fixing Warning on HHVM

WooCommerce compatibility

WooCommerce ‘Place Order’ 500 Error on HHVM

shell - Linux : To monitor a Service and restart if stopped? - Super User

Eeasiest to use is supervisord. It’s also very well documented, works almost anywhere and is packaged in all the major distributions.

I can use ps-watcher or supervisor, monit but systemd should have that option included by default.

ps-watcher: Running HHVM with fallback to PHP-FPM

ps-watcher is a program that runs the ps command periodically and triggers commands on matches.

Sources of information:

There is more on this above:

sudo update-rc.d hhvm remove

Upstart supports this with respawn directive, but we are using systemd.

/etc/init.d contains scripts used by the System V init tools (SysVinit). This is the traditional service management package for Linux, containing the init program (the first process that is run when the kernel has finished initializing¹) as well as some infrastructure to start and stop services and configure them. Specifically, files in /etc/init.d are shell scripts that respond to start, stop, restart, and (when supported) reload commands to manage a particular service. These scripts can be invoked directly or (most commonly) via some other trigger (typically the presence of a symbolic link in /etc/rc?.d/).

/etc/init contains configuration files used by Upstart. Upstart is a young service management package championed by Ubuntu, that is now replaced with systemd.

HHVM - HHVM Overview and Configuration Information

With monit:

Monit configurations for commonly used services

Codeable - Speed up WP admin with Redis and HHVM Restart HHVM with Monit

Poll: What do you use for Unix process management/monitoring? | Hacker News

date 01. Jan 0001 | modified 28. May 2021
filename: Server - HHVM