2014-04-22 34 views
1

嘗試在CLI模式下運行應用程序時出現錯誤。首先,我有守護進程控制器,它允許使用url/daemon-cli /:Daemon_Class_To_Run運行守護進程實例(只有一個必需的方法'運行'從我的守護進程接口派生的對象)。所以這方面沒有什麼有趣的。CLI模式下找不到Bootstrap.php中的類(Zend)

我也有一點sh腳本在這樣一種簡化的方式運行這個控制器:

# ./daemon.sh Ami_Daemon_EventParser 

這將返回我的下一個錯誤:

<? 
class System_Controller_Plugin_ModuleLayoutLoader extends Zend_Controller_Plugin_Abstract { 
    /** 
    * Array of layout paths associating modules with layouts 
    */ 
    protected $_moduleLayouts; 
    // here was the full code of this class 
} 
PHP Fatal error: Class 'System_Controller_Plugin_ModuleLayoutLoader' not found in /var/www/htdocs/application/Bootstrap.php on line 99 

系統命名空間位於應用程序/庫/系統,這只是一套工具包和庫。這是完全奇怪的,因爲它在apache2handler模​​式下運行良好,但在cli中崩潰。我不明白如果在錯誤中返回「not found」類的代碼,該類是不會被找到的。我想我錯誤地引導了應用程序。

一些引導代碼:

protected function _initAppModules() 
{ 
    $modules = array(); 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->registerNamespace('System_'); 
    $includePath = ''; 
    // Add model directories to include path 
    if ($dhApp = opendir(APPLICATION_PATH . '/modules')) { 
     while (($dirApp = readdir($dhApp)) !== false) { 
      if (substr($dirApp, 0, 1) != '.' && is_dir(APPLICATION_PATH . '/modules/' . $dirApp)) { 
       $modules [] = $dirApp; 
       if ($dhModule = opendir(APPLICATION_PATH . '/modules/' . $dirApp)) { 
        while (($dirModule = readdir($dhModule)) !== false) { 
         if ($dirModule == 'library' && is_dir(APPLICATION_PATH . '/modules/' . $dirApp . '/library')) { 
          $includePath .= PATH_SEPARATOR . APPLICATION_PATH . '/modules/' . $dirApp . '/library'; 
          $autoloader->registerNamespace(ucfirst($dirApp)); 
         } 
        } 
        closedir($dhModule); 
       } 
      } 
     } 
     closedir($dhApp); 
    } 
    ini_set('include_path', ini_get('include_path') . $includePath); 
    return $modules; 
} 

protected function _initResources() 
{ 
    Zend_Controller_Action_HelperBroker::addPrefix('System_Controller_Action_Helper'); 
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array('basePath' => APPLICATION_PATH . '/library/System', 'namespace' => '')); 
    $resourceLoader->addResourceTypes(array('form' => array('path' => 'Form/Resource/', 'namespace' => 'Form'), 'model' => array('path' => 'Model/Resource/', 'namespace' => 'Model'))); 

    System_API_Abstract::load(); 

    return $resourceLoader; 
} 

protected function _initView(array $options = array()) 
{ 
    $this->bootstrap('AppModules'); 
    $this->bootstrap('FrontController'); 

    $view = new Zend_View(); 
    $view->addScriptPath(APPLICATION_PATH . '/views/scripts'); 
    $view->addHelperPath(APPLICATION_PATH . '/views/helpers', 'View_Helper'); 
    $view->addHelperPath(APPLICATION_PATH . '/modules/gui/views/helpers', 'View_Helper'); 
    $view->addHelperPath(APPLICATION_PATH . '/library/System/View/Helper', 'System_View_Helper'); 
    // next line triggers the error 
    $layoutModulePlugin = new System_Controller_Plugin_ModuleLayoutLoader(); 
    foreach ($this->getResource('AppModules') as $module) { 
     if (is_dir(APPLICATION_PATH . '/modules/' . $module . '/views/layouts')) { 
      $layoutModulePlugin->registerModuleLayout($module, APPLICATION_PATH . '/modules/' . $module . '/views/layouts'); 
     } 
     if (is_dir(APPLICATION_PATH . '/modules/' . $module . '/views/helpers')) { 
      $view->addHelperPath(APPLICATION_PATH . '/modules/' . $module . '/views/helpers', ucfirst($module) . '_View_Helper'); 
     } 
    } 

    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); 
    $viewRenderer->setView($view); 

    Zend_Layout::startMvc(array('layoutPath' => '../application/views/layouts', 'layout' => 'layout')); 
    $this->getResource('FrontController')->registerPlugin($layoutModulePlugin); 
    return $view; 
} 

而在我的index.php引導所有模塊。

if (php_sapi_name() == 'cli') { 
    $_SERVER['REQUEST_URI'] = $argv[1]; 
    $_SERVER ['HTTP_HOST'] = 'mydomain.info'; 
    ini_set('session.use_cookies', false); 
    $application->bootstrap()->run();// in case if I find the way to bootstrap partially 
} else { 
    $application->bootstrap()->run(); 
} 

我在這裏打了幾個星期,所以我希望有人有一個答案或一個很好的建議。任何幫助是極大的讚賞。謝謝!

回答

0

最後我做到了! 正如你所看到的,我在錯誤輸出中有一個php短標籤。 Php經常使用單獨的php.ini作爲我的rackspace分配功能。 Windows的Php發行版通常具有常見的ini文件。