require_once(Zend/Application.php): 使用zend框架时打开流失败
require_once(Zend/Application.php): failed to open stream when using zend framework
我是 zend framework 的新用户,我尝试了 stack overflow 中针对类似问题给出的其他解决方案。
这是我的index.php
<?php
date_default_timezone_set('UTC');
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/library'),
get_include_path(),
)));
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
->run();
当我回显 set_include_path 时,这是我得到的响应,
:.:/usr/lib64/php
我是否必须在我的新 Cent OS 中安装 zend 框架?
我的图书馆文件夹在 index.php 所在的同一目录中。
/home/eat/public_html/index.php
/home/eat/public_html/library
/home/eat/public_html/library/Zend
更新..
当我将路径硬编码为 set_include_path('/home/eat/public_html/library/');
我开始收到新错误。也就是说,
Warning: require_once(Zend/Loader/Autoloader.php): failed to open stream: No such file or directory in /home/eat/public_html/library/Zend/Application.php on line 80
Fatal error: require_once(): Failed opening required 'Zend/Loader/Autoloader.php' (include_path='/home/eat/public_html/library/') in /home/eat/public_html/library/Zend/Application.php on line 80
**Update 2**
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "multidb" not found' in /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php:691 Stack trace: #0 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(626): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('multidb') #1 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(583): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap('multidb') #2 /home/eat/public_html/application/Bootstrap.php(58): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap('multidb') #3 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(666): Bootstrap->_initApplication() #4 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(619): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('application') #5 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(583): Z in /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php on line 691
Application.ini
[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
eat.application.base.url = "eat.com"
eat.application.admin.url = "admin.eat.com"
eat.application.api.url = "api.eat.com"
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.prefixDefaultModule = "1"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
autoloaderNamespaces[] = "Eat_"
resources.modules = ""
phpSettings.date.timezone = "GMT"
eat.application.salt = "sd876fs89df";
resources.view[] =
resources.view.helperPath.Eat_View_Helper = APPLICATION_PATH "/../library/Eat/View/Helper"
;;; Databases
;;;;; Layouts
resources.layout.layoutPath = APPLICATION_PATH "/views/layouts"
resources.layout.layout = web/web
nexva.applicaiton.fileUploadDirectory = APPLICATION_PATH "/../files"
;;;; ReCaptcha ;;;;
recaptcha.private_key = 6LfL7rsSAAAAAKgtKWsMk4hmA2DSVq0ODcyJFRjs
recaptcha.public_key = 6LfL7rsSAAAAANiaZOQN7LOoCGAXh29rHTZPRoVa
[staging : production]
eat.application.base.url = "eat.com"
eat.application.admin.url = "admin.eat.com"
eat.application.api.url = "api.eat.com"
;;; Databases
resources.multidb.default.adapter = mysqli
resources.multidb.default.host = "localhost"
resources.multidb.default.username = "eat"
resources.multidb.default.password = "eat"
resources.multidb.default.dbname = "eat_main"
resources.multidb.default.default = true
[development : production]
eat.application.base.url = "eat.com"
eat.application.admin.url = "admin.eat.com"
eat.application.api.url = "api.eat.com"
;;; Databases
resources.multidb.default.adapter = mysqli
;resources.multidb.default.host = "192.168.1.253"
resources.multidb.default.host = "localhost"
resources.multidb.default.username = "eat"
resources.multidb.default.password = "eat"
resources.multidb.default.dbname = "eat_main"
resources.multidb.default.default = true
[development-alt : development]
更新 3
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
public function __construct($application)
{
parent::__construct($application);
}
protected function _initAutoload()
{
Zend_Controller_Action_HelperBroker::addPrefix('Eat_Controller_Action_Helper');
$autoloader = new Zend_Application_Module_Autoloader(
array(
'namespace' => '',
'basePath' => APPLICATION_PATH,
'resourceTypes' => array(
'form' => array(
'path' => 'forms',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models',
'namespace' => 'Model',
),
)
)
);
return $autoloader;
}
protected function _initLayoutHelper()
{
$this->bootstrap('frontController');
$layout = Zend_Controller_Action_HelperBroker::addHelper(new Eat_Controller_Action_Helper_LayoutLoader());
}
protected function _initApplication()
{
$config = new Zend_Config_Ini(APPLICATION_PATH . "/configs/application.ini", APPLICATION_ENV);
Zend_Registry::set("config", $config);
$locale = new Zend_Locale();
Zend_Registry::set('Zend_Locale', $locale);
//init DB connection
try {
$this->bootstrap('multidb');
$multiDb = $this->getPluginResource('multidb');
$db = $multiDb->getDb('default');
$db->setFetchMode(Zend_Db::FETCH_OBJ);
$db->getConnection();
$db->getProfiler()->setEnabled(true);
Zend_Registry::set('db', $db);
//Just making everything UTF8. This is a hack, need to find the proper Zend way
$db = Zend_Registry::get('db');
$db->query('SET NAMES "utf8"')->execute();
} catch (Zend_Db_Adapter_Exception $e) {
die("Error connecting to database: " . $e->getMessage());
}
}
public function _initRoutes()
{
/*
$router = Zend_Controller_Front::getInstance()->getRouter();
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/routes.ini', APPLICATION_ENV);
$router->addConfig($config, 'resources');
$routes['featured'] = new Zend_Controller_Router_Route(
'featured/:id',
array('controller' => 'index', 'action' => 'featured', 'id' => null)
);
Zend_Controller_Front::getInstance()->getRouter()->addRoutes($routes);
*/
}
protected function _initLanguages()
{
}
//Initilaize zend ACL
public function _initAcl()
{
//Omit the process in CLI mode
if (php_sapi_name() != 'cli')
{
$helper = new Eat_Controller_Action_Helper_AclDefault();
$helper->setRoles();
$helper->setResources();
$helper->setPrivilages();
$helper->setAcl();
//Register the ACL plugin - Then it will be called automatically,whenever an acion is called
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
// $frontController->registerPlugin(new Eat_Plugin_Acl());
}
}
//Initialize error controller
public function _initErrorSwitcher()
{
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new Eat_Plugin_ErrorControllerSwitcher());
}
protected function _initZFDebug()
{
// Enabling this method seems to break autocomplete. Use only when needed
$autoloader = Zend_Loader_Autoloader::getInstance ();
$autoloader->registerNamespace ( 'ZFDebug' );
$db = Zend_Registry::get ( 'db' );
$cache = Zend_Cache::factory ( 'Core', 'File' );
//Zend_Controller_Front::getInstance()->getBaseUrl();
//APPLICATION_PATH
$options = array ('plugins' => array ('Variables', 'Database' => array ('adapter' => $db ), 'File' => array ('basePath' => Zend_Controller_Front::getInstance ()->getBaseUrl () ), 'Memory', 'Time', 'Registry', 'Cache' => array ('backend' => $cache->getBackend () ), 'Exception' ) );
$debug = new ZFDebug_Controller_Plugin_Debug ( $options );
$this->bootstrap ( 'frontController' );
$frontController = $this->getResource ( 'frontController' );
//$frontController->registerPlugin ( $debug );
}
}
您的应用程序和库文件夹应位于 public_html:
之外
此代码在父文件夹(“/../”)中查找 "application" 文件夹(相对于 index.php):
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
此代码添加“/../library”以包含路径:
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/library'),
get_include_path(),
)));
因此要么将应用程序和库文件夹移到 public_html 之外,要么从 APPLICATOIN_PATH 定义中删除 /..(但这是不可取的,因为它会降低您的应用程序的安全性)
UPD. 如果您仍然遇到错误,请确保您拥有此文件以及其他 Zend 文件:
library/Zend/Loader/Autoloader.php
如果没有,请下载最新版本的 Zend Framework:
ZF1:
http://downloads.zend.com/framework/1.12.10/ZendFramework-1.12.10.tar.gz
ZF2:
http://downloads.zend.com/framework/2.3.4/ZendFramework-2.3.4.tgz
您可以将其保存到 "library" 文件夹或将其解压缩到 /usr/lib64/php(因此它被保存为 /usr/lib64/php/Zend/),这样您就不需要每个项目的这个文件夹
UPD2 搜索
getResource('multidb')
在您的代码(应用程序文件夹)中,然后尝试添加
$this->bootstrap('multidb');
在上面..
我的猜测是您的 Zend Framework 版本与原始软件中使用的不同,或者您的目录结构无效,您可以尝试将库和应用程序文件夹移到 public_html 之外吗?
UPD3 你也可以给我发邮件(mstrokin 在 gmail.com),我会尽力为你解决这个问题,我喜欢调试 :)
UPD4 尝试将 "getPluginResource" 更改为 "getResource"
一个可能的问题是 "library" 目录的权限。
在大多数情况下,它会影响 Linux 用户。
如果您是 Linux 用户,您可能需要更改它们
sudo chmod 755 -R path_to_project/library
如果您仍然遇到该错误,那么您应该使用 php.ini 设置或 "library" 文件夹位置。
我是 zend framework 的新用户,我尝试了 stack overflow 中针对类似问题给出的其他解决方案。
这是我的index.php
<?php
date_default_timezone_set('UTC');
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/library'),
get_include_path(),
)));
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
->run();
当我回显 set_include_path 时,这是我得到的响应,
:.:/usr/lib64/php
我是否必须在我的新 Cent OS 中安装 zend 框架?
我的图书馆文件夹在 index.php 所在的同一目录中。
/home/eat/public_html/index.php /home/eat/public_html/library /home/eat/public_html/library/Zend
更新..
当我将路径硬编码为 set_include_path('/home/eat/public_html/library/');
我开始收到新错误。也就是说,
Warning: require_once(Zend/Loader/Autoloader.php): failed to open stream: No such file or directory in /home/eat/public_html/library/Zend/Application.php on line 80
Fatal error: require_once(): Failed opening required 'Zend/Loader/Autoloader.php' (include_path='/home/eat/public_html/library/') in /home/eat/public_html/library/Zend/Application.php on line 80
**Update 2**
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "multidb" not found' in /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php:691 Stack trace: #0 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(626): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('multidb') #1 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(583): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap('multidb') #2 /home/eat/public_html/application/Bootstrap.php(58): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap('multidb') #3 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(666): Bootstrap->_initApplication() #4 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(619): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('application') #5 /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php(583): Z in /home/eat/public_html/library/Zend/Application/Bootstrap/BootstrapAbstract.php on line 691
Application.ini
[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
eat.application.base.url = "eat.com"
eat.application.admin.url = "admin.eat.com"
eat.application.api.url = "api.eat.com"
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.prefixDefaultModule = "1"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
autoloaderNamespaces[] = "Eat_"
resources.modules = ""
phpSettings.date.timezone = "GMT"
eat.application.salt = "sd876fs89df";
resources.view[] =
resources.view.helperPath.Eat_View_Helper = APPLICATION_PATH "/../library/Eat/View/Helper"
;;; Databases
;;;;; Layouts
resources.layout.layoutPath = APPLICATION_PATH "/views/layouts"
resources.layout.layout = web/web
nexva.applicaiton.fileUploadDirectory = APPLICATION_PATH "/../files"
;;;; ReCaptcha ;;;;
recaptcha.private_key = 6LfL7rsSAAAAAKgtKWsMk4hmA2DSVq0ODcyJFRjs
recaptcha.public_key = 6LfL7rsSAAAAANiaZOQN7LOoCGAXh29rHTZPRoVa
[staging : production]
eat.application.base.url = "eat.com"
eat.application.admin.url = "admin.eat.com"
eat.application.api.url = "api.eat.com"
;;; Databases
resources.multidb.default.adapter = mysqli
resources.multidb.default.host = "localhost"
resources.multidb.default.username = "eat"
resources.multidb.default.password = "eat"
resources.multidb.default.dbname = "eat_main"
resources.multidb.default.default = true
[development : production]
eat.application.base.url = "eat.com"
eat.application.admin.url = "admin.eat.com"
eat.application.api.url = "api.eat.com"
;;; Databases
resources.multidb.default.adapter = mysqli
;resources.multidb.default.host = "192.168.1.253"
resources.multidb.default.host = "localhost"
resources.multidb.default.username = "eat"
resources.multidb.default.password = "eat"
resources.multidb.default.dbname = "eat_main"
resources.multidb.default.default = true
[development-alt : development]
更新 3
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
public function __construct($application)
{
parent::__construct($application);
}
protected function _initAutoload()
{
Zend_Controller_Action_HelperBroker::addPrefix('Eat_Controller_Action_Helper');
$autoloader = new Zend_Application_Module_Autoloader(
array(
'namespace' => '',
'basePath' => APPLICATION_PATH,
'resourceTypes' => array(
'form' => array(
'path' => 'forms',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models',
'namespace' => 'Model',
),
)
)
);
return $autoloader;
}
protected function _initLayoutHelper()
{
$this->bootstrap('frontController');
$layout = Zend_Controller_Action_HelperBroker::addHelper(new Eat_Controller_Action_Helper_LayoutLoader());
}
protected function _initApplication()
{
$config = new Zend_Config_Ini(APPLICATION_PATH . "/configs/application.ini", APPLICATION_ENV);
Zend_Registry::set("config", $config);
$locale = new Zend_Locale();
Zend_Registry::set('Zend_Locale', $locale);
//init DB connection
try {
$this->bootstrap('multidb');
$multiDb = $this->getPluginResource('multidb');
$db = $multiDb->getDb('default');
$db->setFetchMode(Zend_Db::FETCH_OBJ);
$db->getConnection();
$db->getProfiler()->setEnabled(true);
Zend_Registry::set('db', $db);
//Just making everything UTF8. This is a hack, need to find the proper Zend way
$db = Zend_Registry::get('db');
$db->query('SET NAMES "utf8"')->execute();
} catch (Zend_Db_Adapter_Exception $e) {
die("Error connecting to database: " . $e->getMessage());
}
}
public function _initRoutes()
{
/*
$router = Zend_Controller_Front::getInstance()->getRouter();
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/routes.ini', APPLICATION_ENV);
$router->addConfig($config, 'resources');
$routes['featured'] = new Zend_Controller_Router_Route(
'featured/:id',
array('controller' => 'index', 'action' => 'featured', 'id' => null)
);
Zend_Controller_Front::getInstance()->getRouter()->addRoutes($routes);
*/
}
protected function _initLanguages()
{
}
//Initilaize zend ACL
public function _initAcl()
{
//Omit the process in CLI mode
if (php_sapi_name() != 'cli')
{
$helper = new Eat_Controller_Action_Helper_AclDefault();
$helper->setRoles();
$helper->setResources();
$helper->setPrivilages();
$helper->setAcl();
//Register the ACL plugin - Then it will be called automatically,whenever an acion is called
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
// $frontController->registerPlugin(new Eat_Plugin_Acl());
}
}
//Initialize error controller
public function _initErrorSwitcher()
{
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new Eat_Plugin_ErrorControllerSwitcher());
}
protected function _initZFDebug()
{
// Enabling this method seems to break autocomplete. Use only when needed
$autoloader = Zend_Loader_Autoloader::getInstance ();
$autoloader->registerNamespace ( 'ZFDebug' );
$db = Zend_Registry::get ( 'db' );
$cache = Zend_Cache::factory ( 'Core', 'File' );
//Zend_Controller_Front::getInstance()->getBaseUrl();
//APPLICATION_PATH
$options = array ('plugins' => array ('Variables', 'Database' => array ('adapter' => $db ), 'File' => array ('basePath' => Zend_Controller_Front::getInstance ()->getBaseUrl () ), 'Memory', 'Time', 'Registry', 'Cache' => array ('backend' => $cache->getBackend () ), 'Exception' ) );
$debug = new ZFDebug_Controller_Plugin_Debug ( $options );
$this->bootstrap ( 'frontController' );
$frontController = $this->getResource ( 'frontController' );
//$frontController->registerPlugin ( $debug );
}
}
您的应用程序和库文件夹应位于 public_html:
之外此代码在父文件夹(“/../”)中查找 "application" 文件夹(相对于 index.php):
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
此代码添加“/../library”以包含路径:
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/library'),
get_include_path(),
)));
因此要么将应用程序和库文件夹移到 public_html 之外,要么从 APPLICATOIN_PATH 定义中删除 /..(但这是不可取的,因为它会降低您的应用程序的安全性)
UPD. 如果您仍然遇到错误,请确保您拥有此文件以及其他 Zend 文件:
library/Zend/Loader/Autoloader.php
如果没有,请下载最新版本的 Zend Framework:
ZF1: http://downloads.zend.com/framework/1.12.10/ZendFramework-1.12.10.tar.gz
ZF2: http://downloads.zend.com/framework/2.3.4/ZendFramework-2.3.4.tgz
您可以将其保存到 "library" 文件夹或将其解压缩到 /usr/lib64/php(因此它被保存为 /usr/lib64/php/Zend/),这样您就不需要每个项目的这个文件夹
UPD2 搜索
getResource('multidb')
在您的代码(应用程序文件夹)中,然后尝试添加
$this->bootstrap('multidb');
在上面..
我的猜测是您的 Zend Framework 版本与原始软件中使用的不同,或者您的目录结构无效,您可以尝试将库和应用程序文件夹移到 public_html 之外吗?
UPD3 你也可以给我发邮件(mstrokin 在 gmail.com),我会尽力为你解决这个问题,我喜欢调试 :)
UPD4 尝试将 "getPluginResource" 更改为 "getResource"
一个可能的问题是 "library" 目录的权限。 在大多数情况下,它会影响 Linux 用户。
如果您是 Linux 用户,您可能需要更改它们
sudo chmod 755 -R path_to_project/library
如果您仍然遇到该错误,那么您应该使用 php.ini 设置或 "library" 文件夹位置。