Marius Cramer
2014-04-30 1c6da3502e13ca5391b5ece1349b8401876e4b99
Implemented: FS#3266 - HHVM PHP mode support (some improvements, nginx support)
8 files modified
76 ■■■■ changed files
interface/web/client/form/client.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/client/form/client_template.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/client/form/reseller.tform.php 2 ●●● patch | view | raw | blame | history
server/conf/hhvm_starter.master 14 ●●●● patch | view | raw | blame | history
server/conf/nginx_vhost.conf.master 13 ●●●●● patch | view | raw | blame | history
server/conf/vhost.conf.master 2 ●●● patch | view | raw | blame | history
server/plugins-available/apache2_plugin.inc.php 16 ●●●●● patch | view | raw | blame | history
server/plugins-available/nginx_plugin.inc.php 25 ●●●●● patch | view | raw | blame | history
interface/web/client/form/client.tform.php
@@ -823,7 +823,7 @@
            'default' => '',
            'separator' => ',',
            'valuelimit' => 'client:web_php_options',
            'value'  => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM')
            'value'  => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM')
        ),
        'limit_cgi' => array (
            'datatype' => 'VARCHAR',
interface/web/client/form/client_template.tform.php
@@ -345,7 +345,7 @@
            'default' => '',
            'separator' => ',',
            'valuelimit' => 'client:web_php_options',
            'value'  => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM')
            'value'  => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM')
        ),
        'limit_cgi' => array (
            'datatype' => 'VARCHAR',
interface/web/client/form/reseller.tform.php
@@ -818,7 +818,7 @@
            ),
            'default' => '',
            'separator' => ',',
            'value'  => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM')
            'value'  => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM')
        ),
        'limit_cgi' => array (
            'datatype' => 'VARCHAR',
server/conf/hhvm_starter.master
@@ -16,12 +16,22 @@
do_start()
{
    {START}
    if [ ! -d /var/run/hhvm ]; then
        mkdir -p -m0777 /var/run/hhvm
        else
        chmod 777 /var/run/hhvm
    fi
    umask 017
    sudo -u {SYSTEM_USER} touch /var/run/hhvm/hhvm_{SYSTEM_USER}.pid
    /usr/bin/hhvm --mode daemon -vServer.Type=fastcgi --user {SYSTEM_USER} -vServer.FileSocket=/var/run/hhvm/hhvm.{SYSTEM_USER}.sock -vLog.Level=Warning -vLog.UseLogFile=false -vRepo.Central.Path=/var/run/hhvm/hhvm.{SYSTEM_USER}.hhbc -vPidFile=/var/run/hhvm/hhvm_{SYSTEM_USER}.pid & echo $! > /var/run/hhvm/hhvm_{SYSTEM_USER}.pid
}
do_stop()
{
    {STOP}
    if [[ -e "/var/run/hhvm/hhvm_{SYSTEM_USER}.pid" ]] ; then
        kill -SIGTERM `cat /var/run/hhvm/hhvm_{SYSTEM_USER}.pid` >/dev/null 2>&1 ;
    fi
    rm -f /var/run/hhvm/hhvm.{SYSTEM_USER}.sock /var/run/hhvm/hhvm.{SYSTEM_USER}.hhbc /var/run/hhvm/hhvm_{SYSTEM_USER}.pid
}
case "$1" in
server/conf/nginx_vhost.conf.master
@@ -152,9 +152,22 @@
            fastcgi_intercept_errors on;
        }
</tmpl_else>
    <tmpl_if name='php' op='==' value='hhvm'>
            location @php {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/run/hhvm/hhvm.<tmpl_var name='system_user'>.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                #fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_intercept_errors on;
            }
    </tmpl_else>
        location @php {
            deny all;
        }
    </tmpl_if>
</tmpl_if>
        
<tmpl_if name='cgi' op='==' value='y'>
server/conf/vhost.conf.master
@@ -337,7 +337,7 @@
                </FilesMatch>
                Action php5-fcgi /php5-fcgi
                Alias /php5-fcgi {tmpl_var name='document_root'}/cgi-bin/php5-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'}
                FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php5-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -socket /tmp/hhvm.<tmpl_var name='system_user'>.sock -pass-header Authorization
                FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php5-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -socket /var/run/hhvm/hhvm.<tmpl_var name='system_user'>.sock -pass-header Authorization
        </IfModule>
