【问题标题】:How to load Zend classes when running php script by command lines通过命令行运行php脚本时如何加载Zend类
【发布时间】:2025-11-28 16:40:01
【问题描述】:

我有一个需要 Zend 类的 php 脚本。它可以在浏览器中运行,但是在命令提示符下通过命令行运行脚本时会出现错误。

require_once 'Zend/Loader.php'; // It can work in a browser but failed by command lines

我也试过了:

require_once 'C:\wamp\www\zf_project\library\Zend\Loader.php';

ini_set('include_path', 
ini_get('include_path') . 
PATH_SEPARATOR . 
dirname(__FILE__). DIRECTORY_SEPARATOR. 'library');

但是失败了。

然后我需要加载类:

Zend_Loader::loadClass('Zend_Rest_Client');

如何使用 Zend 类?

提前致谢!

【问题讨论】:

    标签: php zend-framework command-line classloader zend-loader


    【解决方案1】:

    如果您只想通过自动加载来使用 Zend 类 — 无需引导您的整个应用程序 — 您需要在 ZF1 中做的所有事情(您似乎正在使用它):

    <?php
    // if ZF is not in your include path to begin with
    set_include_path(implode(PATH_SEPARATOR, array('/path/to/zend/library', get_include_path())));
    include 'Zend/Loader/Autoloader.php';
    Zend_Loader_Autoloader::getInstance(); // registers autoloader
    
    // now can access Zend classes without having to include
    $client = new Zend_Http_Client(...);
    

    另外请注意,您不需要调用Zend_Loader::loadClass 来加载类,当您在普通代码中使用类名时,自动加载器会自动完成此操作,例如通过调用构造函数,就像我在上面所做的那样.

    【讨论】:

    • 感谢您的回复!我试过这个方法为:set_include_path(implode(PATH_SEPARATOR, array('D:\wamp\www\workspace\zf_proj\library', get_include_path())); include 'Zend/Loader.php'; Zend_Loader::getInstance(); // registers autoloader Zend_Loader::loadClass('Zend_Rest_Client');//this is what I need 但是出现错误:意外';'(第一行)我有什么遗漏吗?
    • @asdk77 这个答案只是缺少)set_include_path 行上的结束。我会解决的
    • 谢谢!但似乎需要使用“自动加载器”。
    • @asdk77 我已经更正并测试了代码:S 现在...是的,我本来打算使用 Zend_Loader_Autoloader 类。
    【解决方案2】:

    当您从 Web 浏览器运行它时,包含路径在 public/index.php 中设置,然后引导应用程序。同样,您可以复制 public/index.php(例如 setup.php)并将其包含在命令行代码中。此外,将您需要的引导位复制到该文件中。

    请注意,在 ZF2 中,有一个“控制台路由”可以让您创建 MVC 命令行脚本。

    这是我的 setup.php,注意我是如何使用“new Zend_Config”加载配置的。只需在要从命令行(控制台)运行的文件中“要求”此文件即可。

    编辑:您必须在 '/relative/path/to/application/' 中正确设置 APPLICATION_PATH。

    <?php
    
    error_reporting(E_ALL & ~E_NOTICE | E_STRICT);
    // Define path to application directory
    defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/relative/path/to/application/'));
    
    // Define application environment
    define('APPLICATION_ENV', 'development');
    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(),
    )));
    
    require_once 'Zend/Application.php';
    
    $app = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH  . '/configs/application.ini');
    $res = $app->getOption('resources');
    $config = new Zend_Config($res);
    

    【讨论】:

    • 我打算通过命令行在命令提示符下运行脚本:../php.exe ../*.php。如何更改我的脚本并让它以这种方式工作?谢谢!
    • @asdk77 添加了示例。只需在 your-file.php 中需要该文件,您就可以将其作为“php your-file.php”运行。
    • 感谢您的回答!我复制了上面的文件并将它的保存为 'cli.php' 和我想在同一个文件夹中运行的脚本。然后我在脚本的开头添加了“require_once 'cli.php'”并在命令提示符下运行它。发生错误:“致命错误:require_once(): 无法打开所需的 'Zend/Applic.ation.php'”。有什么我错了吗?我正在使用 ZF 1.12.3。
    • @asdk77 我编辑了代码。您需要确保在文件中正确设置了 APPLICATION_PATH。例如如果文件在 application/scripts/ 中,那么 '/relative/path/to/application/' 应该是 '/../'
    • 谢谢!但似乎需要使用“autoloader”-“require_once 'Zend/Loader/Autoloader.php'”;否则,它仍然无法打开“应用程序”流。再次感谢您的补充回答!