Asked Mar 7th, 2020 12:16 PM 242 0 1
  • 242 0 1
0

Xử lý đa luồng Laravel hoặc dùng Nodejs làm API xử lý!

Share
  • 242 0 1

Đề bài: Ứng dụng web với rất nhiều lần xử lý dữ liệu trong Controller (Laravel). Nhưng mỗi thao tác xử lý lại bị chặn lại bởi thao tác trước do xử lý đồng bộ của PHP. Làm thế nào để xử lý đồng thời nhiều Module dữ liệu cùng một lúc?

Em đã thử sử dụng Nodejs để xử lý dữ liệu và trả về cho Laravel kết quả sau đó mới trả về cho User, tuy nhiên các tác vụ xử lý vẫn không được xử lý đồng thời mà phải chờ tác vụ trước hoàn thành mới tiếp tục tác vụ sau. Mong các anh chị em giúp đỡ

1 ANSWERS


Answered Mar 8th, 2020 5:01 AM
Accepted
+4

Câu trả lời đơn giản nhất là dùng Laravel Queue bạn ơi.

Laravel Queue sẽ đưa mỗi tác vụ cần xử lý vào một Job, các Job này được xử lý riêng nên không ảnh hưởng đến các request khác.

Chi tiết bạn có thể xem tại đây: https://laravel.com/docs/5.8/queues#generating-job-classes

Share
morikun @thanhnguyen
Mar 13th, 2020 1:06 AM

Hình như ý của bạn ấy đang muốn xử lý bất đồng bộ nhiều task 1 lúc. Nếu dùng 1 queue thì nó là đồng bộ rồi. Ý của bạn là tạo nhiều queue phải ko bạn ?

0
| Reply
Share
Nguyen @kenjisaitovn
Mar 15th, 2020 4:32 PM

@thanhnguyen vâng, ý em là bất đồng bộ đó ạ. Ví dụ 1 route cõng khoảng 20 task xử lý khác nhau, thay vì xử lý từng task theo đồng bộ thì xử lý đồng thời 20 task và promise để render kết quả. @hongquanfit e cũng xử lý queue rồi nhưng chỉ dành cho những task xử lý sau kiểu như email hoặc nhận callback sau thôi. Trong PHP7 có thread tuy nhiên laravel em thử áp dụng nhưng không được. Mong các pro chỉ giáo

0
| Reply
Share
morikun @thanhnguyen
Mar 16th, 2020 4:15 AM

@kenjisaitovn Em đã thử nghĩ tới dùng exec... để chạy code đó trong command chưa? Khi dùng exec thì nó sẽ tạo ra 1 process hoàn toàn ko liên quan, nên sẽ giải quyết đc vấn đề 1 thời điểm, chạy nhiều task của em.
Cơ mà còn tùy vào bài toán của em nữa.
Nếu 20 task của em mà task này ko phụ thuộc vào kết quả của task kia, thì có thể dùng nó.

shell_exec(task1);
shell_exec(task2);
shell_exec(task9);
...
shell_exec(task20);

Trong symfony nó có 1 packpage hỗ trợ việc gọi shell này khác hay đó, có thể install thêm vào để dùng trong laravel
E thử tìm lại, ko thì dùng php thuần để call cũng đc

0
| Reply
Share
Mar 16th, 2020 4:15 AM

@kenjisaitovn 20 task thì bạn ném nó vào trong loop, rồi bạn đẩy từng task vào job :v ez mà lúc này bạn sẽ có 20 job, solved!

foreach($tasks as $task) {
    ExecuteTask::dispatch($task);
}

kiểu vậy đó

0
| Reply
Share
Nguyen @kenjisaitovn
Mar 16th, 2020 7:20 AM

@hongquanfit @thanhnguyen thanks 2 anh, em sẽ thử và có kết quả thực nghiệm ạ 😄

0
| Reply
Share