13000 düğümü sil


9

Bir Drupal 7 sitesinde silinecek yaklaşık 13000 düğümüm var. Bir seferde 500 düğümü silmek için Views Bulk Operations modülünü denedim , ancak zaman aşımına uğradı. Aynı anda yalnızca 50 düğümü silebilirim.

Aynı anda 50'den fazla düğümü nasıl silebilirim?


"Toplu silme" modülü vardı, ama VBO anwyay lehine eski var. Ancak VBO, toplu işlemeyi destekliyor gibi görünüyor. Kullanmaya çalıştınız mı?
Mołot

1
VBO, aşağıdaki cevaplarda belirtildiği gibi, muhtemelen gidilecek yoldur. Bu durumda olduğundan daha fazla düğüm silmeye ihtiyaç duyduğum zamanlarda yaptığım şey, hack modülü ihtiyacım olmayan birçok kanca çağrısını görmezden gelmektir. (En kötü suçlum apache solr idi). Bu işi önemli ölçüde hızlandırabilir, ancak açık bir şekilde büyük bir dikkatle yapılmalıdır.
Letharion

Yanıtlar:


16

VBO, toplu silme düğümleri için fiili standarttır, bunu yapmanın daha iyi bir yolu yoktur.

VBO gruplar halinde işlerken, aynı anda sadece 1 (veya belki bir çift) düğüm yapar. Dolayısıyla , tüm toplu işlemle değil, tek bir düğümün silinmesiyle ilgili zaman aşımı hataları alıyorsanız .

Bunun gibi bir şeye standart çözüm , telafi etmek için PHP maksimum yürütme süresini artırmaktır .


2
Cevabı tamamlamak için: Operasyon için kaç kişinin alınacağını seçebilirsiniz. 100 kullanmak benim deneyim ~ 1 dakika içinde iyi yapacak.
AyeshK

7

Devel'i yükleyin. Ardından D7'de admin / config / development / create / content adresine gidin ve tüm içerik türünü seçin. "Tüm içeriği sil" seçeneğini işaretleyin. "Kaç tane düğüm oluşturmak istiyorsunuz?" Alanına 0 girin.

Oluştur'u tıklayın.

Bu, tüm düğümleri silecektir.


1
@ Mołot ' "Tüm içeriği sil" ' i kontrol edin " ... " "Kaç tane düğüm oluşturmak istiyorsunuz?" Alanına 0 girin ... " ...;)
Clive

@Clive tamam, benim hatam, üzgünüm.
Mołot

1
Özellikle bunu yapan Devel Generate modülü; Devel ile birlikte gelir, ancak Devel'i etkinleştirirseniz bu işlevselliği elde edemezsiniz. Ayrıca , her şeyi silmek istemiyorsanız, belirli bir içerik türünün tüm düğümlerini bu şekilde kolayca silebilirsiniz . Hala PHP zaman aşımları alıyorsanız ve CLI'den korkmuyorsanız , Devel Generate ile birlikte gelen Drush generate-content( genc) komutunu da kullanabilirsiniz ; drush help genckullanım bilgisi için.
Garrett Albright

3

Bir VBO kullanın ve Drush'tan çalıştırın. Ölçek testinden sonra 1,5 milyondan fazla düğümü silmek için aşağıdaki yöntemi kullandım.

  1. Sayfa ile yeni bir görünüm oluşturun. Filtreleri yalnızca silmek istediğiniz düğüm türlerini gösterecek şekilde ayarlayın.
  2. Yeni bir alan ekleyin: "Toplu işlemler: İçerik"
  3. 'Seçili toplu işlemler' altındaki "Öğeyi sil" in yanındaki kutuyu işaretleyin.
  4. Görünümü kaydedin.
  5. Drush'ı nasıl kullanacağınızı bildiğinizi varsayarsak, bu komutu çalıştırın: (Büyük veri kümeleri için kesintisiz çalıştırmak için bir linux 'ekranı' kullanın)

