API lô hoạt động như thế nào trong nội bộ?


19

Tôi gặp phải vấn đề hết thời gian sử dụng di chuyển vào một ngày khác và bắt đầu tự hỏi làm thế nào Batch API hoạt động nội bộ.

Theo cách hiểu của tôi, đó là ở dạng đơn giản nhất, bạn sẽ vượt qua một mảng các giá trị (ví dụ như không) và một hàm để hoạt động trên các giá trị đó. API lô sau đó xử lý một số lượng cố định các giá trị đó với mỗi yêu cầu cho đến khi hoàn thành.

Khi một lô đang chạy, trang dường như sử dụng các yêu cầu Ajax để hiển thị tiến trình của hoạt động lô (% thực hiện và thông báo). Tôi giả sử nó đợi cho đến khi yêu cầu kết thúc để cập nhật tiến độ và sau đó bắt đầu yêu cầu tiếp theo ngay sau đó?

Nếu trang có yêu cầu lô bị đóng thì xử lý lô có dừng không? Nó sẽ khởi động lại khi cùng một URL được mở lại? Mô-đun di chuyển đôi khi vẫn tiếp tục nhưng có lẽ nó sử dụng hàng đợi?

Câu trả lời:


40

Đây là cách hoạt động của lô (Dựa trên sự hiểu biết của tôi)

1. Khởi tạo

  1. Khởi tạo xử lý hàng loạt. Dựa trên cấu hình máy khách (Trình duyệt) về việc JavaScript có được bật hay không.
  2. Các máy khách hỗ trợ JavaScript được xác định bởi cookie 'has_js' được đặt trong drupal.js. Nếu không có trang hỗ trợ JavaScript nào được truy cập trong phiên trình duyệt hiện tại của người dùng, phiên bản không phải JavaScript được trả về.
  3. Nếu JavaScript được bật Batch sử dụng yêu cầu ajax , hãy giữ kết nối tồn tại trong suốt yêu cầu.
  4. Nếu JavaScript không được bật, Batch sử dụng đặt thẻ meta trong html để tạo các khoảng thời gian làm mới thường xuyên để giữ cho kết nối tồn tại trong suốt yêu cầu.

(Đây là cách thanh tiến trình được cập nhật về tiến trình của Công việc đã hoàn thành.)

