2014-01-05 2 views
-1

안녕하세요, hhvm을 사용하여 현재 내 응용 프로그램에있는 백그라운드 PHP 작업자를 모두 실행하려고합니다. 나는 아파치가 이미 그것을 돌보고 있기 때문에 hhvm을 서버로 돌리고 싶지 않다. 내가하고 싶은 것은 정규 Zend 엔진 대신에 hhvm으로 php 코드를 실행하는 것이다.HHVM - 실행중인 광범위한 PHP 데몬

여기에 내가 실행하고 싶은 코드가 있습니다.

이 내가 여기

-------------**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'); 
    } 

} 

?> 

그래서 일반적으로 내가 기본 젠드 엔진을 호출 할 것이며 Renderer.php이 (100 다른 맵 렌더링과 함께 LocalBumpMaps의 인스턴스의 수천을 주위 포크 것

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

로 프로그램을 실행할 것 클래스). 이제이 하위 작업 각각이 약 20-30MB의 메모리를 사용하여 워크 스테이션의 모든 메모리가 상당히 빨리 소모되어 시스템이 멈추게됩니다.

물론 주 렌더링 엔진은 C++로 작성되었지만 이상한 요구 사항으로 인해 프런트 엔드 전체가 PHP로되어 있습니다. 그리고 PHP 모듈은 초당 수십억 개의 계산을 수행해야합니다. 그래서 남은 유일한 옵션은 성능과 효율성이 크게 향상되기를 바라는 HHVM을 사용하는 것이 었습니다. 하지만 문제는이 코드를 hhvm과 함께 실행할 수 없다는 것입니다. 이것은 내가 시도하는 것입니다.

hhvm RunRenderer.php -p ./pid $1 

이것은 전혀 작동하지 않습니다. 프로세스가 분기되지 않고 출력도없고 아무 일도 일어나지 않습니다. 그래서 아무도 zend 대신 hhvm을 사용하여 PHP 스크립트를 실행하는 방법을 알려주십시오.

제 질문이 의미가 있기를 바랍니다. 정말로 도움이 되었기를 바랍니다.

감사합니다, 맥스

+0

아무도 hhvm을 사용하여 스크립트를 실행하는 방법에 대한 아이디어가 있습니까? – Maxx

+0

나는 HHVM에 대해 너무 익숙하지 않다. 그리고 아직도 버그를 가지고있어 잠시 불안정하다. 그러나 수천 가지 갈래의 프로세스 인스턴스가 초현실적 인 것처럼 들립니다. 나는 쓰레드보다는 프로세스에 의존한다. 내가 할 수있는 다른 일은 다른 기계로 만들어진 작업장을 만드는 것입니다. 거의 동일한 계산을 수행하는 수천 개의 프로세스를 포킹하는 것은 어떤 시나리오에서도 실행 가능하지 않습니다. 다른 컴퓨터에 작업을 배포하거나 스레드를 사용하는 것이 훨씬 더 정숙합니다. –

+0

예 PHP의 pthread 확장을 사용하고 있습니다. 그것이 내 요구에 완벽하게 부합하는 것으로 나타났습니다. 메모리 사용량이 3GB 이상에서 120-200MB로 떨어지면 여러 프로세스에 소요되는 시간이 약 1/50에 달하고 제어 할 수있는 프로세스가 하나뿐이므로 관리가 쉽습니다. "kill -9 프로세스"에서 수천 개의 자식 프로세스 대신 하나의 프로세스 만 남기면 오류가 발생합니다. – Maxx

답변

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 
+0

Perfect. 나는이 정확한 것을 한 달 넘게 찾고 있었다. php 인터프리터로 다시 돌아 가야했습니다. 그것은 당신에게 모든 감사, 지금은 잘 작동합니다. 나는 Fedora를 사용하고 로그 파일이 Ubuntu에서 언급 한 것과 같은 위치에 있다고 생각합니다. 어쨌든이 문제에 대한 해결책을 가져 주셔서 감사합니다. – Maxx