Toplu iş API'si dahili olarak nasıl çalışır?


19

Geçen gün geçiş kullanarak bir zaman aşımı sorunu koştu ve Toplu API dahili nasıl çalıştığını merak etmeye başladı .

Anladığım kadarıyla, en basit haliyle bir değer dizisi (örneğin nids) ve bu değerler üzerinde çalışmak için bir işlev geçireceksiniz. Toplu iş API'sı daha sonra, her bir istekle bu değerlerin sabit bir sayısını bitene kadar işler.

Bir toplu iş çalışırken sayfa, toplu işlemin ilerlemesini göstermek için Ajax isteklerini kullanıyor gibi görünüyor (% tamamlandı ve iletiler). İstek ilerlemeyi güncellemek ve daha sonra hemen bir sonraki isteği başlatmak bitene kadar beklediğini varsayıyorum?

Toplu iş isteğine sahip sayfa kapatılırsa toplu işleme durur mu? Aynı URL tekrar açıldığında yeniden başlayacak mı? Migrate modülü bazen devam ediyor ama muhtemelen kuyruk kullanıyor mu?

Yanıtlar:


40

Toplu iş şu şekilde çalışır (Anladığımı temel alarak)

1. Başlat

  1. Toplu işlemeyi başlatın. JavaScript'in etkin olup olmadığı istemcilerinin (Tarayıcılar) yapılandırmasına dayanır.
  2. JavaScript etkin istemciler drupal.js'de ayarlanan 'has_js' çerezi tarafından tanımlanır. Geçerli kullanıcının tarayıcı oturumu sırasında JavaScript etkin bir sayfa ziyaret edilmediyse, JavaScript olmayan sürüm döndürülür.
  3. Eğer JavaScript Toplu kullanımlarını ajax isteği karşısında canlı bağlantı tutmak isteyebilir.
  4. Eğer JavaScript etkin değil Toplu kullandığı düzenlemeniz meta etiketi yapmak için html içinde düzenli yenileme aralıklarını talep karşısında canlı bağlantı tutmak.

