batch API ทำงานอย่างไรภายใน


19

ฉันพบปัญหาการหมดเวลาโดยใช้การโยกย้ายในวันก่อนและเริ่มสงสัยว่าBatch APIทำงานอย่างไรภายใน

วิธีที่ฉันเข้าใจก็คือในรูปแบบที่ง่ายที่สุดคุณจะผ่านอาร์เรย์ของค่า (ตัวอย่างเช่น nids) และฟังก์ชันเพื่อทำงานกับค่าเหล่านั้น batch API นั้นจะประมวลผลจำนวนค่าเหล่านั้นกับแต่ละคำขอจนกว่าจะเสร็จสิ้น

เมื่อชุดทำงานหน้าดูเหมือนว่าจะใช้คำขอ Ajax เพื่อแสดงความคืบหน้าของการดำเนินงานแบทช์ (% เสร็จแล้วและข้อความ) ฉันถือว่ามันรอจนกว่าคำขอจะเสร็จสิ้นเพื่ออัปเดตความคืบหน้าจากนั้นเริ่มคำขอถัดไปทันทีหลังจากนั้นหรือไม่

ถ้าเพจที่มีการร้องขอแบตช์ถูกปิดการประมวลผลชุดจะหยุดหรือไม่ มันจะเริ่มต้นใหม่เมื่อเปิด URL เดียวกันอีกครั้งหรือไม่ บางครั้งโมดูลโอนย้ายยังคงดำเนินต่อไป แต่อาจใช้คิวหรือไม่

คำตอบ:


40

นี่คือวิธีการทำงานของแบทช์ (จากความเข้าใจของฉัน)

1. เริ่มต้น

  1. เริ่มต้นการประมวลผลแบทช์ ขึ้นอยู่กับการกำหนดค่าไคลเอนต์ (เบราว์เซอร์) ว่าเปิดใช้งาน JavaScript หรือไม่
  2. ไคลเอนต์ที่เปิดใช้งาน JavaScript ถูกระบุโดยชุดคุกกี้ 'has_js' ใน drupal.js หากไม่มีการเยี่ยมชมเพจที่เปิดใช้งาน JavaScript ในระหว่างเซสชันเบราว์เซอร์ของผู้ใช้ปัจจุบันเวอร์ชันที่ไม่ใช่ JavaScript จะถูกส่งคืน
  3. หากเปิดใช้งาน JavaScriptแบทช์ใช้คำขอajaxทำให้การเชื่อมต่อยังคงอยู่ตลอดการร้องขอ
  4. หากไม่ได้เปิดใช้งาน JavaScriptแบทช์จะใช้การตั้งค่าเมตาแท็กใน html เพื่อให้ช่วงเวลาการรีเฟรชเป็นระยะเพื่อให้การเชื่อมต่อยังคงอยู่ตลอดการร้องขอ

(นี่คือวิธีที่แถบความคืบหน้าได้รับการปรับปรุงเกี่ยวกับความคืบหน้าของงานที่ทำ)

กระบวนการแบทช์

  1. สำหรับการเริ่มต้นกระบวนการแบทช์จะสร้างคิวและเพิ่มการดำเนินการทั้งหมด(ฟังก์ชั่นและอาร์กิวเมนต์)ที่คุณกำหนดในชุดแบตช์เช่น

    $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',
    );

    นอกจากนี้ยังกำหนดรหัสแบตช์ที่ไม่ซ้ำกันในแต่ละแบทช์

  2. ตอนนี้การเรียกแบทช์จะเรียกร้องรายการคิวทีละรายการและดำเนินการฟังก์ชันที่กำหนดด้วยอาร์กิวเมนต์ที่กำหนดไว้ในนั้น

  3. นี้เป็นส่วนสำคัญ, ฟังก์ชั่นการ (ปฏิบัติการ) ที่ดำเนินการดำเนินการชุดควรก้อนข้อมูลและประมวลผลข้อมูลได้อย่างมีประสิทธิภาพมากการรักษาในใจของPHP วงเงินหน่วยความจำหมดเวลา การไม่ทำเช่นนั้นจะทำให้ปัญหาของคุณจบ

ฉันพบปัญหาหมดเวลาโดยใช้การโยกย้ายในวันก่อนและเริ่มสงสัยว่า API ของชุดงานทำงานภายในได้อย่างไร

ฟังก์ชั่นแบทช์

ฟังก์ชั่นที่ใช้แบทช์ควรทำสิ่งต่อไปนี้อย่างระมัดระวัง

  • จำนวนรายการภายในการดำเนินการที่จะดำเนินการเช่น

    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}'));
    }
  • จำกัด จำนวนรายการที่จะดำเนินการในการเรียกใช้ฟังก์ชันเดียวเช่นการตั้งค่าขีด จำกัด

    // For this example, we decide that we can safely process 5 nodes at a time without a timeout.
    $limit = 5;
  • อัปเดตกระบวนการเพื่อประมวลผลภายหลังเช่น

    // Update our progress information.
        $context['sandbox']['progress']++;
        $context['sandbox']['current_node'] = $node->nid;
        $context['message'] = t('Now processing %node', array('%node' => $node->title));
  • แจ้งให้เครื่องยนต์ทราบว่าแบทช์นั้นเสร็จสมบูรณ์หรือไม่ชอบ

    // 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'];
     }

