Điểm:-1

Không thể tải trang html sau khi cập nhật trang và xóa tất cả bộ đệm

lá cờ gb

Sau khi tôi cập nhật một trang thông qua bảng quản trị, tôi cần xóa tất cả các bộ đệm theo chương trình, sau đó lấy mã nguồn của trang và ghi nó vào một tệp. Tôi sử dụng đoạn mã sau bên trong mô-đun của mình:

hàm mymodulename_node_update($node) {
    drupal_flush_all_caches();
    $nid = $node->nid->value;
    $nodePath = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
    $content = file_get_contents('https://mydomain.com'.$nodePath);
    file_put_contents(__DIR__ . '/test.html', $content);
}

Nhưng sau một thời gian dài (lâu hơn thời gian xóa bộ đệm thông thường qua bảng quản trị), tôi mới nhận được lỗi

"file_get_contents(https://mydomain.com/path-to-page): không mở được luồng: Yêu cầu HTTP không thành công! Trong..."

và ghi tập tin không được thực hiện.

Nếu tôi cố lấy nội dung qua cURL, trang bảng quản trị sẽ không bao giờ tải xong.

Chuyện gì vậy?

leymannx avatar
lá cờ ne
Không phải chỉ là `$node->id()` sao?
leymannx avatar
lá cờ ne
Bạn có biết [Tome](https://www.drupal.org/project/tome) không? Đó là một trình tạo trang tĩnh cho Drupal.
stckvrw avatar
lá cờ gb
@leymannx Tôi nhận được nid chính xác với phương thức hiện có. Dù sao thì `->id()` vẫn không giải quyết được vấn đề
leymannx avatar
lá cờ ne
Có lẽ một số php.ini: https://stackoverflow.com/a/3488430/2199525
stckvrw avatar
lá cờ gb
Không, nếu tôi xóa dòng `drupal_flush_all_caches()` thì mã sẽ hoạt động bình thường
stckvrw avatar
lá cờ gb
Tôi thậm chí đã cố thêm `sleep(10)` sau khi flush và trước khi lấy nội dung, nhưng không thành công
leymannx avatar
lá cờ ne
Hãy để chúng tôi [tiếp tục cuộc thảo luận này trong cuộc trò chuyện](https://chat.stackexchange.com/rooms/128459/discussion-between-leymannx-and-stckvrw).
Điểm:2
lá cờ cn

Đây không phải là trường hợp sử dụng hợp lệ cho drupal_flush_all_caches(). Chức năng này dành cho mã mới hoặc đã thay đổi. Đối với nội dung, bạn phải sử dụng thẻ bộ đệm.

Trong trường hợp hiếm hoi, khi không thể thêm các thẻ bộ đệm chính xác vào tất cả các mảng kết xuất, bạn có thể vô hiệu hóa thẻ kết xuất, được thêm theo mặc định, ngay cả khi không có thẻ bộ đệm nào được chỉ định:

\Drupal\Core\Cache\Cache::invalidateTags(['kết xuất']);

Các hoạt động của thực thể BTW được xử lý trong các giao dịch, vì vậy yêu cầu trang đồng thời có thể không thấy các thay đổi cho đến khi chúng được cam kết với cơ sở dữ liệu. Trong trường hợp này, xóa bộ đệm (dưới mọi hình thức) không giúp được gì.

Chỉnh sửa: Thêm ví dụ cho nhận xét mới nhất.

Một giải pháp hay sẽ là nhân viên xếp hàng. Nó chạy ở chế độ nền, nếu không có điều đó, bạn phải đợi bảng quản trị phản hồi sau khi lưu nút.

Ví dụ:

Trong hook, hãy thêm một mục hàng đợi có ID thực thể:

Phương tiện::postSave()

\Drupal::queue('media_entity_thumbnail')->createItem(['id' => $translation->id()]);

Đó là thêm một mục hàng đợi cho plugin công nhân hàng đợi này:

/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php

<?php

không gian tên Drupal\media\Plugin\QueueWorker;

sử dụng Drupal\Core\Entity\EntityTypeManagerInterface;
sử dụng Drupal\Core\Plugin\ContainerFactoryPluginInterface;
sử dụng Drupal\Core\Queue\QueueWorkerBase;
sử dụng Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Xử lý hàng đợi các mục phương tiện để tìm nạp hình thu nhỏ của chúng.
 *
 * @QueueWorker(
 * id = "media_entity_thumbnail",
 * title = @Translation("Trình tải xuống hình thu nhỏ"),
 * cron = {"thời gian" = 60}
 * )
 */
lớp ThumbnailDownloader extends QueueWorkerBase thực hiện ContainerFactoryPluginInterface {

  /**
   * Dịch vụ quản lý kiểu thực thể.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  được bảo vệ $entityTypeManager;

  /**
   * Xây dựng một thể hiện lớp mới.
   *
   * @param mảng $configuration
   * Một mảng cấu hình chứa thông tin về phiên bản plugin.
   * @param chuỗi $plugin_id
   * Plugin_id cho phiên bản plugin.
   * @param hỗn hợp $plugin_definition
   * Định nghĩa triển khai plugin.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   * Dịch vụ quản lý loại thực thể.
   */
  hàm công khai __construct(mảng $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
    cha mẹ::__construct($configuration, $plugin_id, $plugin_definition);
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  tạo hàm tĩnh công khai (ContainerInterface $container, mảng $configuration, $plugin_id, $plugin_definition) {
    trả về tĩnh mới (
      cấu hình $,
      $plugin_id,
      $plugin_definition,
      $container->get('entity_type.manager')
    );
  }

  /**
   * {@inheritdoc}
   */
  hàm công khai processItem($data) {
    /** @var \Drupal\media\Entity\Media $media */
    if ($media = $this->entityTypeManager->getStorage('media')->load($data['id'])) {
      $media->updateQueuedThumbnail();
      $media->save();
    }
  }

}

Theo mặc định, cron chỉ chạy cứ sau 3 giờ. Nếu bạn cần HTML tĩnh trong thời gian ngắn hơn thì hãy kích hoạt tác vụ cron (tác vụ này cũng chạy các hàng đợi) từ bên ngoài trang web. Nhìn thấy https://www.drupal.org/docs/user_guide/en/security-cron.html

stckvrw avatar
lá cờ gb
Cảm ơn. Xóa bộ đệm và tạo trang tĩnh dành cho các mục đích khác nhau - chúng tôi chỉ sử dụng cả hai khi cập nhật trang. Chúng tôi đã gặp phải một số lỗi của trang web xuất hiện sau khi cập nhật một trang thông qua bảng quản trị. Ví dụ: nội dung của một số trang có thể biến mất hoặc index.php xuất hiện trong liên kết menu. Và xóa bộ nhớ cache giải quyết các lỗi như vậy.
4uk4 avatar
lá cờ cn
Bạn nhận được index.php trong các liên kết được lưu trong bộ nhớ cache nếu ai đó truy cập trang bằng URL chứa index.php. Để ngăn chặn điều đó, bạn có thể chuyển hướng lưu lượng truy cập đó tới các URL sạch bằng https://www.drupal.org/project/redirect
stckvrw avatar
lá cờ gb
Với việc vô hiệu hóa thẻ bây giờ, mã của tôi hoạt động mà không có lỗi. Nhưng như bạn đã đề cập, nó không thấy những thay đổi. Làm thế nào để giải quyết vấn đề này? Nếu tôi thêm `sleep(10)` trước khi nhận nội dung, tôi lại nhận được lỗi tương tự trước đây
4uk4 avatar
lá cờ cn
Một giải pháp hay sẽ là nhân viên xếp hàng. Nó chạy ở chế độ nền, nếu không có điều đó, bạn phải đợi bảng quản trị phản hồi sau khi lưu nút. Và bạn không phải đợi hàng giờ để nhận được html tĩnh, không có vấn đề gì khi chạy cron cứ sau 2 hoặc 3 phút.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.