Viết kịch bản? Hoặc API hàng loạt?


8

Chúng tôi có một trang web Ubercart xử lý khối lượng đơn đặt hàng lớn hàng ngày, xử lý chúng và chạy các tác vụ khác như thanh toán, định tuyến giao hàng và tạo đơn hàng trong tương lai.

Một số trong những nhiệm vụ này rất nặng nề và đôi khi khiến PHP hết thời gian. Có cách nào tốt hơn để chạy các tác vụ này như thông qua Drush hoặc Batch API không?

Tốc độ không nhất thiết là ưu tiên (mặc dù tốt), nhưng chúng tôi muốn tránh thời gian chờ, điều này đôi khi có thể gây ra sự cố với thanh toán chính xác và lên lịch các đơn đặt hàng hàng ngày.

Tập lệnh Drush có phải là lựa chọn tốt hơn hay Batch API không? Có hướng dẫn nào để sử dụng tốt hơn cả hai không?

Câu trả lời:


13

Tôi sẽ không đề xuất sử dụng API hàng loạt, đơn giản vì thực tế là các hoạt động hàng loạt phụ thuộc vào trình duyệt; nếu vì bất kỳ lý do nào trình duyệt gặp sự cố hoặc mất kết nối với máy chủ, các hoạt động hàng loạt sẽ không chấm dứt hoặc (tệ hơn) chúng sẽ bị treo. Trong thực tế, để tránh thời gian chờ của PHP, các hoạt động hàng loạt khiến trình duyệt ping trang hàng loạt theo chu kỳ; đó là những gì xảy ra, bất cứ khi nào có mã JavaScript, hoặc không (trong trường hợp sau, Drupal sử dụng thẻ meta refresh).

Trong những trường hợp này, Drush có lẽ là một lựa chọn tốt hơn; bạn có thể tạo một mô-đun tùy chỉnh thực hiện các lệnh Drush cụ thể hoặc chỉ cần thêm một tệp lệnh trong thư mục mà Drush sử dụng cho các lệnh của nó.


2
Bổ sung để drush bạn thực sự cũng có thể sử dụng một hàng đợi để có được nhiều mặt hàng chạy cùng một lúc.
Daniel Wehner

2

Ngoài ra, bạn có thể sử dụng tập lệnh PHP CLI tùy chỉnh. Đây là một ví dụ đơn giản cho 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
Vấn đề ở đây là bạn đang phát minh lại cái bánh xe. Drush là sự lựa chọn tốt hơn vì nó sẽ thực hiện loại điều này và khuôn khổ đã sẵn sàng!
Chris Cohen

1
Tôi không muốn cài đặt drush trên tất cả các máy chủ mà tôi muốn làm gì đó.
ya.teck

2
Có một lý do tại sao? nó cũng chuyên sâu như cài đặt bất kỳ mô-đun nào khác.

Tôi đã làm nó nhiều lần và tôi nghĩ phương pháp này dễ dàng hơn một chút.
ya.teck

1

Tôi có một trang web D6 Ubercart yêu cầu xử lý back-end đáng kể cho 'sản phẩm kỹ thuật số được tạo tự động'. Tôi xử lý việc này qua:

  1. Mua một trong những sản phẩm kỹ thuật số tùy chỉnh này gây ra mục nhập bảng db cho 'sản phẩm cần được biên dịch.' Trong mục db đó là trường 'trạng thái'.
  2. Một tập lệnh BASH được bắt đầu từ bên trong Drupal chạy trong nền. Kịch bản này là 'tái nhập', nghĩa là nó nhận thức được việc được gọi trong khi chạy và thêm tác phẩm mới vào bất kỳ tác phẩm hiện có nào chưa được hoàn thành.
  3. Tập lệnh BASH này tăng trường 'trạng thái' trong cơ sở dữ liệu Drupal khi sản phẩm kỹ thuật số tùy chỉnh được tạo và cuối cùng, một thông báo email được gửi đến người dùng bằng liên kết tải xuống cho sản phẩm tùy chỉnh đã hoàn thành của họ.

Đây là một giải pháp hơi giống với giải pháp do Xio đề xuất, ngoại trừ việc này không sử dụng tập lệnh CLI PHP, nhưng tập lệnh BASH được PHP gọi trong Drupal để chạy trong nền. Các tập lệnh BASH đó truy cập vào cơ sở dữ liệu Drupal và nâng cao giá trị 'trạng thái' của bất kỳ sản phẩm nào mà nó đang biên dịch và gửi cho khách hàng. Thêm vào đó, Drupal có thể thấy các giá trị trạng thái này và báo cáo lại cho người quản lý nơi trong 'quy trình tạo tùy chỉnh' việc mua hàng của họ xảy ra vào lúc này.

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.