Puncte:-1

Nu se poate obține html-ul paginii după actualizarea paginii și golirea tuturor cache-urilor

drapel gb

Odată ce am actualizat o pagină prin panoul de administrare, trebuie să șterg în mod programatic toate cache-urile, apoi să obțin codul sursă al paginii și să-l scriu într-un fișier. Folosesc următorul cod în interiorul modulului meu:

funcția mymodulename_node_update($nod) {
    drupal_flush_all_caches();
    $nid = $nod->nid->valoare;
    $nodePath = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
    $content = file_get_contents('https://mydomain.com'.$nodePath);
    file_put_contents(__DIR__ . '/test.html', $content);
}

Dar după mult timp (mai mult decât timpul pentru spălarea normală a cache-urilor prin panoul de administrare) tocmai primesc eroarea

"file_get_contents(https://mydomain.com/path-to-page): nu s-a deschis flux: solicitarea HTTP a eșuat! în..."

iar scrierea fișierului nu este executată.

Dacă încerc să obțin conținutul prin cURL, pagina panoului de administrare nu se termină încărcarea.

Ce s-a întâmplat?

leymannx avatar
drapel ne
Nu este doar `$node->id()`?
leymannx avatar
drapel ne
Îl cunoști pe [Tome](https://www.drupal.org/project/tome)? Este un generator de site static pentru Drupal.
stckvrw avatar
drapel gb
@leymannx Primesc nid-ul corect cu metoda existentă. Oricum `->id()` tot nu rezolvă problema
leymannx avatar
drapel ne
Poate ceva php.ini: https://stackoverflow.com/a/3488430/2199525
stckvrw avatar
drapel gb
Nu, dacă elimin linia `drupal_flush_all_caches()`, codul funcționează corect
stckvrw avatar
drapel gb
Am încercat chiar să adaug „sleep(10)” după spălare și înainte de a obține conținutul, dar fără succes
leymannx avatar
drapel ne
Să [continuăm această discuție în chat](https://chat.stackexchange.com/rooms/128459/discussion-between-leymannx-and-stckvrw).
Puncte:2
drapel cn

Acesta nu este un caz de utilizare valid pentru drupal_flush_all_caches(). Această funcție este pentru codul modificat sau nou. Pentru conținut, trebuie să utilizați etichete cache.

În cazul rar, în care nu este posibil să adăugați etichete cache corecte la toate matricele de randare, puteți invalida eticheta redat, care este adăugat în mod implicit, chiar dacă nu sunt specificate etichete cache:

\Drupal\Core\Cache\Cache::invalidateTags(['rendat']);

Operațiunile entităților BTW sunt gestionate în tranzacții, astfel încât cererea concomitentă a paginii ar putea să nu vadă modificările până când nu sunt trimise în baza de date. În acest caz, o ștergere cache (sub orice formă) nu ajută.

Editare: Adăugarea unui exemplu pentru cel mai recent comentariu.

O soluție bună ar fi un lucrător la coadă. Se rulează în fundal, fără ca trebuie să așteptați ca panoul de administrare să răspundă după o salvare a nodului.

Exemplu:

În cârlig, adăugați un element de coadă cu ID-ul entității:

Media::postSave()

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

Ceea ce înseamnă adăugarea unui element de coadă pentru acest plugin de lucru pentru coadă:

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

<?php

spațiu de nume Drupal\media\Plugin\QueueWorker;

utilizați Drupal\Core\Entity\EntityTypeManagerInterface;
utilizați Drupal\Core\Plugin\ContainerFactoryPluginInterface;
utilizați Drupal\Core\Queue\QueueWorkerBase;
utilizați Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Procesați o coadă de articole media pentru a le prelua miniaturile.
 *
 * @QueueWorker(
 * id = "media_entity_thumbnail",
 * title = @Translation ("Descărcător de miniaturi"),
 * cron = {"timp" = 60}
 * )
 */
clasa ThumbnailDownloader extinde QueueWorkerBase implementează ContainerFactoryPluginInterface {

  /**
   * Serviciul de gestionare a tipului de entitate.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protejat $entityTypeManager;

  /**
   * Construiește o nouă instanță de clasă.
   *
   * @param array $configurare
   * O matrice de configurare care conține informații despre instanța pluginului.
   * @param șir $plugin_id
   * Plugin_id-ul pentru instanța de plugin.
   * @param mixat $plugin_definition
   * Definiția implementării pluginului.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   * Serviciu de gestionare a tipului de entitate.
   */
  funcția publică __construct(array $configurație, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică statică create(ContainerInterface $container, matrice $configurație, $plugin_id, $plugin_definition) {
    returnează static nou (
      $configurare,
      $plugin_id,
      $plugin_definition,
      $container->get('entity_type.manager')
    );
  }

  /**
   * {@inheritdoc}
   */
  funcția publică processItem($date) {
    /** @var \Drupal\media\Entity\Media $media */
    if ($media = $this->entityTypeManager->getStorage('media')->load($data['id'])) {
      $media->updateQueuedThumbnail();
      $media->salvare();
    }
  }

}

În mod implicit, cron rulează numai la fiecare 3 ore. Dacă aveți nevoie de HTML static într-un timp mai scurt, declanșați sarcina cron (care rulează și cozile) din afara site-ului web. Vedea https://www.drupal.org/docs/user_guide/en/security-cron.html

stckvrw avatar
drapel gb
Mulțumiri. Golirea cache-urilor și generarea unei pagini statice sunt în scopuri diferite - le folosim doar pe ambele la actualizarea unei pagini. Am întâlnit câteva erori ale site-ului nostru apărute după actualizarea unei pagini prin panoul de administrare. De exemplu, conținutul unei pagini ar putea dispărea sau index.php a apărut în link-urile de meniu. Și spălarea cache-urilor rezolvă astfel de erori.
4uk4 avatar
drapel cn
Primești index.php în link-urile stocate în cache dacă cineva vizitează pagina cu o adresă URL care conține index.php. Pentru a preveni acest lucru, puteți redirecționa un astfel de trafic către URL-uri curățate cu https://www.drupal.org/project/redirect
stckvrw avatar
drapel gb
Cu invalidarea etichetei, codul meu funcționează fără eroare. Dar, așa cum ați menționat, nu vede modificările. Cum se rezolvă această problemă? Dacă adaug `sleep(10)` înainte de a obține conținutul, primesc din nou aceeași eroare din trecut
4uk4 avatar
drapel cn
O soluție bună ar fi un lucrător la coadă. Se rulează în fundal, fără ca trebuie să așteptați ca panoul de administrare să răspundă după o salvare a nodului. Și nu trebuie să așteptați ore întregi pentru a obține html-ul static, nu este nicio problemă să rulați cron la fiecare 2 sau 3 minute.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.