我正在开发一个使用Phirehose来收集和使用Twitter Streaming API的项目。 Phirehose库旨在从命令行运行,最好是作为守护进程或cron作业。
我创建了一个守护进程并将其放在库文件夹中。 Bootstrap.php已更新为自动加载自定义库。因此,应用程序本身可以看到我的守护进程。
我的问题是如何将它与Zend Framework正确集成。我需要能够直接调用守护进程文件从命令行或使用Upstart之类的工具启动它,但是这样做Zend应用程序没有加载,这意味着我没有访问权限我的模特。
我可以创建一个控制器来启动它,但我不想添加某人能够从Web界面控制守护进程的安全问题。我也可以编写PDO手动连接到数据库,但我试图避免它出于缩放的原因。我更喜欢所有数据库连接数据都驻留在application.ini中。
在我的守护进程类中,有没有办法初始化我的Zend Framework应用程序,以便我可以使用这些模型?
答案 0 :(得分:4)
此示例演示了如何使用Zend_Queue执行后台任务。 在这个特定的例子中,我使用Zend_Queue和cronjob在后台生成发票,我的Zend_Queue被初始化并在bootstrap中注册。
创建作业,My_Job来源为here:
class My_Job_SendInvoice extends My_Job
{
protected $_invoiceId = null;
public function __construct(Zend_Queue $queue, array $options = null)
{
if (is_array($options)) {
$this->setOptions($options);
}
parent::__construct($queue);
}
public function job()
{
$filename = InvoiceTable::getInstance()
->generateInvoice($this->_invoiceId);
return is_file($filename);
}
}
在您的服务或模型中的某个位置注册作业:
$backgroundJob = new My_Job_SendInvoice(Zend_Registry::get('queue'), array(
'invoiceId' => $invoiceId
));
$backgroundJob->execute();
创建后台脚本:
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/..'));
// temp, environment should be specified prior execution
define('APPLICATION_ENV', 'development');
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
require_once 'Zend/Application.php';
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
/* @var $queue Zend_Queue */
$queue = Zend_Registry::get('queue');
$messages = $queue->receive(5);
foreach ($messages as $i => $message) {
/* @var $job My_Job */
$job = unserialize($message->body);
if ($job->job()) {
$queue->deleteMessage($message);
}
}