เขียนสคริปต์ Drush? หรือ Batch API


8

เรามีเว็บไซต์ Ubercart ที่จัดการคำสั่งซื้อจำนวนมากทุกวันประมวลผลและดำเนินงานอื่น ๆ เช่นการเรียกเก็บเงินการกำหนดเส้นทางการจัดส่งและการสร้างคำสั่งซื้อในอนาคต

งานเหล่านี้บางงานหนักและบางครั้งทำให้ PHP หมดเวลา มีวิธีที่ดีกว่าในการทำงานเหล่านี้เช่นผ่าน Drush หรือ Batch API?

ความเร็วไม่จำเป็นต้องเป็นลำดับความสำคัญ (แม้ว่าจะดี) แต่เราต้องการหลีกเลี่ยงการหมดเวลาซึ่งบางครั้งอาจทำให้เกิดปัญหากับการเรียกเก็บเงินอย่างถูกต้องและการกำหนดเวลาการสั่งซื้อรายวัน

สคริปต์ Drush เป็นตัวเลือกที่ดีกว่าหรือ Batch API หรือไม่ มีแบบฝึกหัดใดที่จะใช้ประโยชน์ได้ดีกว่า

คำตอบ:


13

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

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


2
นอกเหนือจากการดื่มเหล้าคุณสามารถใช้คิวในการเรียกใช้หลายรายการพร้อมกันได้
Daniel Wehner

2

นอกจากนี้คุณอาจใช้สคริปต์ PHP CLI ที่กำหนดเอง นี่เป็นตัวอย่างง่ายๆสำหรับ drupal 7:

#!/usr/bin/php
<?php
echo "Ubercart tasks\n===================\n";

$_SERVER['HTTP_HOST']       = 'default';
$_SERVER['PHP_SELF']        = '/index.php';
$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
$_SERVER['SERVER_SOFTWARE'] = NULL;
$_SERVER['REQUEST_METHOD']  = 'GET';
$_SERVER['QUERY_STRING']    = '';
$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
$_SERVER['HTTP_USER_AGENT'] = 'console';

define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//-------------------------------------------

// Place your code here

4
ปัญหาที่นี่คือคุณกำลังสร้างวงล้อใหม่ Drush เป็นตัวเลือกที่ดีกว่าเพราะมันจะทำสิ่งนี้อยู่แล้วและกรอบก็มีอยู่แล้ว!
Chris Cohen

1
ฉันไม่ชอบติดตั้ง drush บนเซิร์ฟเวอร์ทั้งหมดที่ฉันต้องการทำบางสิ่ง
ya.teck

2
มีเหตุผลทำไม? มันเกี่ยวกับความเข้มข้นเท่ากับการติดตั้งโมดูลอื่น ๆ

ฉันทำมันหลายครั้งและฉันคิดว่าวิธีนี้ง่ายขึ้นเล็กน้อย
ya.teck

1

ฉันมีไซต์ D6 Ubercart ที่ต้องการการประมวลผลส่วนหลังที่สำคัญสำหรับ 'ผลิตภัณฑ์ดิจิตอลที่สร้างขึ้นอัตโนมัติ' ฉันจัดการสิ่งนี้ผ่าน:

  1. การซื้อหนึ่งในผลิตภัณฑ์ดิจิทัลที่กำหนดเองเหล่านี้ทำให้รายการตาราง db สำหรับ 'ผลิตภัณฑ์ที่ต้องรวบรวม' ในรายการ db นั้นเป็นฟิลด์ 'สถานะ'
  2. สคริปต์ BASH เริ่มต้นจากภายใน Drupal ที่ทำงานในพื้นหลัง สคริปต์นี้เป็น 'ผู้เข้าร่วมอีกครั้ง' ซึ่งหมายถึงการรับรู้ถึงการถูกเรียกใช้ในขณะที่ทำงานและเพิ่มงานใหม่ให้กับงานที่มีอยู่ซึ่งยังไม่แล้วเสร็จ
  3. สคริปต์ BASH นี้จะเพิ่มฟิลด์ 'สถานะ' ในฐานข้อมูล Drupal เมื่อสร้างผลิตภัณฑ์ดิจิทัลที่กำหนดเองและในที่สุดก็มีการส่งอีเมลแจ้งเตือนไปยังผู้ใช้พร้อมลิงก์ดาวน์โหลดสำหรับผลิตภัณฑ์ที่กำหนดเองที่สมบูรณ์

นี่เป็นวิธีแก้ปัญหาที่ค่อนข้างคล้ายกับที่เสนอโดย Xio ยกเว้นว่านี่ไม่ได้ใช้สคริปต์ PHP CLI แต่สคริปต์ BASH ที่ PHP ใน Drupal เรียกใช้นั้นทำงานในพื้นหลัง สคริปต์ BASH เหล่านั้นเข้าถึงฐานข้อมูลของ Drupal และล่วงหน้า 'ค่าสถานะ' ของผลิตภัณฑ์ใด ๆ ที่กำลังรวบรวมและส่งให้กับลูกค้า นอกจากนี้ Drupal ยังสามารถดูค่าสถานะเหล่านี้และรายงานกลับไปยังผู้ดูแลซึ่งใน 'กระบวนการสร้างที่กำหนดเอง' การซื้อของพวกเขาเกิดขึ้นในขณะนี้

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