ลบ 13000 โหนด


9

ฉันมีประมาณ 13,000 โหนดที่จะลบในเว็บไซต์ Drupal 7 ฉันได้ลองใช้โมดูลViews Bulk Operationsเพื่อลบ 500 โหนดในแต่ละครั้ง แต่หมดเวลา ฉันสามารถลบได้ครั้งละ 50 โหนดเท่านั้น

ฉันจะลบมากกว่า 50 โหนดในเวลาได้อย่างไร


เคยมีโมดูล "การลบจำนวนมาก" แต่ล้าสมัยในความโปรดปรานของ VBO anwyay แต่ดูเหมือนว่า VBO จะสนับสนุนการประมวลผลแบบกลุ่ม คุณเคยลองใช้มันหรือยัง?
Mołot

1
VBO ตามที่ระบุไว้ในคำตอบด้านล่างอาจเป็นวิธีที่จะไป สิ่งที่ฉันทำในเวลาที่ต้องการลบโหนดที่มีขนาดมากกว่าในกรณีนี้คือโมดูลแฮ็กจะเรียกใช้เพื่อเพิกเฉยต่อการร้องขอ hooks จำนวนมากที่ฉันไม่ต้องการ (ผู้กระทำผิดที่เลวร้ายที่สุดของฉันคือ apache solr) สิ่งนี้สามารถเร่งงานได้อย่างเห็นได้ชัด แต่ต้องทำด้วยความระมัดระวัง
Letharion

คำตอบ:


16

VBO เป็นมาตรฐานตามความเป็นจริงสำหรับการลบโหนดจำนวนมากไม่มีวิธีที่ดีกว่าที่จะทำ

เมื่อกระบวนการ VBO ทำงานแบบแบตช์มันจะทำการโหนดเพียงครั้งละ 1 (หรือสองสามครั้ง) เท่านั้น ดังนั้นหากคุณได้รับข้อผิดพลาดการหมดเวลาซึ่งเกี่ยวข้องกับการลบโหนดเดียวไม่ใช่การดำเนินการแบบกลุ่มทั้งหมด

ความละเอียดมาตรฐานของบางอย่างเช่นนี้คือการเพิ่มเวลาดำเนินการ PHP สูงสุดเพื่อชดเชย


2
เพียงทำคำตอบให้สมบูรณ์: คุณสามารถเลือกได้ว่าจะเลือกเอนทิตีจำนวนเท่าใดสำหรับการดำเนินการ การใช้ 100 จะทำได้ดีในเวลาประมาณ 1 นาที
AyeshK

7

ติดตั้ง Devel จากนั้นไปที่ผู้ดูแลระบบ / กำหนดค่า / พัฒนา / สร้าง / เนื้อหาใน D7 และเลือกประเภทเนื้อหาทั้งหมด ทำเครื่องหมายที่ "ลบเนื้อหาทั้งหมด" ป้อน 0 ใน "คุณต้องการสร้างกี่โหนด"

คลิกสร้าง

นั่นจะลบโหนดทั้งหมด


1
@ Mołot ' ตรวจสอบ "ลบเนื้อหาทั้งหมด" ' ... 'ป้อน 0 ใน "คุณต้องการสร้างกี่โหนด?"' ... ;)
Clive

@ Clive ตกลงความผิดของฉันขอโทษ
Mołot

1
โดยเฉพาะมันคือโมดูล Devel Generate ที่ทำสิ่งนี้ มันมาพร้อมกับ Devel แต่คุณจะไม่ได้รับฟังก์ชั่นนี้ถ้าคุณเพียงแค่เปิดใช้งาน Devel นอกจากนี้คุณยังสามารถลบโหนดทั้งหมดของเนื้อหาบางประเภทได้อย่างง่ายดายหากคุณไม่ต้องการลบทุกอย่าง หากคุณยังคงได้รับ PHP หมดเวลาและไม่กลัว CLI คุณสามารถใช้คำสั่งDrush generate-content( genc) ที่มาพร้อมกับ Devel Generate drush help gencสำหรับข้อมูลการใช้งาน
การ์เร็ตต์ไบรท์

3

ใช้ VBO และดำเนินการจาก Drush ฉันใช้วิธีการต่อไปนี้เพื่อลบโหนดมากกว่า 1.5 ล้านโหนดหลังจากการทดสอบในระดับ

  1. สร้างมุมมองใหม่ด้วยเพจ ตั้งค่าตัวกรองอย่างเหมาะสมเพื่อแสดงเฉพาะประเภทของโหนดที่คุณต้องการลบ
  2. เพิ่มฟิลด์ใหม่: "การดำเนินการเป็นกลุ่ม: เนื้อหา"
  3. ทำเครื่องหมายที่ช่องถัดจาก "ลบรายการ" ใต้ "การดำเนินการเป็นกลุ่มที่เลือก"
  4. บันทึกมุมมอง
  5. สมมติว่าคุณรู้วิธีใช้ Drush ให้เรียกใช้คำสั่งนี้: (ใช้ 'หน้าจอ' ของ linux เพื่อเรียกใช้ชุดข้อมูลขนาดใหญ่อย่างต่อเนื่อง)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