คะแนนข้างต้นส่วนใหญ่ได้รับการดูแลการดำเนินงานหลักของ Drupal หากไม่ได้รับในฟังก์ชันการนำไปใช้งาน แต่เป็นการดีที่สุดที่จะกำหนดไว้ในฟังก์ชั่นการใช้งาน

รุ่นที่โทรกลับเสร็จแล้ว

  • นี่คือการโทรกลับครั้งสุดท้ายที่เรียกว่าเมื่อกำหนดไว้ในชุดอาร์เรย์มักจะรายงานจำนวนการประมวลผล ฯลฯ ...

คำตอบ

ถ้าเพจที่มีการร้องขอแบตช์ถูกปิดการประมวลผลชุดจะหยุดหรือไม่ มันจะรีสตาร์ทหรือไม่เมื่อมีการเปิด URL เดียวกันอีกครั้ง บางครั้งโมดูลโอนย้ายยังคงดำเนินต่อไป แต่อาจใช้คิวหรือไม่

ใช่โดยหลักแล้วมันควรเริ่มต้นชุดใหม่และตามที่กล่าวไว้ข้างต้นโดยขึ้นอยู่กับฟังก์ชันที่คุณใช้

เพื่อแก้ปัญหา PHP Time out ของคุณให้ใช้ Drush batch ซึ่งมีอยู่ในโมดูลโยกย้าย แต่ก่อนอื่นให้ขุดฟังก์ชัน batch ของ Migrate แล้วลองประมวลผลข้อมูลของคุณ


1
การเดินเล่นที่ยอดเยี่ยม ฉันต้องการจะชี้ให้เห็นว่าแบตช์เริ่มการประมวลผลระหว่างสิ่งที่ผู้ใช้อย่างน้อยดูเหมือนจะเป็น "การเริ่มต้น" จอภาพ นั่นคือถ้าใช้เวลา 4 วินาทีในการตั้งค่าและ 10 วินาทีในการประมวลผลรายการชุดแรกผู้ใช้จะเห็นกระบวนการ "กำลังเริ่มต้น" เป็นเวลาสิบสี่วินาทีในตัวอย่างนี้ สิ่งนี้สมเหตุสมผลเนื่องจากข้อความบนหน้าจอที่ไม่ใช่ init แรกคือ "เสร็จสมบูรณ์" ซึ่งจะทำงานหลังจากที่มีการประมวลผลแล้ว หากสิ่งนี้ผิดโปรดแก้ไขฉัน!
texas-bronius

นอกจากนี้จากประสบการณ์ของฉัน หากคุณออกจากหน้าการดำเนินการแบทช์ / ก้อนที่อยู่ในกระบวนการจะยังคงใช้ทรัพยากรจนกว่าจะเสร็จสมบูรณ์ มันไม่ได้เป็นการไล่ออกจากงานแบทช์อีกต่อไป แต่มันจะเสร็จสมบูรณ์ในปัจจุบัน
เอลียาห์ลินน์

10

ถ้าเพจที่มีการร้องขอแบตช์ถูกปิดการประมวลผลชุดจะหยุดหรือไม่

ใช่มันจะหยุด

มันจะรีสตาร์ทหรือไม่เมื่อมีการเปิด URL เดียวกันอีกครั้ง บางครั้งโมดูลโอนย้ายยังคงดำเนินต่อไป แต่อาจใช้คิวหรือไม่

ดัง Dinesh กล่าวว่ามันขึ้นอยู่กับการใช้งาน

คุณควรใช้การโยกย้ายโดยใช้ drush เพราะ

Drush ทำงานที่บรรทัดคำสั่งและไม่อยู่ภายใต้การ จำกัด เวลาใด ๆ (โดยเฉพาะอย่างยิ่ง max_execution_time ของ PHP ไม่ได้ใช้) ดังนั้นเมื่อคุณเริ่มกระบวนการโยกย้ายที่ทำงานผ่าน drush ก็จะเริ่มขึ้นและทำงานต่อไปจนกว่าจะเสร็จ

เมื่อรันกระบวนการผ่านเว็บอินเตอร์เฟส PHP max_execution_time (โดยทั่วไปจะใช้เวลา 30 วินาทีถ้าไม่น้อยกว่า) ดังนั้นสำหรับกระบวนการที่ต้องใช้เวลานานเราจำเป็นต้องใช้ Batch API ซึ่งจัดการการแยกย่อยของกระบวนการในหลาย ๆ คำขอ ดังนั้นกระบวนการโยกย้ายจะเริ่มต้นขึ้นทำงานเป็นเวลา 25 วินาทีหรือมากกว่านั้นจากนั้นหยุดและปล่อยให้ Batch API ออกคำขอหน้าใหม่ซึ่งกระบวนการโยกย้ายจะเริ่มต้นใหม่อีกครั้ง

