私たちは毎日大量の注文を処理し、それらを処理し、請求、配送ルーティング、将来の注文作成などの他のタスクを実行するUbercartウェブサイトを持っています。
これらのタスクの一部は重いため、PHPがタイムアウトすることがあります。DrushやBatch APIなどを使用してこれらのタスクを実行するより良い方法はありますか?
速度は必ずしも優先事項ではありませんが(ニースではありますが)、タイムアウトの発生を避けたいのです。タイムアウトが発生すると、正しく課金されたり、毎日の注文のスケジュールに問題が発生したりすることがあります。
Drushスクリプトはより良いオプションですか、それともバッチAPIですか?両方をうまく利用するためのチュートリアルはありますか?
バッチ操作がブラウザーに依存しているという事実のために、私はバッチAPIの使用を勧めません。なんらかの理由でブラウザがクラッシュしたり、サーバーとの接続が失われたりすると、バッチ処理が終了しないか、(さらに悪いことに)停止します。実際、PHP=タイムアウトを回避するために、バッチ操作により、ブラウザーはバッチページを定期的にpingします;これは、JavaScriptコードが関係する場合、または関係しない場合(後者の場合、 Drupalは更新メタタグを使用します)。
これらの場合、Drushがおそらくより良い選択です。特定のDrushコマンドを実装するカスタムモジュールを作成したり、Drushがコマンドに使用するディレクトリにコマンドファイルを追加したりできます。
また、カスタム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
「自動生成されたデジタル製品」の重要なバックエンド処理を必要とするD6 Ubercartサイトがあります。私はこれを次のように処理します:
PHP CLIスクリプトを使用せず、PHPによって呼び出されるBASHスクリプトを使用しているin Drupalバックグラウンドで実行します。これらのBASHスクリプトはDrupalデータベースにアクセスし、コンパイルして顧客に送信しているすべての製品の「ステータス」値を進めます。さらに、Drupalは、これらのステータス値を確認し、「カスタム作成プロセス」で購入が現時点で発生している顧客に報告することができます。