drbo vbo-execute my_view eylem :: views_bulk_operations_delete_item

Nerede, my_view sizin bakış makine adıdır

Ayrıca, kullanılabilir tüm görünümleri ve toplu işlemlerini görüntülemek için drush vbo-listesini kullanabilirsiniz.

VBO şimdi kabukta çalışmalı ve size geri bildirimde bulunmalıdır.


2

Orada bir Tümünü Sil modülü var. Siteden tüm düğümleri ve / veya kullanıcıları silecektir.

Ayrıca Drush desteği var:

Örnekler:

drush delete-all article             Delect all article nodes.  
drush delete-all all                 Delete nodes of all types.  
drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.  
drush delete-all users               Delete users.

7
Bu modülü kullanmamanızı şiddetle tavsiye ederim - komut dosyasında 30 saniyelik bir zaman sınırı belirler ve her düğümü ayrı ayrı çalışarak çağırır node_delete()(kullanmak bile zahmet etmez node_delete_multiple()). Daha da endişe verici bir şekilde, alan API'sini kullanmadan ve kanca kullanmadan verileri doğrudan veritabanı tablolarından silen bir seçenek vardır. Hiçbir toplu iş yok, sadece komut dosyası ölene kadar çalışır. Çok tehlikeli modül IMHO.
Clive

2
Ne yaptığınızı biliyorsanız ve yedekler alırsanız yine de faydalı olabilir. Tüm kancaları ve apileri çağırırken binlerce düğümü silmek acı verici bir şekilde yavaş olabilir. :(
Letharion

@ Letharion Acı yok, kazanç yok;) Tabii ki haklısın, bu modülün yanlış ellerde dağınık olmasına neden olabileceğinden, bu konuda bir feragatname daha iyi tokatlasam iyi olur!
Clive

@Clive Sıkı destek drush delete-all articleile makaleleri silmek için yaparsam bu çözüm için gitmek istiyorum.
AjitS

@develkar İyi olabilecek birkaç yüz düğüm için, ancak drush uzantısı yerinde sürümle tamamen aynı işlevleri kullanıyor, bu yüzden hala ne yazık ki zaman aşımlarına karşı duyarlı
Clive


0

Sizin durumunuzda olduğu gibi çok sayıda (yani toplu) düğümleri silmek için bunun için Toplu silme modülünü de kullanabilirsiniz .

Bu, tek bir node_delete_multiple () çağrısıyla binlerce düğümü silerken zaman aşımı veya bellek sorunlarından kaçınmak için düğümleri silmek için Toplu API'yı kullanacaktır.

Bunun dışında , bir içerik türünün tüm düğümlerini silmek için Tüm modülü sil seçeneğini de deneyebilirsiniz .

Bu yardımcı olur umarım.


0

BATCH API'sını kullanarak toplu işlem de oluşturabilirsiniz ve bu toplu işlemde

foreach($nodes as $node){ node_delete($node[nid]);}

Bu kadar. Burada işiniz bitti. Bunun için bir drush komutu oluşturmak istiyorsanız, bunu da oluşturabilirsiniz. Başvuru için lütfen bakmak bu .


0

Kodla yapmak için nedeniniz varsa:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->propertyOrderBy('nid', 'DESC')
  ->range(1000, 1000);

$result = $query->execute();
node_delete_multiple(array_keys($result['node']));

Silinecek düğümleri seçmek için başka birçok yönteminiz de var .


0

Bobik'in tavsiyesini alabilir ve gerçekten bir çimdik iseniz 'drush php-eval' argümanı olarak besleyebilirsiniz, ancak biraz daha hızlı olurken performansın VBO'nunkine benzer olmasını beklerim. Performans gerçekten yavaşsa, '_node_delete (' için kod tabanını açarak ve sonra o kancayı kullanan modüllerden bazılarını devre dışı bırakıp bırakamayacağınızı belirleyerek hangi modüllerin hook_node_delete adını verdiğine bakmak isteyebilirsiniz.

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.