โดยที่my_viewคือชื่อเครื่องในมุมมองของคุณ

คุณยังสามารถใช้drush vbo-listเพื่อแสดงมุมมองที่มีอยู่ทั้งหมดและการใช้งานแบบกลุ่ม

ตอนนี้ VBO ควรทำงานในเชลล์ให้คำติชมตามที่คุณต้องการ


2

มีโมดูลลบทั้งหมดออก มันจะลบโหนดและ / หรือผู้ใช้ทั้งหมดออกจากเว็บไซต์

นอกจากนี้ยังมีการสนับสนุน Drush:

ตัวอย่าง:

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
ฉันขอแนะนำอย่างยิ่งว่าอย่าใช้โมดูลนี้ - ตั้งค่าการ จำกัด เวลา 30 วินาทีในสคริปต์และดำเนินการผ่านแต่ละโหนดทุกโหนดโดยเรียกnode_delete()(มันไม่ได้รบกวนการใช้งานnode_delete_multiple()) ยิ่งไปกว่านั้นยังมีตัวเลือกที่จะลบข้อมูลโดยตรงจากตารางฐานข้อมูลโดยไม่ต้องใช้ API ฟิลด์และไม่ต้องใช้ hooks ไม่มีงานแบตช์เลยมันจะทำงานจนกว่าสคริปต์จะตาย โมดูล IMHO ที่อันตรายมาก
ไคลฟ์

2
อาจยังมีประโยชน์หากคุณรู้ว่าคุณกำลังทำอะไรและสำรองข้อมูลไว้ การลบโหนดนับพันในขณะที่เรียกใช้ hooks และ apis ทั้งหมดอาจทำให้ช้าลงอย่างเจ็บปวด :(
Letharion

@ Letharion ไม่มีความเจ็บปวดไม่มีกำไร;) คุณพูดถูกฉันคิดว่าฉันควรจะตบข้อจำกัดความรับผิดชอบเรื่องนี้มากขึ้นเพราะโมดูลนี้อาจทำให้สิ่งต่าง ๆ ยุ่งเหยิงหากอยู่ในมือที่ไม่ถูกต้อง!
ไคลฟ์

@ Clive ด้วยการสนับสนุน drush หากฉันได้ทำdrush delete-all articleเพื่อลบบทความที่ฉันจะไปหาทางออกนี้
AjitS

@develkar สำหรับสองสามร้อยโหนดที่อาจใช้ได้ แต่ส่วนขยาย drush ใช้ฟังก์ชั่นเดียวกับรุ่นในไซต์ดังนั้นมันจึงยังคงไวต่อการหมดเวลาอย่างน่าเสียดาย
Clive

0

ใช้การทำงานเป็นกลุ่ม Views - มันเป็นความคิดที่ดี แต่แทนที่จะเรียกใช้โดยตรงให้ใช้ batch api ที่นี่คุณสามารถอ่านบทความเกี่ยวกับมันได้ ขาดเอกสารในส่วนที่เป็นปัญหาที่รู้จักกัน


0

สำหรับการลบโหนดในจำนวนมาก (เช่นเป็นจำนวนมาก) เช่นเดียวกับในกรณีของคุณคุณสามารถใช้โมดูลการลบเป็นกลุ่มสำหรับสิ่งนี้

ซึ่งจะใช้ Batch API เพื่อลบโหนดเพื่อหลีกเลี่ยงการหมดเวลาหรือปัญหาหน่วยความจำเมื่อลบโหนดนับพันด้วยการเรียก node_delete_multiple () เพียงครั้งเดียว

นอกจากนี้คุณยังสามารถลองลบโมดูลทั้งหมดเพื่อลบโหนดทั้งหมดของประเภทเนื้อหา

หวังว่านี่จะช่วยได้


0

คุณยังสามารถสร้างกระบวนการแบทช์โดยใช้ BATCH API และในกระบวนการแบทช์นั้นก็ทำได้

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

แค่นั้นแหละ. คุณทำเสร็จแล้ว หากคุณต้องการสร้างคำสั่ง drush สำหรับคำสั่งนั้นคุณสามารถสร้างคำสั่งได้ สำหรับการอ้างอิงโปรดดูที่นี้


0

หากคุณมีเหตุผลที่จะทำตามรหัส:

$query = new EntityFieldQuery();

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

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

นอกจากนี้คุณยังมีวิธีอื่น ๆ อีกมากมายในการเลือกโหนดที่จะลบ


0

คุณสามารถใช้คำแนะนำและฟีดของ Bobik ในฐานะที่เป็นอาร์กิวเมนต์ของ 'drush php-eval' หากคุณกำลังเหน็บแนมจริง ๆ แต่ฉันคาดว่าการแสดงจะคล้ายกับ VBO ในขณะที่เร็วขึ้นเล็กน้อย หากประสิทธิภาพช้าจริงๆคุณอาจต้องการดูว่าโมดูลใดกำลังเรียก hook_node_delete โดย grepping codebase สำหรับ '_node_delete (' จากนั้นกำหนดว่าคุณสามารถปิดการใช้งานโมดูลที่ใช้ hook นั้นได้หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.