</tmpl_if>
server/plugins-available/apache2_plugin.inc.php
@@ -2738,23 +2738,9 @@
        } else {
            $content = file_get_contents($conf['rootpath'] . '/conf/hhvm_starter.master');
        }
        $start_content = '';
        $stop_content = '';
        
        if($data['new']['php'] == 'hhvm' && $data['old']['php'] != 'hhvm') {
            $start_content .= 'if [ ! -d /var/run/hhvm ]; then
        mkdir -p -m0777 /var/run/hhvm
        else
        chmod 777 /var/run/hhvm
    fi
    umask 017
    sudo -u ' . $data['new']['system_user'] . ' touch /var/run/hhvm/hhvm_' . $data['new']['system_user'] . '.pid
    /usr/bin/hhvm --mode daemon -vServer.Type=fastcgi --user ' . $data['new']['system_user'] . ' -vServer.FileSocket=/tmp/hhvm.' . $data['new']['system_user'] . '.sock -vLog.Level=Warning -vLog.UseLogFile=false -vRepo.Central.Path=/tmp/hhvm.' . $data['new']['system_user'] . '.hhbc -vPidFile=/var/run/hhvm/hhvm_' . $data['new']['system_user'] . '.pid & echo $! > /var/run/hhvm/hhvm_' . $data['new']['system_user'] . '.pid';
            $stop_content .= 'if [[ -e "/var/run/hhvm/hhvm_' . $data['new']['system_user'] . '.pid" ]] ; then kill -SIGTERM `cat /var/run/hhvm/hhvm_' . $data['new']['system_user'] . '.pid` >/dev/null 2>&1 ; fi
    rm -f /tmp/hhvm.' . $data['new']['system_user'] . '.sock /tmp/hhvm.' . $data['new']['system_user'] . '.hhbc /var/run/hhvm/hhvm_' . $data['new']['system_user'] . '.pid';
            $content = str_replace(array('{START}', '{STOP}', '{SYSTEM_USER}'), array($start_content, $stop_content, $data['new']['system_user']), $content);
            $content = str_replace('{SYSTEM_USER}', $data['new']['system_user'], $content);
            file_put_contents('/etc/init.d/hhvm_' . $data['new']['system_user'], $content);
            exec('chmod +x /etc/init.d/hhvm_' . $data['new']['system_user'] . ' >/dev/null 2>&1');
            exec('/usr/sbin/update-rc.d hhvm_' . $data['new']['system_user'] . ' defaults >/dev/null 2>&1');
server/plugins-available/nginx_plugin.inc.php
@@ -1644,6 +1644,7 @@
        }
        $this->php_fpm_pool_update($data, $web_config, $pool_dir, $pool_name, $socket_dir);
        $this->hhvm_update($data, $web_config);
        if($web_config['check_apache_config'] == 'y') {
            //* Test if nginx starts with the new configuration file
@@ -1954,6 +1955,8 @@
                // remove PHP-FPM pool
                if ($data['old']['php'] == 'php-fpm') {
                    $this->php_fpm_pool_delete($data, $web_config);
                } elseif($data['old']['php'] == 'hhvm') {
                    $this->hhvm_update($data, $web_config);
                }
                //remove the php cgi starter script if available
@@ -2301,6 +2304,28 @@
        }
    }
    private function hhvm_update($data, $web_config) {
        global $app, $conf;
        if(file_exists($conf['rootpath'] . '/conf-custom/hhvm_starter.master')) {
            $content = file_get_contents($conf['rootpath'] . '/conf-custom/hhvm_starter.master');
        } else {
            $content = file_get_contents($conf['rootpath'] . '/conf/hhvm_starter.master');
        }
        if($data['new']['php'] == 'hhvm' && $data['old']['php'] != 'hhvm') {
            $content = str_replace('{SYSTEM_USER}', $data['new']['system_user'], $content);
            file_put_contents('/etc/init.d/hhvm_' . $data['new']['system_user'], $content);
            exec('chmod +x /etc/init.d/hhvm_' . $data['new']['system_user'] . ' >/dev/null 2>&1');
            exec('/usr/sbin/update-rc.d hhvm_' . $data['new']['system_user'] . ' defaults >/dev/null 2>&1');
            exec('/etc/init.d/hhvm_' . $data['new']['system_user'] . ' start >/dev/null 2>&1');
         } elseif($data['new']['php'] != 'hhvm' && $data['old']['php'] == 'hhvm') {
            exec('/etc/init.d/hhvm_' . $data['old']['system_user'] . ' stop >/dev/null 2>&1');
            exec('/usr/sbin/update-rc.d hhvm_' . $data['old']['system_user'] . ' remove >/dev/null 2>&1');
            unlink('/etc/init.d/hhvm_' . $data['old']['system_user'] . ' >/dev/null 2>&1');
        }
    }
    //* Update the PHP-FPM pool configuration file
    private function php_fpm_pool_update ($data, $web_config, $pool_dir, $pool_name, $socket_dir) {
        global $app, $conf;