【问题标题】:Using laravel queue fails to run on my shared hosting solution使用 laravel 队列无法在我的共享主机解决方案上运行
【发布时间】:2015-06-18 02:29:07
【问题描述】:

试图让队列在我的共享主机上工作,

  • 我设置了一个 cron 作业,每分钟运行一次 'php artisan queue:work'。
  • 我正在使用数据库驱动程序
  • 作业正常进入作业表
  • 如果我使用同步驱动程序,它可以在我的共享主机上运行 在我的开发者机器上,它同时适用于同步和数据库驱动程序。
  • 我不喜欢 Laravel Queue: How to use on shared hosting 提供了足够的答案,因为我有 cron 的可能性,因此我想让它与数据库驱动程序一起使用
  • php 是 5.5 版,来自 cli 和 web 界面。

php artisan queue:work on my shared host (via cron) 返回

[ErrorException] 
Invalid argument supplied for foreach()

在我的日志文件中写了以下内容。

[2015-04-12 18:59:01] production.ERROR: exception 'ErrorException' with message 'Invalid argument supplied for foreach()' in /home/a109/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php:287 Stack trace:
#0 /home/a109/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php(287): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'Invalid argumen...', '/home/a109/vend...', 287, Array)
#1 /home/a109/vendor/symfony/console/Symfony/Component/Console/Application.php(823): Symfony\Component\Console\Input\ArgvInput->hasParameterOption(Array)
#2 /home/a109/vendor/symfony/console/Symfony/Component/Console/Application.php(123): Symfony\Component\Console\Application->configureIO(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 /home/a109/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(94): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 /home/a109/artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#5 {main}

在 vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php 的第 287 行有这个函数

  /**
 * Returns true if the raw parameters (not parsed) contain a value.
 *
 * This method is to be used to introspect the input parameters
 * before they have been validated. It must be used carefully.
 *
 * @param string|array $values The value(s) to look for in the raw parameters (can be an array)
 *
 * @return bool true if the value is contained in the raw parameters
 */
public function hasParameterOption($values)
{
    $values = (array) $values;

    foreach ($this->tokens as $token) {
        foreach ($values as $value) {
            if ($token === $value || 0 === strpos($token, $value.'=')) {
                return true;
            }
        }
    }

    return false;
}

这就是失败的傻瓜。

我怎样才能让它工作?

【问题讨论】:

    标签: php symfony laravel queue


    【解决方案1】:

    从 Laravel 5.7 开始,有一个新的队列命令可以在空时停止工作:

    php artisan queue:work --stop-when-empty

    由于这仅适用于大多数电子邮件或少量工作,因此我将其放在 cronjob 上以每分钟运行一次。我想说,这并不是每分钟 20 多个工作的真正解决方案,但适用于我的电子邮件。这将每分钟运行大约 5 秒,仅用于发送电子邮件,具体取决于电子邮件的数量。

    步骤

    1. 创建新命令:$ php artisan make:command SendContactEmails
    2. SendContactEmails.php,更改:protected $signature = 'emails:work';
    3. handle()方法中,添加:
    return $this->call('queue:work', [
        '--queue' => 'emails', // remove this if queue is default
        '--stop-when-empty' => null,
    ]);
    
    1. app/Console/Kernal.php 文件中,将命令添加到您的命令列表中:
    protected $commands = [
        \App\Console\Commands\SendContactEmails::class
    ];
    
    1. 每分钟安排一次命令:
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('emails:work')->everyMinute();
        // you can add ->withoutOverlapping(); if you think it won't finish in 1 minute
    }
    
    1. 更新您的 cronjobs:
    * * * * * /usr/local/bin/php /home/username/project/artisan schedule:run > /dev/null 2>&1
    

    Source

    处理所有排队的作业然后退出

    --stop-when-empty 选项可用于指示工作人员处理所有作业,然后正常退出。如果您希望在队列为空后关闭容器,则此选项在使用 Docker 容器中的 Laravel 队列时很有用:

    php artisan queue:work --stop-when-empty

    【讨论】:

      【解决方案2】:

      Comyn 在 freenode 的 #laravel 中回答了

      我不得不把 cron 命令改成这样:

      php -d register_argc_argv=On artisan queue:work
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 2020-03-04
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多