ฉันสร้างฟิลด์ที่ลบแล้ว ตารางสำหรับเขตข้อมูลหายไปเมื่อทำการลบ แต่ยังอยู่ในfield_config
และfield_config_instance
อย่างไรก็ตามมีการทำความสะอาดหรือไม่
ขอบคุณ
ฉันสร้างฟิลด์ที่ลบแล้ว ตารางสำหรับเขตข้อมูลหายไปเมื่อทำการลบ แต่ยังอยู่ในfield_config
และfield_config_instance
อย่างไรก็ตามมีการทำความสะอาดหรือไม่
ขอบคุณ
คำตอบ:
รายการในfield_config
และfield_config_instance
อาจจะมีค่าเป็น1
ในdeleted
คอลัมน์
ซึ่งหมายความว่ามีการทำเครื่องหมายสำหรับการลบ แต่จะไม่ถูกลบออกจริง ๆ จนกว่าคุณจะเรียกใช้ cron (ลบข้อมูลในฟิลด์ที่ถูกลบfield_cron()
)
ใช้ drush:
$ drush eval "field_purge_batch(500)"
คุณอาจต้องรันสองสามครั้งหรือเพิ่ม $ batch_size จากนั้นอาจยังคงมีตาราง field_deleted และ field_deleted_revision แม้หลังจากเรียกใช้ cron
สอบถาม
SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1
หากคุณว่างเปล่าคุณสามารถลบตารางที่เหลือเหล่านั้นได้อย่างปลอดภัย
เป็นทางเลือกแทนการรัน cron เพื่อลบข้อมูลที่ถูกลบคุณสามารถรันfield_purge_batch ($ batch_size)ด้วยตนเอง
หากต้องการเรียกใช้ฟังก์ชันด้วยตนเองคุณสามารถ:
$ batch_size ที่จะใช้จะแตกต่างกันไปขึ้นอยู่กับสภาพแวดล้อมและความต้องการของเซิร์ฟเวอร์ของคุณ ฉันใช้ค่าต่ำสุด 5 และสูงถึง 10,000
สำหรับผู้ใช้ Drupal 8 ราย
ฉันมีประสบการณ์นี้ยังขุดรหัส ฉันพบเหตุผลทั้งหมดที่ทำให้ฟิลด์ไม่ถูกลบหลังจากที่คุณทำสิ่งต่อไปนี้:
เขตข้อมูลยังคงมีอยู่จะไม่หายไปเนื่องจากส่วนหนึ่งของตรรกะที่นี่ใน field_purge_batch
// We cannot purge anything if the entity type is unknown (e.g. the
// providing module was uninstalled).
// @todo Revisit after https://www.drupal.org/node/2080823.
if (!isset($info[$entity_type])) {
continue;
}
โมดูลที่ขึ้นอยู่กับถูกถอนการติดตั้ง นั่นคือเหตุผลที่เขตข้อมูลจะไม่ถูกลบออก
วิธีแก้ปัญหานี้ ขอแนะนำวิธีการติดตั้งโมดูลก่อนและกำจัดฟิลด์เหล่านั้นและถอนการติดตั้งกลับ วิธีค้นหาโมดูลที่คุณต้องติดตั้งใหม่:
$fields = entity_load_multiple_by_properties('field_config', array(
'deleted' => TRUE,
'include_deleted' => TRUE,
));
dpm($fields); // this is devel module of var_dump
// check the protected member called "dependencies"
ในกรณีที่คุณไม่ต้องการใช้วิธีการติดตั้งโมดูลอีกครั้งคุณสามารถลบได้ทันทีฉันไม่แน่ใจว่าพฤติกรรมคืออะไร แต่ควรทำงาน
สำรองก่อน !!!
ใช่อย่าขี้เกียจมันจะช่วยชีวิตคุณถ้ามีอะไรผิดปกติ
$fields = entity_load_multiple_by_properties('field_config', array(
'deleted' => TRUE,
'include_deleted' => TRUE,
));
foreach ($fields as $field) {
$field->delete();
}
// Retrieve all deleted field storages. Any that have no fields can be purged.
$deleted_storages = \Drupal::state()->get('field.storage.deleted') ? : array();
foreach ($deleted_storages as $field_storage) {
$field_storage = new FieldStorageConfig($field_storage);
$fields = entity_load_multiple_by_properties('field_config', array('field_storage_uuid' => $field_storage->uuid(), 'include_deleted' => TRUE));
if (empty($fields)) {
field_purge_field_storage($field_storage);
}
}
ทำ cron เป็นครั้งสุดท้าย ฉันหวังว่ามันจะแก้ไขปัญหา :)
ดูเหมือนหาวิธีแก้ปัญหาไม่ได้ ดังนั้นฉันเลยต้องลบมันออกจากตารางทั้งสองด้วยตนเอง
หากคุณเรียกใช้ drupal cron หลายครั้ง drupal จะลบตารางฟิลด์และเนื้อหาของมัน คุณสามารถทำตามขั้นตอนต่อไปเพื่อเรียกใช้ cron หลายครั้งได้อย่างง่ายดาย แต่ขั้นตอนนี้สามารถบล็อกระบบเว็บหรือโฮสติ้งของคุณได้ แต่คุณสามารถทำได้หากคุณควบคุมระบบของคุณ
เขียนคำสั่ง bash ถัดไป:
ในขณะที่จริง ทำขด [ใส่ลิงค์คัดลอกที่นี่ลบวงเล็บ]; ทำ;
กดปุ่มตกลง. คำสั่งจะถูกดำเนินการไม่ จำกัด จำนวนครั้ง
ตามที่ฉันแสดงความคิดเห็นก่อนหน้านี้ไม่ใช่วิธีที่ดีที่สุด แต่ง่ายมันทำงานได้คุณจะไม่ทำอะไรผิดเพราะคุณใช้ cron drupal เท่านั้นดังนั้นคุณสามารถทำลายอะไรด้วยรหัส php ผิด มิฉะนั้นคุณสามารถทำให้เซิร์ฟเวอร์ระบบโฮสติ้งหรือสิ่งอื่น ๆ ในเว็บของคุณอิ่มตัวเพราะขั้นตอนนี้ทำงานได้หลายครั้ง cron และทำให้การใช้ทรัพยากรเว็บ แต่ถ้าคุณมีการควบคุมทรัพยากรไม่มีอะไรมาก ทำความสะอาดโต๊ะหรือแถวหรือคุณรู้ว่าปลอดภัยสำหรับคุณคุณสามารถทำได้
และฉันรู้ว่ามันไม่ใช่ทางออกที่ดีที่สุด แต่มันใช้ได้ผล บางทีมันอาจเป็นทางออกที่ง่ายและดีที่สุดสำหรับสถานการณ์ของคุณ