Làm thế nào hàng loạt hoạt động xung quanh thời gian chờ PHP


9

Tài liệu Drupal 7 giới thiệu Batch API như:

Các hàm cho phép xử lý biểu mẫu được trải đều trên một số yêu cầu trang, do đó đảm bảo rằng quá trình xử lý không bị gián đoạn do hết thời gian PHP ...

Tôi lấy điều này có nghĩa là Batch xử lý các vấn đề liên quan đến thời gian chờ cho nhà phát triển.

Tuy nhiên, các bài đăng khác (ví dụ: API lô hoạt động như thế nào trong nội bộ? ) Ngụ ý rằng trách nhiệm của nhà phát triển là phải nói với Batch bao nhiêu công việc phải làm trước khi chờ người dùng khác đến và Batch được gọi lại --- do đó tránh được hết giờ.

Nếu điều sau là đúng thì tôi cho rằng Batch không đảm bảo rằng các công việc sẽ không bị hết thời gian. Batch có cung cấp bất kỳ đảm bảo? Có phải nhà phát triển sẽ đoán Batch có thể xử lý bao nhiêu trước khi hết thời gian không?

Cảm ơn bạn!


3
Đây là một câu hỏi khá hay, cảm ơn bạn :-)
Chapabu

Câu trả lời:


5

Batch chỉ đơn giản nói "Tôi sẽ làm N số thứ (nhiều nhất) và sau đó làm mới trang ... và làm nhiều hơn nữa."

Nếu bạn nói làm 5 mục trên mỗi khối công việc thì mất 5 giây, bạn sẽ ổn với giá trị thời gian chờ php mặc định là 30 giây.

Nếu bạn nói làm 20 mục cho mỗi khối công việc mất 5 giây mỗi lần, khối lượng công việc cho mỗi yêu cầu của bạn quá cao và có thể sẽ hết thời gian chờ.

Hãy nhớ khi trong PHP của bạn vòng đời của một trang là request in -> response out. Và máy chủ web của bạn giữ cho mỗi luồng tồn tại trong một khoảng thời gian hữu hạn. Bạn phải làm việc trong khoảng thời gian chờ đó - điều mà Batch API giúp bạn làm.

Chạy mọi thứ từ Drush, phía máy chủ sử dụng các mô-đun cộng đồng như Migrate có thể giúp bạn tránh hoàn toàn thời gian chờ nếu cần.

BIÊN TẬP

Cũng nên nhớ rằng mỗi yêu cầu trang là một bootstrap đầy đủ và API Batch chọn ra ở nơi nó rời đi. Đó là một trong những hoạt động tốn kém nhất khi sử dụng API hàng loạt, tải lại drupal mỗi N mục. Đó là lý do tại sao mọi người đã làm việc trên các kỹ thuật phía máy chủ để tạo các nút, nhập nội dung, v.v. API hàng loạt rất tốt cho các tác vụ đơn giản, lặp đi lặp lại. Nhưng nó có xu hướng sụp đổ trong các tập dữ liệu phức tạp hoặc rất rất lớn.


1
Bạn đang nói rằng Batch được gọi trên mỗi lần tải trang; I E. Batch thức dậy để xem nếu có bất kỳ nhiệm vụ (như cron của poorman)? Điều này đã bị nghi ngờ; tuy nhiên, tôi không hiểu tại sao bạn nhấn mạnh chi phí tính toán của quy trình. Không phải chi phí bổ sung chỉ là một vài so sánh và bất cứ công việc nào Batch có trong hàng đợi của nó hay Batch đang làm điều gì đó đặc biệt như tự gọi bằng cách tải một trang?
Máy nướng bánh mì

1
xem câu trả lời kiamlaluno dưới đây. Một trang thanh tiến trình hàng loạt chỉ cần tải lại chính nó sau X giây. Nếu bạn tải lên Firebird hoặc Chrome trong tab Mạng và chạy công việc API hàng loạt, hãy xem các URL và bạn sẽ chỉ thấy cùng một trang được gọi với các mức bù khác nhau và kích cỡ khối. Chi phí tính toán của bootstrapping tất cả các drupal mỗi yêu cầu trang là CAO. Chạy một nhập khẩu Drush sql tải drupal chỉ một lần, ví dụ. Đối với các bộ dữ liệu lớn và các vấn đề, chi phí API hàng loạt trở nên quá cao.
tenken

3

API hàng loạt chỉ cần đăng ký _batch_shutdown()là chức năng tắt máy với register_shutdown_function(). Hàm đó chỉ lưu trong bảng cơ sở dữ liệu trạng thái hiện tại của lô đang được thực thi.
API Batch không cung cấp bất kỳ đảm bảo nào rằng hoạt động bạn đang thực hiện không bị gián đoạn ở giữa. Đó là lý do tại sao các hoạt động hàng loạt thường thực hiện các hoạt động đơn giản như đọc một hàng cơ sở dữ liệu từ việc lưu một bảng và lưu một hàng cơ sở dữ liệu trong một bảng khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.