背景:
一个kohana框架的工程,一段gearman worker的常驻程序。
由于这段程序与整个项目的业务有耦合,所以不能直接在terminal中用php+文件名的方式执行,这样执行仅仅是执行孤立的单个文件。
<?php
echo "gearman is running...";
$gmworkers = array();
for ($i=0; $i < 10; $i++) {
// $gmworker = new GearmanWorker();
// $gmworker->addServer();
$gmworkers[$i] = new GearmanWorker();
$gmworkers[$i]->addServer();
$gmworkers[$i]->addFunction("sendmail", "sendmail_fn");
}
while (1) {
for ($i=0; $i < 10; $i++) {
$gmworkers[$i]->work();
}
}
function sendmail_fn($job) {//processing...}
这段程序所在的文件为process_mail.php,在terminal中执行
$ php process_mail.php是可以的,只是其中用到的其他文件中的Class都是找不到的。
解决方法:
按照Kohana官方提供的方案进行试验。
https://kohanaframework.org/3.3/guide/minion/tasks
将上面的程序写在Task_Processmail的类中,文件放置在modules/minion/classes/Task路径下。
在application/bootstrap.php中将minion相关的注释打开
在terminal中 $ php index.php (--task=)processmail 即可。
但是又出现了一个问题:
foobarErrorException [ 2 ]: GearmanWorker::addFunction(): function sendmail_fn is not callable ~ SYSPATH/classes/Task/Processmail.php [ 27 ]
说我们的函数不是可回调的。在没有使用minion的时候这样回调是可以的。经过尝试,将这个sendmail_fn函数写在Class外面就好了。
接下来,遇到一个坑。请看代码:
class Task_Processmail extends Minion_Task {
protected function _execute(array $params)
{
echo "GearmanWorker starting ... \n";
$gmworkers = array();
for ($i=0; $i < 20; $i++) {
try {
$gmworker = new GearmanWorker();
$gmworker->addServer();
$gmworkers[$i] = new GearmanWorker();
$gmworkers[$i]->addServer();
$gmworkers[$i]->addFunction("sendmail", "sendmail_fn");
} catch (Exception $e) {
print_r($e);
}
}
while(1) {
for ($i=0; $i < 20; $i++) { $gmworkers[$i]->work(); }
}
}
}