скрипт создания Zend_Db_Adapter на основе настроек в application.ini для клиента php - PullRequest
0 голосов
/ 21 февраля 2011

Я использую Zend Framework 1.10 для веб-приложения и хотел бы использовать Zend_Db_Adapter (и, возможно, некоторые из моих моделей) для скрипта в cli php, который будет использоваться с cron.Не могли бы вы рассказать, как создать Zend_Db_Adapter на основе настроек в application.ini?В модели приложения, когда мне был нужен Zend_Db_Adapter, я везде использовал что-то вроде этого:

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

Было бы хорошо использовать его и для Cli.Например, я создал файл cron_job, а $ resource здесь равен нулю.set_include_path (implode (PATH_SEPARATOR, массив ($ 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

Как лучше всегосделать создание Zend_Db_Adapter здесь на базе application.ini моего приложения, чтобы не создавать другую конфигурацию для сценариев cli?Мой загрузчик для веб-приложения выглядит примерно так:

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);          
    }


}

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2011

Похоже, это работает. Я создал файл 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.

0 голосов
/ 21 февраля 2011

Я думаю, что ваш скрипт не возвращает вам БД, потому что вам нужно сначала загрузить БД.

Попробуйте это: $ application-> getBootStrap () -> bootstrap ('db);

THEN do

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


На более общем замечании:

** вы можете выполнять как веб-приложения, так и вырезки из одного и того же файла Bootstrap, таким образом, вы можете загружать вещи одинаково для обоих.Это означает, что вы перешли бы к настройке db в свой файл Bootstrap.php и использовали этот файл Bootstrap как для своего веб-приложения, так и для любых других действий, которые вы делаете.Вы можете использовать механизм зависимостей загрузочного механизма для начальной загрузки несколькими, гибкими способами, скажем, один для веб, другой для 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

ГДЕ _initTheDb и _initZ - это то, что вы хотите делать как в Интернете, так и в cli, а _initX - это то, что выне хочу делать в cli.

создайте дополнительный _init для cli:

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

Теперь в вашем скрипте cli loader, просто убедитесь, что вы загрузили ремешок для cli.(Это приведет к загрузке раздела db и любых других разделов, добавленных вами в _initCli).

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

Вопрос : Как предотвратить загрузку веб-процесса при запуске', поскольку _initCli теперь присутствует в вашей Bootstrap?

X загружается только веб-приложением (вверху файла Bootstrap).Если он был загружен, вы должны работать в веб-среде.Используйте эти знания, чтобы пропустить загрузку раздела 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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...