31 янв. 2011 г.

Zend Framework: запуск скриптов из командной строки

Предположим, у вас есть сайт, работающий на Zend Framework и вам необходимо по cron'у вызывать отдельные скрипты вашего проекта. Можно решить эту проблему просто вызовом соответствующих URL'ов, типа http://site.com/my/action. Но что делать, если скрипт подразумевает работу в течение 5-10 минут? Не делать же максимальное время обработки скрипта 10 минут.

Создайте каталог cron, находящийся на том же уровне, что и ваш публичный каталог, в котором лежит index.php.

Создайте в нем файл, например, sendmail.php:

<?php

// 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();


// ** Процесс

// Тут пишите нужный вам код точно также, как если бы вы писали его в экшнах, например:
$users = Default_Model_User::getInstance()->getUnconfirmed();

if($users && $users->count()) {
foreach($users as $user) {
$user->notify();
}
}

То, что выделено жирным шрифтом будет у вас постоянным. Вы можете поэкспериментировать со строкой $application->bootstrap(), например, загружая только те ресурсы, которые вам требуются для выполнения конкретной операции.

А в cron'е вызывать скрипт, как и любой другой:

*/5 * * * * /usr/bin/php /all/www/mysite/cron/sendmail.php

Комментариев нет :

Отправить комментарий