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.
# https://docs.hhvm.com/hhvm/installation/linux
#
sudo apt-get install software-properties-common
wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
sudo add-apt-repository "deb http://dl.hhvm.com/ubuntu $(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/install_fastcgi.sh
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
- Running HHVM with fallback to PHP-FPM
- Running HHVM instead of PHP with Nginx on Ubuntu
- How To Install HHVM (HipHop Virtual Machine) on an Ubuntu 13.10 VPS
- FasterCGI with HHVM
- HHVM, Nginx and Laravel
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_pass 127.0.0.1:9000;
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/install_fastcgi.sh
- $ 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:
- https://github.com/facebook/hhvm/wiki/FastCGI
- 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/antikhandel.ch/web
echo "<?php phpinfo(); ?>" >nfo.php
wget https://gist.githubusercontent.com/ck-on/67ca91f0310a695ceb65/raw/hhvminfo.php -O nfo_hhvm.php
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:
[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
[Service]
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
[Install]
WantedBy=multi-user.target
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;
EOF
There is a problem in HHVM and it’s cUrl extension:
Installing composer using vagrant, hhvm
Error in SlowTimer [5241ms] at curl: http://api.tradedoubler.com/1.0/vouchers.xml?token=27C616CD76D972191913A0F1F474EAF38B591962
CURLOPT_LOW_SPEED_LIMIT
, CURLOPT_LOW_SPEED_TIME
Hack and HHVM: curl_setopt - Manual
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
hhvm.resource_limit.socket_default_timeout=30
hhvm.http.slow_query_threshold=30000
hhvm.server.request_timeout_seconds=600
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 ‹ save-up.ch — 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 3.0.5.4p8
linux - How to execute a command whenever a file changes? - Super User Why don’t you buy goldkaufen.ch? | Parked Domains Install WordPress with HHVM, Nginx and MariaDB on an Ubuntu 12.04 LTS | RoseHosting.com 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 - http://www.save-up.ch/ How to Set Up LEMH (Linux, Nginx, MariaDB, HHVM) Stack in Ubuntu Server - Make Tech Easier ISPConfig 3.0.5.4p8 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 vanderveer.be/speed-up-composer-by-using-hhvm-including-a-slowtimer-error-fix/ Building a Better PHP — Part 2: Using HHVM Disqus - Speed up Composer by using HHVM, including a SlowTimer error fix - vanderVeer.be resourcelimit.socketdefaulttimeout=30 - Google Search Thought I’d update this classic comic for us PHP guys (and gals)… XKDC’s “compiling” : PHP http://osdir.com/ml/general/2014-09/msg28208.html 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
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 SystemV init tools. This is the traditional service management package for Linux. It includes the init
program, which is the first process to run after the kernel has finished initialising, as well as some infrastructure for starting and stopping services and configuring them. Specifically, files in /etc/init.d
are shell scripts that respond to start, stop, restart, and, when supported, reload commands to manage a certain service. These scripts can be invoked directly or more commonly via some other trigger, typically the presence of a symbolic link in /etc/rc?.d/
.
/etc/init
contains the configuration files used by Upstart. Upstart is a young service management package championed by Ubuntu, now replaced by the systemd package.