0

我将 Zend Framework 1.10 用于 Web 应用程序,并且我想将 Zend_Db_Adapter(可能还有我的一些模型)用于 cli php 中的脚本,该脚本将与 cron 一起使用。您能告诉我如何根据 application.ini 中的设置创建 Zend_Db_Adapter 吗?在我需要 Zend_Db_Adapter 的应用程序模型中,我到处使用这样的东西:

    $this->_db = Zend_Db_Table::getDefaultAdapter();

将它用于cli也很好。例如,我创建了一个文件 cron_job 并且 $resource 在这里为空。set_include_path(implode(PATH_SEPARATOR, array($zendPath, get_include_path(), )));

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH',
/*              realpath(dirname(__FILE__) . '/../application')*/
              '/var/application');

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV',
              (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
                                         : 'production'));

// Register autoloader
require_once($zendPath . '/Zend/Loader/Autoloader.php');
Zend_Loader_Autoloader::getInstance();

$application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
$resource = $application->getBootstrap()->getPluginResource('db');  
var_dump($resource);

在 application.ini 我有设置:

resources.db.adapter = PDO_MYSQL    
resources.db.params.host = localhost

resources.db.params.username = user    
resources.db.params.password = password

resources.db.params.unix_socket = "/var/run/mysqld/mysqld.sock"    
resources.db.params.dbname = db_name
resources.db.isDefaultTableAdapter = true

根据我的应用程序的 application.ini 在此处创建 Zend_Db_Adapter 的最佳方法是什么,而不是为 cli 脚本创建另一个配置?我的 Web 应用程序引导程序是这样的:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    /**
     * Initilize Action helper in a broker
     */
    protected function _initActionHelpers()
    {

        Zend_Controller_Action_HelperBroker::addPrefix('Common_Helper');        
    }



    /**
     * Init plugins
     */
    protected function _initPlugins()
    {
        $fc = Zend_Controller_Front::getInstance();
        $fc->registerPlugin(new Plugin_AccessCheck());              
    }


    /**
     * Set transport for mail
     */
    protected function _initEmail()
    {

        //parameters to send mail
        $emailConfig = $this->getOption('email');

        //send parameters for sending email
        $transport = new Zend_Mail_Transport_Smtp($emailConfig['server'],
         $emailConfig);


        Zend_Mail::setDefaultTransport($transport);

        //object for sending mail
        $mailer = new Common_Mail();
        $mailer->setFrom($emailConfig['from_address'], $emailConfig['from_name']);  
        //congigure and store mailer for sending email      
        Zend_Registry::set('mailer', $mailer);          
    }


}

谢谢你。

4

2 回答 2

0

它看起来像它的作品。我创建了 init.php,我计划将其包含在将用于 cron 的所有脚本中。

<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', '/var/application');

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));


/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->getBootStrap()->bootstrap('db');

看起来在包含这个文件之后我可以使用这样的东西:

$db = Zend_Db_Table::getDefaultAdapter();

看起来没有必要在 application.ini 中设置

resources.db.isDefaultTableAdapter = true

我认为这在 Zend Framework 的代码中默认设置为 true。

于 2011-02-22T16:09:13.837 回答
0

我认为你的脚本没有给你一个数据库,因为你需要首先引导数据库。

试试这个: $application->getBootStrap()->bootstrap('db);

然后做

$resource = $application->getBootstrap()->getPluginResource('db');


更一般的说明:

** 您可以从同一个 Bootstrap 文件中同时执行 Web 应用程序的内容和 cli 的内容,这样,您可以以类似的方式对两者进行引导。这意味着您将处理 db 设置到您的 Bootstrap.php 文件,并将该 Bootstrap 文件用于您的 Web 应用程序和您执行的任何 cli 内容。您可以使用引导机制的依赖机制以多种灵活的方式进行引导,例如,一种用于 web,一种用于 cli。**

在您的引导程序中添加以下内容:

protected function _initTheDb
{
   //Following will automatically go to Zend_Application_Resource_Db,
   //if it can't find anything else named db to bootstrap
   $this->bootstrap('db');
   //do the above instead of the loader script 
   //which had: $resource = $application->getBootstrap()->getPluginResource('db'); 
   //Now setting up the db works for both cli and web,
   //if you add a _initCli() to your bootstrap.
}

扩展讨论:

假设你有这样的 Bootstrap.php 文件

protected function _initX
protected function _initTheDb
protected function _initZ

WHERE _initTheDb 和 _initZ 是你想要在 web 和 cli 中做的事情,而 _initX 是你不想在 cli 中做的事情。

为 cli 创建一个额外的 _init:

protected function _initCli()
{
    $this->bootstrap('TheDb');
    $this->bootstrap('Z');
    //BUT NOT $this->bootstrap('X'); since that that does apply for CLI.
}

现在在您的 cli 加载程序脚本中,只需确保您启动 cli。(这将引导 db 部分以及您添加到 _initCli 的任何其他部分)。

$application->getBootStrap()->bootstrap('cli');

问题:既然 _initCli 现在出现在您的 Bootstrap 中,您如何防止 Web 引导过程也引导“cli”部分?

X 仅由 Web 应用程序引导(在引导文件的顶部)。如果它已被引导,则您必须在 Web 环境中执行。使用这些知识跳过引导 cli 部分:

protected function _initCli()
{
    if ($this->hasResource('X'))
    {
        //We know that we are boot-strapping for web.
        return;
    }

    //If we get here, we know that we are cli
    $this->bootstrap('TheDb');
    $this->bootstrap('Z');
}
于 2011-02-21T18:13:04.727 回答