ฉันมีประมาณ 13,000 โหนดที่จะลบในเว็บไซต์ Drupal 7 ฉันได้ลองใช้โมดูลViews Bulk Operationsเพื่อลบ 500 โหนดในแต่ละครั้ง แต่หมดเวลา ฉันสามารถลบได้ครั้งละ 50 โหนดเท่านั้น
ฉันจะลบมากกว่า 50 โหนดในเวลาได้อย่างไร
ฉันมีประมาณ 13,000 โหนดที่จะลบในเว็บไซต์ Drupal 7 ฉันได้ลองใช้โมดูลViews Bulk Operationsเพื่อลบ 500 โหนดในแต่ละครั้ง แต่หมดเวลา ฉันสามารถลบได้ครั้งละ 50 โหนดเท่านั้น
ฉันจะลบมากกว่า 50 โหนดในเวลาได้อย่างไร
คำตอบ:
VBO เป็นมาตรฐานตามความเป็นจริงสำหรับการลบโหนดจำนวนมากไม่มีวิธีที่ดีกว่าที่จะทำ
เมื่อกระบวนการ VBO ทำงานแบบแบตช์มันจะทำการโหนดเพียงครั้งละ 1 (หรือสองสามครั้ง) เท่านั้น ดังนั้นหากคุณได้รับข้อผิดพลาดการหมดเวลาซึ่งเกี่ยวข้องกับการลบโหนดเดียวไม่ใช่การดำเนินการแบบกลุ่มทั้งหมด
ความละเอียดมาตรฐานของบางอย่างเช่นนี้คือการเพิ่มเวลาดำเนินการ PHP สูงสุดเพื่อชดเชย
ติดตั้ง Devel จากนั้นไปที่ผู้ดูแลระบบ / กำหนดค่า / พัฒนา / สร้าง / เนื้อหาใน D7 และเลือกประเภทเนื้อหาทั้งหมด ทำเครื่องหมายที่ "ลบเนื้อหาทั้งหมด" ป้อน 0 ใน "คุณต้องการสร้างกี่โหนด"
คลิกสร้าง
นั่นจะลบโหนดทั้งหมด
generate-content
( genc
) ที่มาพร้อมกับ Devel Generate drush help genc
สำหรับข้อมูลการใช้งาน
ใช้ VBO และดำเนินการจาก Drush ฉันใช้วิธีการต่อไปนี้เพื่อลบโหนดมากกว่า 1.5 ล้านโหนดหลังจากการทดสอบในระดับ
drush vbo-execute my_view action :: views_bulk_operations_delete_item
โดยที่my_viewคือชื่อเครื่องในมุมมองของคุณ
คุณยังสามารถใช้drush vbo-listเพื่อแสดงมุมมองที่มีอยู่ทั้งหมดและการใช้งานแบบกลุ่ม
ตอนนี้ VBO ควรทำงานในเชลล์ให้คำติชมตามที่คุณต้องการ
มีโมดูลลบทั้งหมดออก มันจะลบโหนดและ / หรือผู้ใช้ทั้งหมดออกจากเว็บไซต์
นอกจากนี้ยังมีการสนับสนุน 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.
node_delete()
(มันไม่ได้รบกวนการใช้งานnode_delete_multiple()
) ยิ่งไปกว่านั้นยังมีตัวเลือกที่จะลบข้อมูลโดยตรงจากตารางฐานข้อมูลโดยไม่ต้องใช้ API ฟิลด์และไม่ต้องใช้ hooks ไม่มีงานแบตช์เลยมันจะทำงานจนกว่าสคริปต์จะตาย โมดูล IMHO ที่อันตรายมาก
drush delete-all article
เพื่อลบบทความที่ฉันจะไปหาทางออกนี้
ใช้การทำงานเป็นกลุ่ม Views - มันเป็นความคิดที่ดี แต่แทนที่จะเรียกใช้โดยตรงให้ใช้ batch api ที่นี่คุณสามารถอ่านบทความเกี่ยวกับมันได้ ขาดเอกสารในส่วนที่เป็นปัญหาที่รู้จักกัน
สำหรับการลบโหนดในจำนวนมาก (เช่นเป็นจำนวนมาก) เช่นเดียวกับในกรณีของคุณคุณสามารถใช้โมดูลการลบเป็นกลุ่มสำหรับสิ่งนี้
ซึ่งจะใช้ Batch API เพื่อลบโหนดเพื่อหลีกเลี่ยงการหมดเวลาหรือปัญหาหน่วยความจำเมื่อลบโหนดนับพันด้วยการเรียก node_delete_multiple () เพียงครั้งเดียว
นอกจากนี้คุณยังสามารถลองลบโมดูลทั้งหมดเพื่อลบโหนดทั้งหมดของประเภทเนื้อหา
หวังว่านี่จะช่วยได้
หากคุณมีเหตุผลที่จะทำตามรหัส:
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->propertyOrderBy('nid', 'DESC')
->range(1000, 1000);
$result = $query->execute();
node_delete_multiple(array_keys($result['node']));
นอกจากนี้คุณยังมีวิธีอื่น ๆ อีกมากมายในการเลือกโหนดที่จะลบ
คุณสามารถใช้คำแนะนำและฟีดของ Bobik ในฐานะที่เป็นอาร์กิวเมนต์ของ 'drush php-eval' หากคุณกำลังเหน็บแนมจริง ๆ แต่ฉันคาดว่าการแสดงจะคล้ายกับ VBO ในขณะที่เร็วขึ้นเล็กน้อย หากประสิทธิภาพช้าจริงๆคุณอาจต้องการดูว่าโมดูลใดกำลังเรียก hook_node_delete โดย grepping codebase สำหรับ '_node_delete (' จากนั้นกำหนดว่าคุณสามารถปิดการใช้งานโมดูลที่ใช้ hook นั้นได้หรือไม่