Hapus 13000 node

9

Saya memiliki sekitar 13000 node untuk dihapus di situs Drupal 7. Saya telah mencoba modul Operasi Massal Views untuk menghapus 500 node sekaligus, tetapi waktu habis. Saya hanya dapat menghapus 50 node secara bersamaan.

Bagaimana saya bisa menghapus lebih dari 50 node sekaligus?

chaithanya
sumber
Dulu ada modul "hapus massal", tetapi menjadi usang karena VBO suatu hari nanti. Tetapi VBO tampaknya mendukung pemrosesan batch. Sudahkah Anda mencoba menggunakannya?
Mołot
1
VBO, seperti ditunjukkan dalam jawaban di bawah ini, mungkin adalah cara yang harus ditempuh. Apa yang telah saya lakukan pada saat perlu menghapus node lebih banyak daripada dalam kasus ini, adalah modul hack dipanggil untuk mengabaikan banyak permintaan kait yang tidak saya butuhkan. (Pelaku terburuk saya adalah apache solr). Ini secara signifikan dapat mempercepat pekerjaan, tetapi jelas harus dilakukan dengan sangat hati-hati.
Letharion

Jawaban:

16

VBO adalah standar de facto untuk node penghapusan massal, tidak ada cara yang lebih baik untuk melakukannya.

Saat VBO memproses dalam batch, ia hanya mengerjakan 1 (atau mungkin beberapa) node sekaligus. Jadi, jika Anda menerima kesalahan batas waktu yang terkait dengan penghapusan satu node, bukan ke seluruh operasi batch.

Resolusi standar untuk sesuatu seperti ini adalah untuk menambah waktu eksekusi PHP max untuk mengkompensasi.

Clive
sumber
2
Hanya untuk melengkapi jawabannya: Anda dapat memilih berapa banyak entitas yang harus diambil untuk operasi. Menggunakan 100 akan baik-baik saja dalam ~ 1 menit dari pengalaman saya.
AyeshK
7

Instal Devel. Lalu pergi ke admin / config / development / generate / content di D7 dan pilih semua jenis konten. Centang "Hapus Semua konten". Masukkan 0 pada "Berapa banyak node yang ingin Anda hasilkan?"

Klik Hasilkan.

Itu akan menghapus semua node.

AGA
sumber
1
@ Mołot ' Periksa "Hapus Semua konten" ' ... 'Masukkan 0 di "Berapa banyak node yang ingin Anda hasilkan?"' ...;)
Clive
@Clive OK, kesalahan saya, maaf.
Mołot
1
Khususnya, modul Devel Generate yang melakukan ini; itu dikirimkan bersama Devel, tetapi Anda tidak akan mendapatkan fungsionalitas ini jika Anda cukup mengaktifkan Devel. Anda juga dapat dengan mudah menghapus semua node dari jenis konten tertentu dengan cara ini, jika Anda tidak ingin menghapus semuanya. Jika Anda masih mendapatkan batas waktu PHP dan tidak takut pada CLI, Anda juga dapat menggunakan perintah Drush generate-content( genc) yang datang dengan Devel Generate; drush help gencuntuk info penggunaan.
Garrett Albright
3

Gunakan VBO dan jalankan dari Drush. Saya menggunakan metode berikut untuk menghapus lebih dari 1,5 juta node setelah pengujian skala.

  1. Buat tampilan baru dengan halaman. Atur filter dengan tepat untuk hanya menampilkan jenis node yang ingin Anda hapus.
  2. Tambahkan bidang baru: "Operasi massal: Konten"
  3. Centang kotak di sebelah "Hapus item" di bawah 'Operasi massal pilihan'.
  4. Simpan tampilan.
  5. Dengan asumsi Anda tahu cara menggunakan Drush, jalankan perintah ini: (Gunakan 'layar' linux untuk menjalankan tanpa gangguan untuk dataset besar)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

Di mana, my_view adalah nama mesin dari tampilan Anda

Anda juga dapat menggunakan daftar drush vbo untuk menampilkan semua tampilan yang tersedia dan operasi massal mereka.

VBO sekarang harus dijalankan di shell, memberikan Anda umpan balik.

davewilly
sumber
2

Ada modul Delete All di luar sana. Ini akan menghapus semua node dan / atau pengguna dari situs.

Ini juga memiliki dukungan Drush:

Contoh:

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.
Ajit
sumber
7
Saya sangat menyarankan untuk tidak menggunakan modul ini - ia menetapkan batas waktu 30 detik pada skrip, dan berjalan melalui masing - masing dan setiap node secara individual , memanggil node_delete()(bahkan tidak perlu repot-repot untuk menggunakan node_delete_multiple()). Yang lebih mengkhawatirkan lagi, ia memiliki opsi yang menghapus data langsung dari tabel basis data tanpa menggunakan API bidang, dan tanpa menggunakan kait. Tidak ada pekerjaan batch sama sekali, itu hanya berjalan sampai script mati. IMHO modul yang sangat berbahaya.
Clive
2
Masih bisa berguna jika Anda tahu apa yang Anda lakukan, dan mengambil cadangan. Menghapus ribuan node sambil memohon semua hook dan apis bisa sangat lambat. :(
Letharion
@Letharion Tanpa rasa sakit, tanpa untung;) Anda benar tentu saja, saya pikir saya sebaiknya menampar penafian tentang hal ini karena modul ini dapat membuat segalanya berantakan jika berada di tangan yang salah!
Clive
@Clive Dengan dukungan drush jika saya lakukan drush delete-all articleuntuk menghapus artikel saya akan pergi untuk solusi ini.
AjitS
@develkar Untuk beberapa ratus node yang mungkin baik-baik saja, tetapi ekstensi drush menggunakan fungsi yang persis sama dengan versi di tempat sehingga sayangnya masih rentan terhadap timeout sayangnya
Clive
0

Untuk menghapus node dalam jumlah besar (yaitu bulk) seperti dalam kasus Anda, Anda juga dapat menggunakan modul Delete massal untuk ini.

Itu akan menggunakan Batch API untuk menghapus node untuk menghindari masalah timeout atau memori ketika menghapus ribuan node dengan satu panggilan ke node_delete_multiple ().

Terlepas dari ini, Anda bahkan dapat mencoba Hapus semua modul untuk menghapus semua node dari jenis konten.

Semoga ini membantu.

neetu morwani
sumber
0

Anda juga dapat membuat proses batch untuk itu menggunakan BATCH API dan dalam proses batch itu lakukan saja

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

Itu dia. Anda selesai di sini. Jika Anda ingin membuat perintah drush untuknya, Anda juga bisa membuatnya. Untuk referensi silakan lihat ini .

Deepak Kumar
sumber
0

Jika Anda memiliki alasan untuk melakukannya dengan kode:

$query = new EntityFieldQuery();

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

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

Anda juga memiliki banyak metode lain yang tersedia untuk memilih node yang akan dihapus.

Bobik
sumber
0

Anda dapat mengambil saran Bobik dan memberi makan itu sebagai argumen 'drush php-eval' jika Anda benar-benar dalam keadaan darurat, tetapi saya berharap bahwa kinerjanya akan mirip dengan VBO, sementara menjadi sedikit lebih cepat. Jika kinerjanya benar-benar lambat, Anda mungkin ingin melihat modul apa yang memanggil hook_node_delete dengan menjepret basis kode untuk '_node_delete (' dan kemudian menentukan apakah Anda dapat menonaktifkan beberapa modul yang menggunakan kait itu atau tidak.

Emmanuel Buckshi
sumber