Quá trình thực thi

  1. Để bắt đầu quá trình, Batch tạo một Hàng đợi và thêm tất cả các hoạt động (hàm và đối số) mà bạn xác định trong mảng bó như,

    $batch = array (
    'operations' => array(
      array('batch_example_process', array($options1, $options2)),
      array('batch_example_process', array($options3, $options4)),
      ),
    'finished' => 'batch_example_finished',
    'title' => t('Processing Example Batch'),
    'init_message' => t('Example Batch is starting.'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Example Batch has encountered an error.'),
    'file' => drupal_get_path('module', 'batch_example') . '/batch_example.inc',
    );

    Ngoài ra, nó cũng chỉ định một id lô duy nhất trên các lô.

  2. Bây giờ các lệnh gọi Batch lần lượt xác nhận các mục Queue và thực thi hàm được xác định bằng các đối số được xác định trong nó.

  3. Đây là một phần rất quan trọng, Hàm (Hoạt động) thực hiện thao tác bó sẽ xử lý dữ liệu và xử lý dữ liệu rất hiệu quả trong việc giới hạn Bộ nhớ của PHP, Hết giờ . Không làm như vậy sẽ kết thúc trong vấn đề của bạn.

Tôi gặp phải vấn đề hết thời gian sử dụng di chuyển vào một ngày khác và bắt đầu tự hỏi làm thế nào API lô hoạt động trong nội bộ.

Hàm hàng loạt

Các chức năng thực hiện Batch nên thực hiện các điều sau đây rất cẩn thận,

  • Số lượng các mục trong các hoạt động để xử lý như,

    if (!isset($context['sandbox']['progress'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_node'] = 0;
    $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node}'));
    }
  • Giới hạn số lượng mục để xử lý trong một lệnh gọi chức năng như thiết lập giới hạn,

    // For this example, we decide that we can safely process 5 nodes at a time without a timeout.
    $limit = 5;
  • Cập nhật quá trình xử lý hậu kỳ như,

    // Update our progress information.
        $context['sandbox']['progress']++;
        $context['sandbox']['current_node'] = $node->nid;
        $context['message'] = t('Now processing %node', array('%node' => $node->title));
  • Thông báo cho công cụ Batch xem Batch đã hoàn thành hay chưa,

    // Inform the batch engine that we are not finished,
    // and provide an estimation of the completion level we reached.
    if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
      $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
     }

Hầu hết các Điểm trên được chăm sóc bởi các hoạt động hàng loạt của Drupal nếu nó bị thiếu trong chức năng Triển khai. Nhưng nó luôn luôn là tốt nhất để xác định trong chức năng thực hiện

Batch kết thúc cuộc gọi lại

  • Đây là cuộc gọi lại cuối cùng được gọi khi được xác định trong mảng bó Thông thường là một báo cáo về mức độ xử lý, v.v ...

TRẢ LỜI

Nếu trang có yêu cầu lô bị đóng thì xử lý lô có dừng không? Nó sẽ khởi động lại khi cùng một url được mở lại? Mô-đun di chuyển đôi khi vẫn tiếp tục nhưng có lẽ nó sử dụng hàng đợi?

Có, lý tưởng nhất là nên khởi động lại lô và như đã nói ở trên, nó dựa trên chức năng bạn thực hiện.

Để giải quyết vấn đề về thời gian PHP của bạn, hãy sử dụng lô Drush có sẵn trong mô-đun di chuyển, nhưng trước tiên hãy tìm hiểu các hàm bó của di chuyển và cố gắng kiểm tra dữ liệu xử lý của bạn.


1
Tuyệt vời bước qua. Tôi cũng muốn chỉ ra rằng lô đó bắt đầu xử lý trong quá trình, đối với người dùng, ít nhất, dường như là "Đang khởi tạo". màn. Nghĩa là, nếu mất 4 giây để thiết lập và 10 giây để xử lý mục hàng đầu tiên, thì người dùng sẽ thấy quá trình "Đang khởi tạo". trong mười bốn giây trong ví dụ này. Điều này có ý nghĩa bởi vì thông báo màn hình không khởi tạo đầu tiên là "n hoàn thành" sẽ chỉ hoạt động sau khi một số được xử lý. Nếu điều này là sai, xin vui lòng sửa cho tôi!
texas-bronius 7/12/2015

Ngoài ra, từ kinh nghiệm của tôi. Nếu bạn rời khỏi trang, thao tác hàng loạt / khối đang trong quá trình vẫn sẽ tiêu tốn tài nguyên cho đến khi hoàn thành. Nó không bắn ra bất kỳ công việc hàng loạt nào nữa nhưng nó hoàn thành công việc hiện tại.
Elijah Lynn

10

Nếu trang có yêu cầu lô bị đóng thì xử lý lô có dừng không?

Vâng, nó sẽ được dừng lại.

Nó sẽ khởi động lại khi cùng một url được mở lại? Mô-đun di chuyển đôi khi vẫn tiếp tục nhưng có lẽ nó sử dụng hàng đợi?

Như Dinesh nói nó phụ thuộc vào việc thực hiện.

Bạn nên chạy di chuyển bằng cách sử dụng drush, bởi vì

Drush chạy ở dòng lệnh và không chịu bất kỳ giới hạn thời gian nào (đặc biệt, max_execut_time của PHP không áp dụng). Vì vậy, khi bạn bắt đầu một quá trình di chuyển chạy qua drush, nó chỉ đơn giản khởi động và tiếp tục chạy cho đến khi hoàn thành.

Khi chạy các quy trình thông qua giao diện web, PHP max_execut_time (thường là 30 giây nếu không ít hơn) được áp dụng. Do đó, đối với các quy trình chạy dài, chúng ta cần sử dụng API Batch, quản lý việc chia nhỏ một quy trình qua nhiều yêu cầu. Vì vậy, quá trình di chuyển sẽ khởi động, chạy trong 25 giây hoặc lâu hơn, sau đó dừng lại và để API Batch đưa ra yêu cầu trang mới, trong đó quá trình di chuyển được khởi động lại, quảng cáo vô hạn.

Vì vậy, hiểu rằng, tại sao Drush tốt hơn?

Nó nhanh hơn

API Batch giới thiệu rất nhiều chi phí - tắt và khôi phục các yêu cầu trang, quá trình di chuyển cần phải chạy lại tất cả các hàm tạo cần thiết, các kết nối cơ sở dữ liệu được thiết lập lại và truy vấn chạy lại, v.v. Và, để nhập một phần, nó cần phải chọn lên nơi nó rời đi - nếu 500 bản ghi nguồn đầu tiên đã được nhập, nó cần tìm bản ghi thứ 501. Tùy thuộc vào định dạng nguồn của bạn và cách nó được xây dựng, điều này có thể mở rộng hoặc không - nếu bạn đang sử dụng nhãn hiệu nước cao với nguồn SQL, bản thân truy vấn có thể loại bỏ các bản ghi trước đó và bắt đầu ngay tại nơi bạn rời đi. Nếu không, thì Di chuyển cần cuộn qua dữ liệu nguồn tìm kiếm bản ghi không được nhập đầu tiên. Với, giả sử, một tệp XML lớn làm nguồn của bạn,

Nó đáng tin cậy hơn

Chạy di chuyển thông qua trình duyệt của bạn thêm máy tính để bàn của bạn và kết nối Internet cục bộ của bạn, là điểm thất bại. Một trục trặc mạng khi API hàng loạt đang chuyển sang yêu cầu trang tiếp theo, sự cố trình duyệt, việc vô tình đóng tab hoặc cửa sổ sai có thể làm gián đoạn quá trình di chuyển của bạn. Chạy trong drush làm giảm các bộ phận chuyển động - bạn loại bỏ máy tính để bàn và kết nối Internet cục bộ làm yếu tố.

Nó hữu ích hơn

Nếu có lỗi xảy ra khi chạy trong Drush, nếu có bất kỳ thông báo lỗi hữu ích nào bạn sẽ thấy chúng. Lỗi sử dụng API hàng loạt thường bị nuốt chửng và tất cả những gì bạn thấy là hoàn toàn vô dụng "Một yêu cầu AJAX HTTP bị chấm dứt một cách bất thường. Thông tin gỡ lỗi theo sau. Đường dẫn: / batch? Id = 901 & op = do StatusText: FeedbackText: ReadyState: 4".

Bạn có thể tìm thêm thông tin về điều này ở đây .

Trong thời gian chờ đợi nếu bạn muốn chạy lô ngay cả khi cửa sổ trình duyệt bị đóng, hãy xem xét mô-đun Process Process . Nó có một Batch nền mô hình con thực hiện thủ thuật.

Các mô-đun này tiếp quản API hàng loạt hiện có và chạy các công việc hàng loạt trong một quy trình nền. Điều này có nghĩa là nếu bạn rời khỏi trang bó, công việc sẽ tiếp tục và bạn có thể quay lại chỉ báo tiến độ sau đó.


wow, sử dụng drush để di chuyển đã tạo ra một sự cải thiện lớn. Tôi phải di chuyển vào một trang web trực tiếp và nó tải ít hơn rất nhiều vào hệ thống! Cảm ơn bạn!
uwe

0

Hiểu kỹ về Batch API và các mô-đun này sẽ giúp bạn:

1- Progerss Đây là một nỗ lực để thực hiện một khung chung để theo dõi mọi tiến trình

2- Tiến trình nền chiếm lấy API hàng loạt hiện có và chạy các công việc hàng loạt trong một quá trình nền

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.