Drush Scripting? Veya Toplu API?


8

Günlük olarak büyük hacimli siparişleri işleyen, işleyen ve faturalandırma, teslimat yönlendirme ve gelecekteki sipariş oluşturma gibi diğer görevleri yürüten bir Ubercart web sitemiz var.

Bu görevlerden bazıları ağırdır ve bazen PHP'nin zaman aşımına uğramasına neden olur. Drush veya Batch API gibi bu görevleri yürütmenin daha iyi bir yolu var mı?

Hız (her ne kadar hoş olsa da) bir öncelik olmak zorunda değildir, ancak bazen doğru faturalandırma ve günlük siparişleri planlama ile ilgili sorunlara neden olabilecek zaman aşımlarından kaçınmak istiyoruz.

Drush komut dosyası daha iyi bir seçenek mi, yoksa Toplu API mı? Her ikisini de daha iyi kullanmak için herhangi bir öğretici var mı?

Yanıtlar:


13

Ben toplu iş işlemleri tarayıcıdan bağlı olduğu gerçeği için, toplu iş API kullanmanızı tavsiye etmem; herhangi bir nedenle tarayıcı çökerse veya sunucuyla bağlantıyı kaybederse, toplu işlemler sonlandırılmaz veya (daha da kötüsü) asılı kalır. Aslında, PHP zaman aşımlarından kaçınmak için, toplu işlemler tarayıcının toplu sayfaya aralıklarla ping atmasına neden olur; JavaScript kodu dahil olduğunda veya olmasa da bu olur (sonraki durumda Drupal, yenileme meta etiketini kullanır).

Bu durumlarda, Drush muhtemelen daha iyi bir seçimdir; belirli Drush komutlarını uygulayan özel bir modül oluşturabilir veya Drush'ın komutları için kullandığı dizine bir komut dosyası ekleyebilirsiniz.


2
Drush'a ek olarak, aynı anda birden fazla öğeyi çalıştırmak için bir kuyruk da kullanabilirsiniz.
Daniel Wehner

2

Ayrıca özel PHP CLI betiği de kullanabilirsiniz. Drupal 7 için basit bir örnek:

#!/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
Buradaki sorun, tekerleği yeniden icat etmenizdir. Drush daha iyi bir seçim çünkü zaten bu tür şeyleri yapacak ve çerçeve zaten mevcut!
Chris Cohen

1
Bir şey yapmak istediğim tüm sunuculara drush yüklemek istemiyorum.
ya.teck

2
Bunun bir nedeni var mı? diğer herhangi bir modülü kurmak kadar yoğundur.

Bunu birçok kez yapıyordum ve bence bu yöntem biraz daha kolay.
ya.teck

1

'Otomatik oluşturulan dijital ürünler' için önemli bir arka uç işleme gerektiren bir D6 Ubercart sitem var. Bunu şu şekilde hallederim:

  1. Bu özel dijital ürünlerden birinin satın alınması 'derlenmesi gereken ürünler' için bir db tablo girdisine neden olur. Bu db girişinde bir 'durum' alanıdır.
  2. Arka planda çalışan Drupal içinden bir BASH betiği başlatılır. Bu komut dosyası yeniden girilir, yani çalışırken çağrıldığının farkındadır ve yeni işi henüz tamamlanmak üzere mevcut herhangi bir çalışmaya ekler.
  3. Bu BASH betiği, özel bir dijital ürün oluşturulurken Drupal veritabanındaki 'durum' alanını artırır ve son olarak kullanıcıya tamamlanmış özel ürünleri için indirme bağlantısı içeren bir e-posta bildirimi gönderilir.

Bu, bir PHP CLI komut dosyası kullanmadığı, ancak Drupal'da PHP tarafından arka planda çalışması için çağrılan BASH komut dosyaları dışında, Xio tarafından önerilene biraz benzer bir çözümdür. Bu BASH betikleri Drupal veritabanına erişir ve derlediği ve müşterilere gönderdiği tüm ürünlerin 'durum' değerlerini yükseltir. Ayrıca, Drupal bu durum değerlerini görebilir ve 'özel oluşturma sürecinde' satın alımlarının şu anda gerçekleştiği müşterilere rapor verebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.