Yêu cầu thg 3 7, 2020 12:16 CH 849 0 1
  • 849 0 1
0

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

Chia sẻ
  • 849 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 CÂU TRẢ LỜI


Đã trả lời thg 3 8, 2020 5:01 SA
Đã được chấp nhận
+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

Chia sẻ
Avatar morikun @thanhnguyen
thg 3 13, 2020 1:06 SA

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 ?

Avatar Nguyen @kenjisaitovn
thg 3 15, 2020 4:32 CH

@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

Avatar morikun @thanhnguyen
thg 3 16, 2020 4:15 SA

@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

thg 3 16, 2020 4:15 SA

@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 đó

Avatar Nguyen @kenjisaitovn
thg 3 16, 2020 7:20 SA

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí