RabbitMQ和Yii控制台回调错误

u0sqgete  于 2022-11-09  发布在  RabbitMQ
关注(0)|答案(2)|浏览(237)

我尝试让RabbitMQ与Yii控制台一起工作,以便发送事务性邮件,但是我在Yii中使用PHP-AMQPLib库时遇到了问题。我的代码如下:

<?php
class RabbitMqCommand extends CConsoleCommand {

    public function actionSendMail() {
        require_once ('/htdocs/code/wwwroot/protected/components/php-amqplib/amqp.inc');

        $conn = new AMQPConnection ( 'localhost', 5672, 'guest', '123456', '/' );
        $ch = $conn->channel ();

        $ch->queue_declare ( 'msgs', false, true, false, false );

        $ch->exchange_declare ( 'router', 'direct', false, true, false );

        $ch->queue_bind ( 'msgs', 'router');

        $ch->basic_consume ( 'msgs', 'consumer', false, false, false, false, 'processMessage' );

            // Loop as long as the channel has callbacks registered
        while ( count ( $ch->callbacks ) ) {
            $ch->wait ();
        }

        $ch->close();
        $conn->close();

    }

    public function processMessage($msg) 
        {
           //process and send email
        }

当我尝试从命令行执行以下代码时:

php -q /htdocs/code/wwwroot/protected/yiic RabbitMQ SendMail

我收到以下错误消息:

PHP Error[2]: call_user_func() expects parameter 1 to be a valid callback, function 'processMessage' not found or invalid function name
    in file /htdocs/code/wwwroot/protected/components/php-amqplib/amqp.inc at line 1390

# 0 /htdocs/code/wwwroot/protected/components/php-amqplib/amqp.inc(1390): call_user_func()

# 1 unknown(0): AMQPChannel->basic_deliver()

# 2 /htdocs/code/wwwroot/protected/components/php-amqplib/amqp.inc(167): call_user_func()

# 3 /htdocs/code/wwwroot/protected/components/php-amqplib/amqp.inc(275): AMQPChannel->dispatch()

# 4 /htdocs/code/wwwroot/protected/commands/RabbitMqCommand.php(29): AMQPChannel->wait()

# 5 unknown(0): RabbitMqCommand->actionSendMail()

# 6 /htdocs/code/framework/console/CConsoleCommand.php(135): ReflectionMethod->invokeArgs()

# 7 /htdocs/code/framework/console/CConsoleCommandRunner.php(63): RabbitMqCommand->run()

# 8 /htdocs/code/framework/console/CConsoleApplication.php(88): CConsoleCommandRunner->run()

# 9 /htdocs/code/framework/base/CApplication.php(158): CConsoleApplication->processRequest()

# 10 /htdocs/code/framework/yiic.php(33): CConsoleApplication->run()

# 11 /htdocs/code/wwwroot/protected/yiic.php(7): require_once()

# 12 /htdocs/code/wwwroot/protected/yiic(4): require_once()

你知道我做错了什么吗

nue99wik

nue99wik1#

发生此错误的原因是processMessage是对象的示例方法,但basic_consume的参数应该是全局PHP方法。
查看此主题以了解解决方案:PHP Call a instance method with call_user_func within the same class

ifsvaxew

ifsvaxew2#

请更改此行:

$ch->basic_consume ( 'msgs', 'consumer', false, false, false, false, 'processMessage' );

更改为:

$channel->basic_consume('msgs', 'consumer', false, false, false, false, [new RabbitMqCommand,'process_message']);

相关问题