Score:-1

ไม่สามารถรับ html ของหน้าหลังจากอัปเดตหน้าและล้างแคชทั้งหมด

ธง gb

เมื่อฉันอัปเดตเพจผ่านแผงการดูแลระบบ ฉันต้องล้างแคชทั้งหมดโดยทางโปรแกรม จากนั้นรับซอร์สโค้ดของเพจและเขียนลงในไฟล์ ฉันใช้รหัสต่อไปนี้ภายในโมดูลของฉัน:

ฟังก์ชัน mymodulename_node_update($node) {
    drupal_flush_all_caches();
    $nid = $node->nid->ค่า;
    $nodePath = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
    $content = file_get_contents('https://mydomain.com'.$nodePath);
    file_put_contents(__DIR__ . '/test.html', $เนื้อหา);
}

แต่หลังจากนั้นไม่นาน (นานกว่าเวลาปกติในการล้างแคชผ่านแผงผู้ดูแลระบบ) ฉันเพิ่งได้รับข้อผิดพลาด

"file_get_contents(https://mydomain.com/path-to-page): เปิดไม่สำเร็จ สตรีม: คำขอ HTTP ล้มเหลว! ใน..."

และเขียนไฟล์ไม่ถูกดำเนินการ

หากฉันพยายามรับเนื้อหาผ่าน cURL หน้าแผงผู้ดูแลระบบโหลดไม่เสร็จ

มีอะไรผิดปกติ?

leymannx avatar
ne flag
ไม่ใช่แค่ `$node->id()` ใช่ไหม
leymannx avatar
ne flag
คุณรู้จัก [Tome](https://www.drupal.org/project/tome) ไหม มันเป็นเครื่องมือสร้างไซต์แบบสแตติกสำหรับ Drupal
stckvrw avatar
gb flag
@leymannx ฉันได้รับ nid ที่ถูกต้องด้วยวิธีการที่มีอยู่ อย่างไรก็ตาม `->id()` ยังไม่สามารถแก้ปัญหาได้
leymannx avatar
ne flag
อาจเป็น php.ini: https://stackoverflow.com/a/3488430/2199525
stckvrw avatar
gb flag
ไม่ ถ้าฉันลบบรรทัด `drupal_flush_all_caches()` โค้ดจะทำงานได้อย่างถูกต้อง
stckvrw avatar
gb flag
ฉันยังพยายามเพิ่ม `sleep(10)` หลังจากการฟลัชและก่อนที่จะรับเนื้อหา แต่ก็ไม่สำเร็จ
leymannx avatar
ne flag
ให้เรา [ดำเนินการสนทนาต่อในการแชท](https://chat.stackexchange.com/rooms/128459/discussion-between-leymannx-and-stckvrw)
Score:2
ธง cn

นี่ไม่ใช่กรณีการใช้งานที่ถูกต้องสำหรับ 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

stckvrw avatar
gb flag
ขอบคุณ. การล้างแคชและการสร้างเพจแบบสแตติกนั้นมีจุดประสงค์ที่แตกต่างกัน - เราใช้ทั้งสองอย่างในการอัปเดตเพจ เราพบข้อผิดพลาดบางอย่างของเว็บไซต์ของเราปรากฏขึ้นหลังจากอัปเดตเพจผ่านแผงผู้ดูแลระบบ เช่น เนื้อหาบางหน้าอาจหายไป หรือมี index.php ปรากฏในลิงก์เมนู และการล้างแคชจะช่วยแก้ไขข้อบกพร่องดังกล่าว
4uk4 avatar
cn flag
คุณจะได้รับ index.php ในลิงก์ที่เก็บไว้หากมีคนเข้าชมเพจด้วย URL ที่มี index.php เพื่อป้องกันไม่ให้คุณสามารถเปลี่ยนเส้นทางการรับส่งข้อมูลดังกล่าวไปยัง URL ที่สะอาดด้วย https://www.drupal.org/project/redirect
stckvrw avatar
gb flag
ด้วยการทำให้แท็กใช้ไม่ได้ตอนนี้รหัสของฉันทำงานโดยไม่มีข้อผิดพลาด แต่อย่างที่คุณบอก มันไม่เห็นการเปลี่ยนแปลง จะแก้ไขปัญหานี้ได้อย่างไร? ถ้าฉันเพิ่ม `sleep(10)` ก่อนรับเนื้อหา ฉันได้รับข้อผิดพลาดเดิมอีกครั้ง
4uk4 avatar
cn flag
ทางออกที่ดีคือพนักงานต่อคิว มันทำงานในพื้นหลังโดยที่คุณไม่ต้องรอให้แผงผู้ดูแลระบบตอบกลับหลังจากบันทึกโหนด และคุณไม่ต้องรอเป็นชั่วโมงเพื่อรับ html แบบคงที่ การรัน cron ทุก 2 หรือ 3 นาทีก็ไม่มีปัญหา

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา