2015-12-28 18 views
5

Tình hìnhTại sao Công việc Hàng đợi Laravel của tôi không thành công sau 60 giây?

Tôi đang sử dụng Laravel Queues để xử lý một số lượng lớn các tập tin media, một công việc cá nhân dự kiến ​​sẽ mất vài phút (cho phép chỉ nói đến một giờ).

Tôi đang sử dụng Người giám sát để chạy hàng đợi của mình và tôi đang chạy 20 quy trình cùng một lúc. tập tin giám sát cấu hình của tôi trông như thế này:

[program:duplitron-worker] 
process_name=%(program_name)s_%(process_num)02d 
command=php /var/www/duplitron/artisan queue:listen database --timeout=0 --memory=500 --tries=1 
autostart=true 
autorestart=true 
user=duplitron 
numprocs=20 
redirect_stderr=true 
stdout_logfile=/var/www/duplitron/storage/logs/duplitron-worker.log 

Có một vài điểm kỳ quặc mà tôi không biết làm thế nào để giải thích hoặc đúng:

  1. Việc của bạn khá liên tục thất bại sau khi chạy 60-65 giây .
  2. Sau khi được đánh dấu là không thành công, công việc tiếp tục chạy ngay cả sau khi được đánh dấu là không thành công. Cuối cùng họ kết thúc giải quyết thành công.
  3. Khi tôi run the failed task in isolation để tìm nguyên nhân gây ra sự cố, nó thành công tốt.

Tôi tin rằng đây là vấn đề hết thời gian chờ; tuy nhiên, tôi đã bị ấn tượng rằng --timeout=0 sẽ dẫn đến thời gian chờ không giới hạn.

Các Câu hỏi

Làm thế nào tôi có thể ngăn chặn "thất bại" trạng thái công việc tạm thời này? Có những nơi khác mà một thời gian chờ hàng đợi có thể được gọi mà tôi không biết?

+1

Kiểm tra 'max_execution_time' php.ini của bạn bao nhiêu nó nói? Nếu đó là 60 giây, có vấn đề của bạn. hãy thử tăng thời gian chờ. –

+0

Ý tưởng tuyệt vời @ WillyPt - sẽ không phải là cài đặt php.ini chấm dứt toàn bộ tập lệnh hay không? Nó tiếp tục giải quyết. (FWIW 'max_execution_time' được đặt thành 30 giây, tôi sẽ khám phá và thử nghiệm theo các dòng đó). – slifty

Trả lời

10

Nó chỉ ra rằng ngoài thời gian chờ có một thiết lập expire quy định tại config/queue.php

'database' => [ 
     'driver' => 'database', 
     'table' => 'jobs', 
     'queue' => 'default', 
     'expire' => 60, 
    ], 

Thay đổi điều đó với một giá trị cao hơn đã làm các trick.

2

Lưu ý quan trọng: "hết hạn" hiện nay được gọi là "retry_after" (Laravel 5.4)

Các vấn đề liên quan