นี่ไม่ใช่กรณีการใช้งานที่ถูกต้องสำหรับ drupal_flush_all_caches(). ฟังก์ชันนี้ใช้สำหรับโค้ดที่เปลี่ยนแปลงหรือใหม่ สำหรับเนื้อหาที่คุณต้องใช้แคชแท็ก
ในกรณีที่ไม่ค่อยเกิดขึ้น ซึ่งเป็นไปไม่ได้ที่จะเพิ่มแท็กแคชที่ถูกต้องให้กับอาร์เรย์การแสดงผลทั้งหมด คุณสามารถทำให้แท็กใช้ไม่ได้ แสดงผล
ซึ่งถูกเพิ่มโดยค่าเริ่มต้น แม้ว่าจะไม่ได้ระบุแท็กแคชก็ตาม:
\Drupal\Core\Cache\Cache::invalidateTags(['rendered']);
การดำเนินการของเอนทิตี BTW ได้รับการจัดการในธุรกรรม ดังนั้นคำขอหน้าพร้อมกันอาจไม่เห็นการเปลี่ยนแปลงจนกว่าจะยืนยันกับฐานข้อมูล ในกรณีนี้ การล้างแคช (ในรูปแบบใดก็ตาม) ไม่ได้ช่วยอะไร
แก้ไข: เพิ่มตัวอย่างสำหรับความคิดเห็นล่าสุด
ทางออกที่ดีคือพนักงานต่อคิว มันทำงานในพื้นหลังโดยที่คุณไม่ต้องรอให้แผงผู้ดูแลระบบตอบกลับหลังจากบันทึกโหนด
ตัวอย่าง:
ใน hook เพิ่มรายการคิวด้วย ID เอนทิตี:
สื่อ::postSave()
\Drupal::queue('media_entity_thumbnail')->createItem(['id' => $translation->id()]);
ซึ่งกำลังเพิ่มรายการคิวสำหรับปลั๊กอินตัวทำงานคิวนี้:
/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php
<?php
เนมสเปซ Drupal\media\Plugin\QueueWorker;
ใช้ Drupal\Core\Entity\EntityTypeManagerInterface;
ใช้ Drupal\Core\Plugin\ContainerFactoryPluginInterface;
ใช้ Drupal\Core\Queue\QueueWorkerBase;
ใช้ Symfony\Component\DependencyInjection\ContainerInterface;
/**
* ประมวลผลคิวของรายการสื่อเพื่อเรียกภาพขนาดย่อ
*
* @คิวเวิร์คเกอร์(
* id = "media_entity_thumbnail",
* title = @Translation("ตัวดาวน์โหลดภาพขนาดย่อ"),
* cron = {"เวลา" = 60}
* )
*/
คลาส ThumbnailDownloader ขยาย QueueWorkerBase ใช้ ContainerFactoryPluginInterface {
/**
* บริการจัดการประเภทเอนทิตี
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
ป้องกัน $entityTypeManager;
/**
* สร้างตัวอย่างคลาสใหม่
*
* @param อาร์เรย์ $configuration
* อาร์เรย์การกำหนดค่าที่มีข้อมูลเกี่ยวกับอินสแตนซ์ของปลั๊กอิน
* @param สตริง $plugin_id
* plugin_id สำหรับปลั๊กอินอินสแตนซ์
* @param ผสม $plugin_definition
* คำจำกัดความการใช้งานปลั๊กอิน
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* บริการจัดการประเภทเอนทิตี
*/
ฟังก์ชันสาธารณะ __construct (อาร์เรย์ $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
พาเรนต์::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
}
/**
* {@inheritdoc}
*/
การสร้างฟังก์ชันสแตติกสาธารณะ (ContainerInterface $container, อาร์เรย์ $configuration, $plugin_id, $plugin_definition) {
ส่งคืนค่าคงที่ใหม่ (
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity_type.manager')
);
}
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ processItem ($ data) {
/** @var \Drupal\media\Entity\Media $media */
ถ้า ($media = $this->entityTypeManager->getStorage('media')->load($data['id'])) {
$media->updateQueuedThumbnail();
$media->save();
}
}
}
โดยค่าเริ่มต้น cron จะทำงานทุกๆ 3 ชั่วโมงเท่านั้น หากคุณต้องการ HTML แบบคงที่ในเวลาอันสั้น ให้เรียกใช้งาน cron (ซึ่งรันคิวด้วย) จากภายนอกเว็บไซต์ ดู https://www.drupal.org/docs/user_guide/en/security-cron.html