-1

您好我正在尝试使用 hhvm 来运行我的应用程序中当前存在的所有后台 PHP 工作人员。我不想将 hhvm 作为服务器运行,因为 Apache 已经在处理它,我要做的就是使用 hhvm 运行我的 php 代码,而不是使用常规的 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 引擎,而 Renderer.php 将分叉数以千计的 LocalBumpMaps 实例(以及 100 个其他地图渲染类)。现在,每个子任务都占用大约 20-30 mb 的空间,工作站中的所有内存很快就会耗尽,从而导致系统突然停止。

当然,主要的渲染引擎是用 C++ 编写的,但由于一些奇怪的要求,整个前端都是用 PHP 编写的。并且 php 模块需要每秒执行大约数十亿次计算。所以剩下的唯一选择就是使用 HHVM,希望能显着提高性能和效率。但问题是我无法让这段代码与 hhvm 一起运行。这就是我正在尝试的

hhvm RunRenderer.php -p ./pid $1

这根本没有任何作用。没有进程被分叉,没有输出,什么也没有发生。所以谁能告诉我如何用 hhvm 而不是 zend 运行 php 脚本。

我希望我的问题是有道理的,我真的很感激任何帮助。

谢谢,麦克斯

4

1 回答 1

2

只需先运行以下行而不分叉进程:

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
于 2014-02-10T01:42:15.250 回答