(İş Çubuğu İşi'nin ilerleyişinde ilerleme çubuğu bu şekilde güncellenir.)

Toplu işlem

  1. İşlemi başlatmak için, Batch bir Kuyruk oluşturur ve toplu iş dizisinde tanımladığınız tüm işlemleri (işlevler ve bağımsız değişkenler) ekler ,

    $batch = array (
    'operations' => array(
      array('batch_example_process', array($options1, $options2)),
      array('batch_example_process', array($options3, $options4)),
      ),
    'finished' => 'batch_example_finished',
    'title' => t('Processing Example Batch'),
    'init_message' => t('Example Batch is starting.'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Example Batch has encountered an error.'),
    'file' => drupal_get_path('module', 'batch_example') . '/batch_example.inc',
    );

    Ayrıca, gruplar arasında benzersiz olan bir toplu iş kimliği atar.

  2. Şimdi Toplu çağrılar, Kuyruk öğelerini tek tek talep eder ve içinde tanımlanan bağımsız değişkenlerle tanımlanan işlevi yürütür.

  3. Bu çok önemli bir parçadır, Toplu işlemi uygulayan işlev (Operasyon), verileri yığınlamalı ve verileri PHP'nin Bellek sınırı olan Zaman Aşımı'nı göz önünde tutarak çok verimli bir şekilde işlemelidir . Bunu yapmamanız, sorununuzla sonuçlanacaktır.

Geçen gün geçiş kullanarak bir zaman aşımı sorunu ile karşılaştı ve toplu API dahili olarak nasıl çalıştığını merak etmeye başladı.

Toplu İş Fonksiyonu

Batch'i uygulayan işlevler aşağıdakileri çok dikkatli bir şekilde almalıdır,

  • İşlemler dahilinde işlenecek Kalem Sayısı,

    if (!isset($context['sandbox']['progress'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_node'] = 0;
    $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node}'));
    }
  • Sınır belirlemek gibi bir işlev çağrısında işlenecek öğe sayısını sınırlamak,

    // For this example, we decide that we can safely process 5 nodes at a time without a timeout.
    $limit = 5;
  • İşlem sonrası süreçte güncelleme,

    // Update our progress information.
        $context['sandbox']['progress']++;
        $context['sandbox']['current_node'] = $node->nid;
        $context['message'] = t('Now processing %node', array('%node' => $node->title));
  • Toplu iş motoruna Toplu işin tamamlanıp tamamlanmadığını bildirmek,

    // Inform the batch engine that we are not finished,
    // and provide an estimation of the completion level we reached.
    if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
      $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
     }

Yukarıdaki Noktaların çoğu, Drupal'ın Çekirdek toplu işlemlerinde, Uygulama işlevinde kaçırılırsa halledilir. Ancak uygulama işlevinde tanımlamak her zaman en iyisidir

Toplu İşlem Geri Arama Tamamlandı

  • Bu, toplu iş dizisinde tanımlandığında geri çağrılan son çağrıdır.

YANITLAR

Toplu iş isteğine sahip sayfa kapatılırsa toplu işleme durur mu? Aynı url tekrar açıldığında yeniden başlayacak mı? Migrate modülü bazen devam ediyor ama muhtemelen kuyruk kullanıyor mu?

Evet, İdeal olarak grubu yeniden başlatmalı ve yukarıda belirtildiği gibi uyguladığınız işleve dayanmaktadır.

İçin sorunu çözmek geçirmek modülünde mevcuttur kullanımı Drush toplu dışarı PHP Time, Ama önce işleme verileri taşı en toplu fonksiyonlarını kazmak ve yığın deneyin.


1
Müthiş gözden geçirme. Ayrıca, toplu işin en azından kullanıcıya "Başlatılıyor" olarak göründüğü sırada işlemeye başladığını belirtmek isterim. ekran. Yani, ilk toplu öğeyi ayarlamak 4 saniye ve 10 saniye sürerse, kullanıcı "Başlatılıyor" işlemini görür. bu örnekte on dört saniye boyunca. İlk init olmayan ekran mesajı "n tamamlandı", çünkü bu sadece bazıları işlendikten sonra işe yarayacaktır. Bu yanlışsa, lütfen beni düzeltin!
texas-bronius

Ayrıca, deneyimlerimden. Sayfadan ayrılırsanız, devam eden toplu işlem / yığın tamamlanıncaya kadar kaynakları tüketecektir. Artık toplu işten çıkmaz ancak geçerli işi tamamlar.
Elijah Lynn

10

Toplu iş isteğine sahip sayfa kapatılırsa toplu işleme durur mu?

Evet, durdurulacak.

Aynı url tekrar açıldığında yeniden başlayacak mı? Migrate modülü bazen devam ediyor ama muhtemelen kuyruk kullanıyor mu?

Dinesh dediği gibi bu uygulama bağlıdır.

Göçü drush kullanarak çalıştırmalısınız, çünkü

Drush komut satırında çalışır ve herhangi bir zaman sınırlamasına tabi değildir (özellikle PHP'nin max_execution_time geçerli değildir). Bu nedenle, drush ile çalışan bir taşıma işlemini başlattığınızda, basitçe başlar ve bitene kadar çalışmaya devam eder.

İşlemleri bir web arayüzü üzerinden çalıştırırken, PHP max_execution_time (genellikle daha az değilse 30 saniye) geçerlidir. Bu nedenle, uzun süren işlemler için, bir işlemin birden fazla istekte dağılmasını yöneten Batch API'sini kullanmamız gerekir. Bu nedenle, bir taşıma işlemi başlayacak, 25 saniye kadar çalışacak ve daha sonra Batch API'sının taşıma işleminin yeniden başlatıldığı yeni bir sayfa isteği yayınlamasına izin verilecek.

Peki, bunu anlamak, neden Drush daha iyi?

O daha hızlı

Toplu İş API'sı çok fazla genel gider sunar - sayfa isteklerini kapatır ve yeniden çağırır, taşıma işleminin tüm gerekli kuruculardan geçmesi, veritabanı bağlantıları yeniden kurulur ve sorgular yeniden çalıştırılır, vb. kaldığı yerden devam edin - ilk 500 kaynak kaydı içe aktarılmışsa, 501'inci kaydı bulması gerekir. Kaynak biçiminize ve nasıl yapılandırıldığına bağlı olarak, bu ölçeklendirilebilir veya ölçeklendirilemez - SQL kaynağıyla yüksek su işaretleri kullanıyorsanız, sorgunun kendisi önceki kayıtları ortadan kaldırabilir ve kaldığınız yerden başlayabilir. Değilse, Migrate uygulamasının içe aktarılmayan ilk kaydı arayan kaynak verilerde gezinmesi gerekir. Diyelim ki kaynağınız olarak büyük bir XML dosyası,

Daha güvenilir

Taşıma işlemlerini tarayıcınız üzerinden gerçekleştirmek, masaüstünüzü ve yerel İnternet bağlantınızı bir hata noktası olarak ekler. Batch API bir sonraki sayfa isteğine geçerken bir ağ hatası, bir tarayıcı çökmesi, yanlış sekmenin veya pencerenin yanlışlıkla kapatılması taşıma işleminizi kesintiye uğratabilir. Hızlı çalışma hareketli parçaları azaltır - masaüstü ve yerel İnternet bağlantınızı faktör olarak ortadan kaldırırsınız.

Daha yararlı

Drush'ta çalışırken bir şeyler ters giderse, yararlı hata mesajları varsa bunları görürsünüz. Toplu İş API'sı kullanılarak yapılan hatalar genellikle yutulur ve yalnızca "AJAX HTTP isteği olağandışı bir şekilde sonlandırılır. Hata ayıklama bilgileri aşağıdadır. Yol: / batch? İd = 901 & op = do StatusText: ResponseText: ReadyState: 4".

Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .

Bu arada, tarayıcı penceresi kapalı olsa bile toplu işi çalıştırmak istiyorsanız, Arka Plan İşlem modülünü göz önünde bulundurun . Hile yapan bir alt modül Arkaplan Toplu var.

Bu modüller mevcut Toplu İş API'sını devralır ve toplu işleri arka plan işleminde çalıştırır. Bu, toplu iş sayfasından ayrılırsanız, işlerin devam edeceği ve daha sonra ilerleme göstergesine dönebileceğiniz anlamına gelir.


vay, göç etmek için drush kullanarak büyük bir gelişme sağladı. Canlı bir siteye geçmek zorundayım ve sisteme çok daha az yük bindiriyor! Teşekkür ederim!
uwe

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.