HHVM - Запуск ресурса обширных php демонов

Привет я пытаюсь использовать HHVM для запуска всех фоновых работников PHP, которые в настоящее время есть в моем приложении. Я не хочу запускать hhvm в качестве сервера, поскольку Apache уже позаботится об этом, все, что я хочу сделать, - это запускать свои php-коды с помощью hhvm вместо обычного движка Zend.

Хорошо, вот коды, которые я хочу запустить.

Это точка входа в вычислительно интенсивные модули, которые я хочу запустить

-------------**RunRenderer.php**--------------
#!/usr/bin/php
<?php

require_once 'Config.php';

require_once 'Renderer.php';



Renderer::getInstance()->run();


?>

Вот лишь небольшая часть основного контроллера, который контролирует / разветвляет / управляет тысячами задач / процессов php.

----------------------------Renderer.php---------------------
<?php

require 'Workers/BumpMapsCalc.php';

/**
 * Main Entry class of the Map rendering module
 * 
 * Create workers for all of the different maps calc sub routines 
 * 
 * 
 * 
 */
class Renderer extends \Core_Daemon {

    /**
     * the interval at which the execute method will run
     * 
     * Interval : 10 min
     * 
     */
    protected $loop_interval = 600;

    /**
     * Set the chunk size
     */
    protected $chunkSize = 500;

    /**
     * Loop counter
     */
    protected $loopCounter;

    /**
     * Low limit and the high limit
     */
    protected $lowLimit;
    protected $highLimit;


    /**
     * set the plugins for lock file and settings ini files
     * 
     */
    protected function setup_plugins() {
        $this->plugin('Lock_File');

        $this->plugin('settings', new \Core_Plugin_Ini());
        $this->settings->filename = BASE_PATH . "/Config/settings.ini";
        $this->settings->required_sections = array('geometry');


    }


    protected function setup() {


        $this->log("Computing Bumps Maps");
    }

    /**
     * Create multiple separate task  that will run in parallel
     * Provide the low limit and the high limit which should effectively partition
     * the whole table into more manageable chunks , thus making importing and 
     * storing data much faster and finished within 10 min
     * 
     */
    protected function execute() {



        for ($this->loopCounter = 1 ; $this->loopCounter <= $this->settings['geometry']['number'] ; $this->loopCounter += $this->chunkSize) {

            $this->lowLimit = $this->loopCounter;
            $this->highLimit = $this->loopCounter + $this->chunkSize;

            $this->task(new LocalBumpMaps($this->lowLimit, $this->highLimit));
        }


    }

    protected function log_file() {

        $dir = BASE_PATH . "/Logs";
        if (@file_exists($dir) == false)
            @mkdir($dir, 0777, true);


        return $dir . '/log_' . date('Y-m-d');
    }

}

?>

Обычно я запускаю программу как

php RunRenderer.php -d -p ./pid/pid $1

который будет вызывать Zend Engine по умолчанию, а Renderer.php будет обрабатывать тысячи экземпляров LocalBumpMaps (вместе со 100 другими классами рендеринга карт). Теперь, когда каждая из этих подзадач занимает около 20–30 МБ, вся память на рабочей станции довольно быстро истощается, что приводит к полной остановке системы.

Конечно, основной движок рендеринга написан на C++, но из-за некоторых странных требований весь внешний интерфейс написан на PHP. И модули php должны выполнять около миллиардов вычислений в секунду. Таким образом, единственными вариантами, которые были оставлены, было использование HHVM в надежде на существенное увеличение производительности и эффективности. Но проблема в том, что я не могу заставить этот код работать с hhvm. Это то, что я пытаюсь

hhvm RunRenderer.php -p ./pid $1

Это ничего не делает вообще. Никакие процессы не разветвлены, нет вывода, ничего не происходит. Так может кто-нибудь, пожалуйста, скажите мне, как я могу запустить php-скрипты с hhvm вместо zend.

Я надеюсь, что мой вопрос имеет смысл, и я был бы очень признателен за любую помощь.

Спасибо, макс

1 ответ

Решение

Просто запустите следующую строку, не разворачивая процесс:

hhvm RunRenderer.php

Если вы видите вывод консоли и можете нажать Ctrl+C, чтобы завершить процесс, то вы можете демонизировать процесс с помощью сценария Upstart. Создайте файл с именем /etc/init/renderer.conf:

start on startup
stop on shutdown
respawn

script
  hhvm RunRenderer.php
end script

Затем вы можете вручную запустить и остановить процесс, выполнив:

start renderer

а также

stop renderer

Если вы используете Ubuntu 12.04LTS и выше, файл журнала будет создан для вас автоматически под именем /var/log/upstart/renderer.log. Вы можете получить прямой вывод, следя за файлом:

tail -f /var/log/upstart/renderer.log
Другие вопросы по тегам