2012-02-27 5 views
1

コードイグナイタライブラリを使用してデーモンプロセスを作成しようとしていますが、デーモンプロセスをforkするときにCIインスタンスおよびすべてのライブラリ__constructで初期化された子プロセスもアクセスできません。子プロセスで新しいCIインスタンスを作成すると、まだライブラリにアクセスできず、エラーに遭遇します。pcntl_forkを使用すると、子プロセスが親から作成されたCodeIgniterインスタンスにアクセスできない

エラー - 2012-02-27 00:13: 07 - >重大度:警告 - >インクルード(application/errors/error_general.php):ストリームを開くことに失敗しました:そのようなファイルやディレクトリはありません/srv/http/FreeFileConvert/system/core/Exceptions.php 146 ERROR - 2012 -02-27 00:13:07 - >重大度:警告 - > include(): 'application/errors/error_general'を開けませんでした。 '包含のため(のinclude_path =' PHP:。は、/ usr/share /梨 ')/srv/http/FreeFileConvert/system/core/Exceptions.php 146

は、ここに私のコードです:

class Conversion_workers 
{ 
    function __construct() { 
     $this->ci =& get_instance(); 
     $this->ci->load->library('Gearman'); 
    } 

    private function is_locked($lock_file) { 
     if(file_exists($lock_file)) { 
      $lock = fopen($lock_file,"c+"); // open it for WRITING ("w") 
      if (! flock($lock, LOCK_EX | LOCK_NB)) { 
       flock($lock, LOCK_UN); 
       return TRUE; 
      } 
     } 
     return FALSE; 
    } 


    private function lock_file($lock_file, &$lock) { 
     $lock = fopen($lock_file,"c+"); // open it for WRITING ("w") 
     if (! flock($lock, LOCK_EX | LOCK_NB)) { 
      //error_log('Unable to lock file.'); 
      return FALSE; 
     } 
     fseek($lock, 0); 
     ftruncate($lock, 0); 
     fwrite($lock, posix_getpid()); 
     fflush($lock); 
     return TRUE; 
    } 


    private function daemonize($lock_file, &$lock, &$parent) 
    { 

     // TODO: In the install check if pcntl_fork supported 
     if($this->is_locked($lock_file)) { 

      $parent = TRUE; 
      return FALSE; 
     } 

     $pid = pcntl_fork(); 
     if($pid < 0) { 
      log_message('error', 'Unable to fork process'); 
      return FALSE; 
     } 

     // If we got a good PID, then we can exit the parent process. 
     if($pid > 0) { 
      log_message('info', 'Exiting parent as process forked successfully'); 
      $parent = TRUE; 
      return FALSE; 
     } 

     ob_start(); 

     // Change the file mode mask 
     umask(0); 

     // Create a new SID for the child process 
     if (posix_setsid() < 0) { 
      //error_log('Unable to create a new SID for child process'); 
      return FALSE; 
     } 

     // Change the current working directory 
     if(chdir("/tmp") < 0) { 
      //error_log('Unable to change directory of the daemonize process'); 
      return FALSE; 
     } 

     // Lock in child process to get correct pid in lock file 
     if(!$this->lock_file($lock_file, $lock)) { 
      exit; 
     } 

     fclose(STDIN); // Close all of the standard 
     fclose(STDOUT); // file descriptors as we 
     fclose(STDERR); // are running as a daemon. 

     register_shutdown_function(create_function('$pars', 
      'ob_end_clean();posix_kill(posix_getpid(), SIGKILL);'), array()); 

     // Might be good idea to have register_shutdown_function() here if we want to 
     // check status when the daemon terminates. 

     return TRUE; 
    } 

    private function start_workers() { 

     $lock_file = $this->ci->config->item('lock_file'); 
     $parent  = FALSE; 

     if(! $this->daemonize($lock_file, $lock, $parent)) { 
      if($parent) 
       return; 

     } else { 

      // Start a worker 
      $this->ci->gearman->gearman_worker(); 
      $this->ci->gearman->add_worker_function('some_function', 'some_function_fn'); 

      error_log('Starting worker ['.posix_getpid().']'); 

      while($this->ci->gearman->work()); 
     } 

     error_log('Exiting worker'); 
     exit; 
    } 

    function add_to_queue($function_name, $params) { 
     $this->start_workers(); 

     $this->ci->gearman->gearman_client(); 
     return $this->ci->gearman->do_job_background($function_name, serialize($params)); 
    } 
} // END class Controller 

機能"add_to_queue()"はうまくいきますが、問題は "fork_info"であり、フォーク後は機能が停止してしまい、ログヘルパー関数にアクセスすることもできないため、コードでerror_log()を使用しています。

誰かが助けてくれたら嬉しいです。

答えて

0

daemonizeメソッドが作業ディレクトリを/tmpに変更することはありますか?その場合、システムは.(/ tmp)と/usr/share/pearのインクルードを探していますが、どちらもそのようなものを保持していませんか?

おそらくhttp://www.php.net/manual/en/ini.core.php#ini.include-pathが役に立ちます。

関連する問題