ดังนั้นเข้าใจว่าทำไม Drush ถึงดีกว่า

มันเร็วกว่า

Batch API นำเสนอค่าใช้จ่ายจำนวนมาก - การปิดและเรียกซ้ำการร้องขอหน้ากระบวนการโยกย้ายต้องทำงานผ่านตัวสร้างที่จำเป็นทั้งหมดอีกครั้งการเชื่อมต่อฐานข้อมูลที่สร้างขึ้นใหม่และเรียกใช้แบบสอบถามอีกครั้งและสำหรับการนำเข้าบางส่วนจะต้องเลือก ที่เหลือค้างไว้ - หากมีการนำเข้า 500 ระเบียนแรกของแหล่งข้อมูลนั้นจำเป็นต้องค้นหาระเบียน 501 ขึ้นอยู่กับรูปแบบของแหล่งที่มาและวิธีการสร้างของคุณสิ่งนี้อาจปรับขนาดได้หรือไม่ - หากคุณใช้เครื่องหมาย highwater กับแหล่งที่มาของ SQL แบบสอบถามนั้นสามารถกำจัดระเบียนก่อนหน้าและเริ่มต้นทันทีที่คุณออก ถ้าไม่เช่นนั้นการโยกย้ายจำเป็นต้องเลื่อนดูแหล่งข้อมูลเพื่อค้นหาระเบียนที่ไม่ได้นำเข้าครั้งแรก ด้วยพูดไฟล์ XML ขนาดใหญ่เป็นแหล่งที่มาของคุณ

มันน่าเชื่อถือมากขึ้น

การเรียกใช้การย้ายข้อมูลผ่านเบราว์เซอร์ของคุณจะเพิ่มเดสก์ท็อปของคุณและการเชื่อมต่ออินเทอร์เน็ตในพื้นที่ของคุณเนื่องจากเป็นจุดที่ล้มเหลว ความผิดพลาดของเครือข่ายเมื่อ Batch API เคลื่อนไปยังหน้าถัดไปคำขอเกิดความผิดพลาดของเบราว์เซอร์การปิดแท็บหรือหน้าต่างผิดโดยไม่ตั้งใจอาจทำให้การย้ายข้อมูลของคุณขัดจังหวะได้ การทำงานใน drush จะช่วยลดส่วนที่เคลื่อนไหวได้ - คุณกำจัดเดสก์ท็อปและการเชื่อมต่ออินเทอร์เน็ตในพื้นที่เป็นปัจจัย

มันมีประโยชน์มากกว่า

หากมีข้อผิดพลาดเกิดขึ้นขณะทำงานใน Drush หากมีข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์คุณจะเห็นข้อความเหล่านั้น ความล้มเหลวในการใช้ Batch API มักจะถูกกลืนลงไปและสิ่งที่คุณได้เห็นก็คือการที่ไร้ประโยชน์อย่างสมบูรณ์ "คำขอ AJAX HTTP ถูกยกเลิกอย่างผิดปกติข้อมูลการดีบักจะตามมาเส้นทาง: / batch? id = 901 & op = do StatusText: ReadyState: 4"

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่

ในระหว่างนี้หากคุณต้องการเรียกใช้แบตช์แม้ว่าจะปิดหน้าต่างเบราว์เซอร์ก็ตามให้พิจารณาโมดูลการประมวลผลในเบื้องหลัง มันมีชุดพื้นหลัง submodule ซึ่งไม่หลอกลวง

โมดูลนี้ใช้แทน Batch API ที่มีอยู่และรันงานแบ็ตช์ในกระบวนการพื้นหลัง ซึ่งหมายความว่าหากคุณออกจากหน้าแบตช์งานจะดำเนินต่อไปและคุณสามารถกลับไปที่ตัวบ่งชี้ความคืบหน้าในภายหลัง


ว้าวใช้การโยกย้ายเพื่อทำการปรับปรุงอย่างมาก ฉันต้องย้ายไปยังเว็บไซต์ที่ใช้งานอยู่และมันทำให้โหลดน้อยลงสู่ระบบ! ขอขอบคุณ!
Uwe

0

เข้าใจBatch API อย่างละเอียดและโมดูลเหล่านี้จะช่วยคุณ:

1- Progerssนี่คือความพยายามที่จะใช้กรอบทั่วไปสำหรับการติดตามความคืบหน้าใด ๆ

2- ความคืบหน้าเบื้องหลังจะใช้เวลานานกว่า Batch API ที่มีอยู่และรันงานแบ็ตช์ในกระบวนการแบ็คกราวน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.