Yêu cầu thg 4 18, 2022 2:54 SA 301 0 4
  • 301 0 4
0

[PHP] Làm thế nào xử lý 1 vòng lặp for dài bên trong chứa các câu query ?

Chia sẻ
  • 301 0 4

Hi All.

Mình đang gặp 1 vấn đề như sau mong dc sự tư vấn giúp đỡ:

Sau khi submit Mình có 1 function doQuery() để xử lý và insert dữ liệu vào 1 bảng .Nó nằm trong 1 vòng lặp for khoảng hơn 10k dòng.

Và vấn đề xảy ra là thời gian thực thi quá dài nên bị lỗi phía mysql.

  • Mình đã thử tăng thời gian này lên vài phút nhưng nó ko đủ và có vẻ cũng là 1 cách ko hay lắm khi đưa code cho người khác dùng dạng plugin.

  • Mình đã thử chia nhỏ bằng cách ghép các câu truy vấn lại rồi thực 1 lần 100 cái nhưng vì 1 dòng data có dung lượng khá lớn cho nên nó ra lỗi về bộ nhớ không đủ.

Không biết có bạn nào có kinh nghiệm xử lý giúp đỡ mình với a. Xin cảm ơn.

4 CÂU TRẢ LỜI


Đã trả lời thg 4 18, 2022 8:29 SA
+2

Bạn nên xây dựng thêm service queue-job riêng để đẩy những nghiệp vụ tốn nhiều thời gian vào queue (hàng đợi) và chạy ngầm. Không biết bạn dùng PHP thuần hay đang dùng framework nào không nhỉ? Như Laravel thì có built-in hệ thống queue-job để dùng luôn rồi.

Chia sẻ
Avatar TAMIX @tuananhbfs
thg 4 20, 2022 1:19 SA

Mình đang thử viết 1 cái plugin wordpress. Cám ơn bạn đã trả lời.

Đã trả lời thg 4 18, 2022 3:55 SA
+1

Mình nghĩ nên decouple hệ thống sử dụng queue job cho tác vụ tốn nhiều thời gian như TH insert 10k dòng của bạn.

Chia sẻ
Avatar TAMIX @tuananhbfs
thg 4 20, 2022 1:20 SA

cám ơn b . mình sẽ tìm hiểu thử.

Đã trả lời thg 4 22, 2022 2:37 SA
+1

Nếu là C# thì nó sẽ có dataset để lưu vào (Dataset như 1 bảng tạm thời vậy ) mình chưa thử bên php bao giờ nhưng đây là ý tưởng của mình . Bạn cho nó lưu vào bảng phụ nó sẽ ở dạng offline và khi insert vào sẽ không đụng bất kỳ gì trên server . Bạn có thể tìm hiểu thêm

Chia sẻ
Avatar TAMIX @tuananhbfs
thg 4 22, 2022 3:09 SA

Cám ơn b. Tại mình dùng 1 số hàm tương tác db của wordpress nên chắc là ko dùng các kỹ thuật cảu mysql dc. Mình tìm hướng xử lý bằng php.

Đã trả lời thg 5 16, 2022 10:31 SA
0

Không biết ở client làm nhiệm vụ xử lý gì mà tạo ra 10k row nhỉ, vì nhiều như vậy bên client dễ bị lag Tuy nhiên với spec như của bạn mình nghĩ nên gửi lên server dạng file thay vì text, BE lưu lại rồi dùng job bên BE insert dần dần

Chia sẻ
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í