急脚本?还是批处理API?


8

我们有一个Ubercart网站,该网站每天处理大量订单,进行处理并运行其他任务,例如开票,交货路线和将来的订单创建。

其中一些任务很繁重,有时会导致PHP超时。是否有更好的方法来运行这些任务,例如通过Drush或Batch API?

速度不一定是优先事项(尽管不错),但是我们要避免超时,因为超时有时会导致正确计费和安排每日订单的问题。

Drush脚本是更好的选择还是Batch API?是否有任何教程可以更好地利用两者?

Answers:


13

我不建议仅使用批处理API,因为批处理操作取决于浏览器。如果由于某种原因浏览器崩溃或失去与服务器的连接,批处理操作将不会终止,或者(更糟糕的)它们将被挂起。实际上,为避免PHP超时,批处理操作会导致浏览器每隔一段时间ping通批处理页面。无论是否涉及JavaScript代码,都会发生这种情况(在以后的情况下,Drupal使用refresh meta标签)。

在这些情况下,Drush可能是更好的选择。您可以创建实现特定Drush命令的自定义模块,也可以仅在Drush用于其命令的目录中添加命令文件。


2
除了匆忙之外,您实际上还可以使用队列来同时运行多个项目。
丹尼尔·威纳

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是更好的选择,因为它已经可以做这种事情并且框架已经就位!
克里斯·科恩

1
我不喜欢在要执行某些操作的所有服务器上安装drush。
ya.teck 2011年

2
有什么理由吗?它与安装任何其他模块一样密集。

我做了很多次,我认为这种方法要容易一些。
ya.teck 2011年

1

我有一个D6 Ubercart网站,需要对“自动生成的数字产品”进行大量的后端处理。我通过以下方式处理:

  1. 购买这些定制数字产品之一将导致“需要编译的产品”的数据库表条目。在该数据库条目中有一个“状态”字段。
  2. BASH脚本从Drupal内部启动,并在后台运行。该脚本是“可重入的”脚本,表示它知道在运行时会被调用,并将新工作添加到尚未完成的任何现有工作中。
  3. 创建定制的数字产品时,此BASH脚本会增加Drupal数据库中的“状态”字段,最后,电子邮件通知将发送给用户,并带有完整的定制产品的下载链接。

这与Xio提出的解决方案有点类似,不同之处在于它不使用PHP CLI脚本,而是使用PHP在Drupal中调用的BASH脚本在后台运行。这些BASH脚本访问Drupal数据库并提高其正在编译并发送给客户的任何产品的“状态”值。另外,Drupal能够查看这些状态值,并向客户报告当前在“自定义创建过程”中他们所购买的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.