Hướng dẫn php artisan queue:work not working - hàng đợi nghệ nhân php: công việc không hoạt động

Câu trả lời được chấp nhận là một vấn đề đối với tôi, nhưng tôi cũng nói về câu hỏi này cho 2 vấn đề tương tự khác mà tôi đã giải quyết, và có lẽ họ sẽ giúp những người khác kết thúc ở đây.

Vấn đề khác 1: Tạo công việc (nhà xây dựng) hoạt động, nhưng xử lý công việc không bắn - bao giờ.: job creation (constructor) works, but job handler does not fire - ever.

  • Chìa khóa ở đây là chìa khóa ở đây bởi vì, thông thường, nếu không ai trong số họ bắn, thì đó có thể là do mã việc làm của bạn được sửa đổi và hàng đợi của bạn nên được khởi động lại.ever is key here because, typically, if none of them ever fire, then it could be because your job code is modified and your queue should be restarted.

Vấn đề 2 khác: Tạo công việc (nhà xây dựng) hoạt động, nhưng đôi khi xử lý công việc không bắn - đôi khi.: job creation (constructor) works, but job handler does not fire - sometimes.

  • Khi đôi khi đúng với bạn, thì có thể là công việc của bạn không bắn là vì chúng đang xảy ra khi đang ở trong một giao dịch, như DB::beginTransaction.sometimes is true for you, then it may be that your jobs that are not firing are because they are happening while in a transaction, like a DB::beginTransaction.

Giả sử tôi muốn công việc bị sa thải ngay cả trong một giao dịch, tôi có thể làm điều này:

