我正在使用laravel队列在facebook帖子上发表评论。什么时候我收到facebook webhook的数据,基于收到的细节我 评论帖子。要从facebook webhook一次处理100个响应,我正在使用laravel队列,以便它可以逐个执行。 我使用了https://scotch.io/tutorials/why-laravel-queues-are-awesome
中提到的分步流程public function webhooks(Request $request)
{
$data = file_get_contents('php://input');
Log::info("Request Cycle with Queues Begins");
$job = (new webhookQueue($data)->delay(10);
$this->dispatch($job);
Log::info("Request Cycle with Queues Ends");
}
这是我的工作类结构
class webhookQueue extends Job implements ShouldQueue
{
使用InteractsWithQueue,SerializesModels;
private $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
//handling the data here
}
}
我正在连续点击webhooks()函数,所有作业同时工作但不在队列中,没有任何作业存储在作业表中,我已经给出延迟但它也没有工作,请一些人帮助我,我从昨天开始尝试,但没有结果。
这是我登录laravel.log
[2017-02-08 14:18:42] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:44] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:18:59] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends
答案 0 :(得分:14)
使用队列你应该做一些工作:
<。>在.env文件中,您应该将queue_drive从同步更改为数据库之后,您应该使用artisan命令在数据库中创建队列表:
php artisan queue:table
php artisan migrate
最后,您应该使用php artisan queue:listen
或php artisan queue:work
答案 1 :(得分:5)
我遇到了同样的麻烦,如果您使用的是laravel 5.7,请在.env文件中使用它
QUEUE_CONNECTION=database
像这样清除配置缓存后
php artisan config:cache
答案 2 :(得分:4)
确保您的应用程序未处于维护模式...我已经维护了我的应用程序,但是允许我的本地IP地址...我不知道为什么它没有运行。我最后必须去调试WorkCommand才能发现...
./工匠向上;
答案 3 :(得分:4)
就我而言,我使用自定义队列名称对作业进行分组。
ProcessCourseInteractions::dispatch($courseProcessing)->onQueue('course_interactions');
该队列不是由以下人员执行的:
php artisan queue:work
和
php artisan queue:listen
我需要指定队列名称(对工作和收听有效):
php artisan queue:work --queue=course_interactions
答案 4 :(得分:2)
Laravel 5.7的更新:
在.env
中,设置QUEUE_CONNECTION=database
,以使分派的作业进入数据库驱动程序。
然后:
# Creates a migration for the database table holding the jobs
php artisan queue:table
# Executes the migration
php artisan migrate
# Kicks off the process that executes jobs when they are dispatched
php artisan queue:work
答案 5 :(得分:1)
我看到你已经有了队列表。
尝试运行php artisan queue:listen --tries=3
或php artisan queue:work
等
队列工作是每个命令只执行一个Job。因此,如果表中有20个作业,则可能需要运行20次队列工作。这就是你可以运行queue:listen
命令的原因。但它占用了大量的CPU。
在服务器中,您可能希望在后台运行队列侦听最多3次尝试。
在终端/命令提示符下SSH到您的服务器。然后CD
到工匠文件所在的项目目录。运行此命令:
nohup php artisan queue:listen --tries=3 > /dev/null 2>&1 &
在这种情况下,作业将在后台自动处理。你只需要派遣这份工作。我建议使用失败的作业表。如果您正在使用后台队列列表器。
希望这有帮助。
答案 6 :(得分:1)
别跟我犯同样的错误
我在错误的目录中运行php artisan queue:work
。
仅浪费30分钟,可能会更长。
答案 7 :(得分:1)
只需在 .env 文件中设置 QUEUE_CONNECTION=database
答案 8 :(得分:0)
被接受的答案对我来说是个问题,但我也想解决了我解决的另外两个类似问题,也许它们会帮助到这里的其他人。
其他问题1 :工作创建(构造函数)有效,但工作处理程序无法启动-永远。
其他问题2 :工作创建(构造函数)有效,但工作处理程序无法执行-有时。
DB::beginTransaction
。 假设我想要即使在交易过程中也要解雇,我可以这样做:
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($errorInfo)
{
$this->errorInfo = $errorInfo;
// Queues won't run the handlers during transactions
// so, detect the level, and if it is not 0, rollback to force job handling
if (\DB::transactionLevel() != 0) {
\DB::rollBack();
}
}
但不要这样做,除非您想要解雇您的工作并强行回滚。我的情况很独特,因为我的工作会发送致命错误的电子邮件,所以我希望它被解雇,因为无论如何我都会出错,这会破坏流程(回滚将会发生,并且由于未捕获的错误而无法计划)。
在这种情况下,您不想这样做:
您应该安排调度,使其在回滚或提交之后发生。 我没有这份工作,因为当我无法预测时(致命错误)就会发生这种情况。但是,如果您有控制权,例如知道您的付款成功,在承诺后退出或退出所有级别的交易!
我不确定在交易中触发作业的行为,然后然后回滚或提交。如果通过添加延迟无法正常工作,则可以解决此问题,但这似乎是不可靠的(猜测等待多长时间),除非出现明显的延迟。
答案 9 :(得分:0)
对于那些问题的未来读者来说,如果队列在以前工作过但不再工作了,请尝试从数据库的jobs表中删除所有对我有用的东西。
答案 10 :(得分:0)
一切都设置好了,但仍然无法正常工作,然后确保在 crontab -e 上添加了时间表
* * * * * cd /var/www/html/<project_name> && php artisan schedule:run >> /dev/null 2>&1
答案 11 :(得分:0)
您可以通过以下方式重试(我假设您在 Laravel 文档中做了说明,但总有一天它不起作用):
第 1 步:删除数据库中的表“jobs”。
第 2 步:在控制台中运行命令 'php artisan migrate' 以再次创建表 'jobs'。
第 3 步:在控制台中运行命令 'php artisan queue:work'
第 4 步:重试您的应用
请注意,在 .env 文件中,您设置了:
QUEUE_CONNECTION=数据库
QUEUE_DRIVER=数据库
P/s:对我有用!
答案 12 :(得分:0)
.env
QUEUE_CONNECTION=database
php artisan queue:table
php artisan migrate
dispatch(new YourJob($order))->onQueue('queue_name')
php artisan queue:work --queue=queue_name