/**
 * 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();
    }
}

Nhưng đừng làm điều này trừ khi bạn muốn sa thải công việc của mình và buộc phải quay lại. Tình huống của tôi là duy nhất ở chỗ công việc của tôi gửi email về các lỗi gây tử vong, vì vậy tôi muốn nó bị bắn vì dù sao tôi cũng có lỗi phá vỡ quá trình (rollback sẽ xảy ra và không có kế hoạch do lỗi không bị bắt). unless you want to fire your job and force rollback. My situation is unique in that my job sends emails on FATAL errors, so I want it to fire because I have an error breaking the process anyway (rollback going to happen and is unplanned due to uncaught error).

Đây là một tình huống khi bạn không muốn làm điều này:

  • Công việc của bạn gửi email cho người dùng khi thanh toán thành công
  • Khoản thanh toán của bạn có thể thành công, không thể
  • Tùy thuộc vào thanh toán thành công, bạn rollback hoặc cam kết

Bạn nên cấu trúc công văn của bạn để xảy ra sau khi bạn quay lại hoặc cam kết. Tôi không có sự xa xỉ đó cho công việc của mình vì nó xảy ra khi tôi không thể dự đoán (một lỗi nghiêm trọng). Nhưng nếu bạn có quyền kiểm soát nó, như biết thanh toán của bạn thành công, hãy gửi đi sau khi bạn đã cam kết hoặc thoát khỏi tất cả các cấp độ giao dịch!

Tôi không chắc chắn về hành vi kích hoạt một công việc trong khi giao dịch, và sau đó quay lại hoặc cam kết. Nó có thể được làm việc xung quanh nếu nó không hoạt động đúng bằng cách thêm độ trễ, nhưng điều đó có vẻ không đáng tin cậy (đoán thời gian chờ đợi) trừ khi đó là một sự chậm trễ đáng kể.

Khởi động lại nhân viên hàng đợi của Laravel nên là một phần thiết yếu trong tập lệnh triển khai của bạn. Chạy lệnh đơn giản này nên thực hiện thủ thuật:

php artisan queue:restart

Nó hoạt động bằng cách đặt khóa illuminate:queue:restart trong kho lưu trữ bộ nhớ cache của bạn giữ dấu thời gian khi lệnh chạy. Sau khi công nhân hoàn thành mỗi công việc, họ kiểm tra khóa đó và xem nó có được cập nhật kể từ lần cuối cùng họ kiểm tra không. Nếu đó là trường hợp, quy trình công nhân sẽ thoát và người quản lý quy trình của bạn có thể bắt đầu một quy trình mới. Bạn có thể tìm thấy thêm chi tiết về điều đó trong bài viết trước này.

Nếu bạn đang sử dụng Laravel Forge, bạn sẽ dễ dàng truy cập thông tin về thời gian hoạt động của mỗi công nhân của bạn. Nếu bạn kiểm tra trạng thái của một công nhân sau khi nó được khởi động lại, bạn sẽ thấy một cái gì đó như thế này:

worker-:worker-_00   RUNNING   pid 75, uptime 0 days, 00:00:20

Điều này cho thấy quá trình là thương hiệu mới. Người quản lý quy trình của bạn vừa mới bắt đầu nó.

Nếu công nhân không thoát sau khi khởi động lại tín hiệu và bạn đã kiểm tra trạng thái của nó, bạn sẽ tìm thấy thời gian hoạt động lâu hơn nhiều. Nếu đó là trường hợp, đây là một vài điều cần kiểm tra.

Đảm bảo công nhân chạy ở chế độ daemon

Nếu bạn bắt đầu nhân viên của mình bằng cách sử dụng queue:listen thay vì queue:work, quy trình người nghe sẽ bắt đầu một quy trình con riêng cho mỗi công việc. Khi công việc chạy, quá trình trẻ em bị chấm dứt và một công việc mới bắt đầu xử lý công việc tiếp theo. Điều đó có nghĩa là công việc của bạn sẽ luôn chạy bằng mã mới nhất được triển khai. Nói cách khác, không cần phải khởi động lại quy trình người nghe và do đó chạy

php artisan queue:restart
0 sẽ không có bất kỳ tác dụng nào.

Cách duy nhất để khởi động lại quy trình người nghe là thủ công:

supervisorctl restart worker-name:*

Đảm bảo lưu trữ bộ đệm được cấu hình chính xác

Một điều khác để kiểm tra là cấu hình của cửa hàng bộ nhớ cache của bạn. Về cơ bản tất cả các trường hợp công nhân chạy ứng dụng của bạn nên có quyền truy cập vào cùng một cửa hàng bộ đệm. Tất cả đều cần có khả năng nhìn thấy giá trị của khóa bộ đệm illuminate:queue:restart khi nó được đặt bởi lệnh khởi động lại.

Ngoài ra, nếu bạn đang sử dụng trình điều khiển bộ đệm tệp, hãy đảm bảo các quyền của thư mục

php artisan queue:restart
2 được đặt chính xác để phiên bản chạy
php artisan queue:restart
0 có thể ghi khóa bộ đệm và các phiên bản công nhân có thể đọc nó.

sudo chown -R forge:forge storage/framework/cache

Chạy lệnh này sẽ đảm bảo rằng các tệp trong thư mục bộ đệm đều thuộc sở hữu của người dùng hệ thống

php artisan queue:restart
4. Bây giờ nếu các quy trình công nhân của bạn được chạy bởi người dùng
php artisan queue:restart
4, họ sẽ có quyền truy cập vào các tệp bộ đệm ngay cả khi lệnh khởi động lại được thực thi bởi người dùng hệ thống khác.

Thay đổi tiền tố bộ đệm

Cảm ơn @Trevorgehman đã chia sẻ mẹo này.

Nếu bạn thay đổi tiền tố bộ đệm, lệnh khởi động lại sẽ đặt khóa bộ đệm với tiền tố mới. Các công nhân hiện tại sẽ không thể phát hiện sự thay đổi tiền tố đó và sẽ tiếp tục kiểm tra khóa bộ đệm cũ.

Nếu bạn sẽ thay đổi tiền tố bộ đệm, bạn sẽ phải khởi động lại công nhân theo cách thủ công sau khi thay đổi.

supervisorctl restart worker-name:*

Nếu bạn muốn tìm hiểu thêm về hệ thống hàng đợi của Laravel, hãy đảm bảo kiểm tra hàng đợi Laravel hoạt động! Tôi đã đặt mọi thứ tôi biết về hệ thống hàng đợi ở định dạng ebook cùng với một số trường hợp sử dụng thực tế. Kiểm tra nó cho một khóa học sụp đổ, một cuốn sách nấu ăn, một hướng dẫn và một tài liệu tham khảo.

Php Artisan xếp hàng là gì?

Bạn cũng có thể chạy: Hàng đợi nghệ nhân php: công việc -trên. Điều này sẽ bắt đầu một ví dụ của ứng dụng, xử lý một công việc duy nhất và sau đó giết kịch bản.start an instance of the application, process a single job, and then kill the script.

Làm cách nào để chạy hàng đợi ở Laravel?

3 bước dễ dàng để thực hiện hàng đợi Laravel..
Bước 1: Cấu hình hàng đợi.Laravel cho phép cơ sở định cấu hình hàng đợi với một số trình điều khiển như cơ sở dữ liệu, Beanstalkd, Redis, Amazon, IronMQ, v.v..
Bước 2: Tạo một mẫu email và gửi thư.....
Bước 3: Kiểm tra.....
Công việc điều phối/trì hoãn ..

Làm cách nào để xử lý các công việc thất bại ở Laravel?

Sau khi nhận được danh sách các công việc thất bại, bạn có thể thử lại tất cả các công việc trong một hàng đợi một lần nữa với các phương pháp sau:..
2.1 Thử lại tất cả các công việc thất bại.Nếu bạn muốn đánh lại tất cả các công việc thất bại thì bạn có thể chạy lệnh sau: ....
2.2 Thử lại công việc thất bại với ID.....
2.3 Thử lại các công việc thất bại với nhiều ID ..

Làm thế nào để tôi gọi một công việc ở Laravel?

Mục lục..
Cài đặt Laravel và Cấu hình cơ bản ..
Định cấu hình hàng đợi ..
Tạo một lớp học có khả năng gửi thư ..
Tạo một công việc hàng đợi ..
Gọi công việc hàng đợi ..
Kiểm tra hàng đợi công việc ..