web-dev-qa-db-fra.com

Comment les données de fichier dans la table de base de données file_usage sont-elles créées et gérées?

Je supprime des fichiers d'images orphelins dans Drupal 7, mais je dois d'abord les renvoyer à d'autres tableaux qui pourraient utiliser les images. Étant donné que je ne télécharge aucune image via l'éditeur IMCE interface et principalement faire des téléchargements via le module image, serait-il sûr de dire que je peux croiser la table file_managed et image_dimensions à file_usage et supprimer ce qui n'est pas là?

En ce moment, je me demande simplement comment file_usage est rempli. Est-il rempli à chaque fois que je télécharge un type de fichier?

5

Le code utilisé par Drupal pour supprimer les fichiers temporaires est le suivant. (Il s'exécute pendant les tâches cron.)

  // Remove temporary files that are older than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
  // Use separate placeholders for the status to avoid a bug in some versions
  // of PHP. See http://drupal.org/node/352956.
  $result = db_query('SELECT fid FROM {file_managed} WHERE status <> :permanent AND timestamp < :timestamp', array(
    ':permanent' => FILE_STATUS_PERMANENT,
    ':timestamp' => REQUEST_TIME - DRUPAL_MAXIMUM_TEMP_FILE_AGE,
  ));
  foreach ($result as $row) {
    if ($file = file_load($row->fid)) {
      $references = file_usage_list($file);
      if (empty($references)) {
        if (!file_delete($file)) {
          watchdog('file system', 'Could not delete temporary file "%path" during garbage collection', array('%path' => $file->uri), WATCHDOG_ERROR);
        }
      }
      else {
        watchdog('file system', 'Did not delete temporary file "%path" during garbage collection, because it is in use by the following modules: %modules.', array('%path' => $file->uri, '%modules' => implode(', ', array_keys($references))), WATCHDOG_INFO);
      }
    }
  }

file_usage_list () est la fonction qui interroge la table "file_usage".
La fonction qui ajoute une ligne dans cette table est file_usage_add () ; en regardant les fonctions/hooks qui l'appellent, je conclus que la table "file_usage" est utilisée pour les fichiers gérés. Puisque vous ne supprimez pas les fichiers avec une ligne dans la table "file_managed", je dirais que vous pouvez éviter de vérifier la table "file_usage".

7
kiamlaluno

La manière canonique de le faire est d'ajouter une marque d'utilisation lorsque vous utilisez une image et de la supprimer lorsque vous ne la faites plus. Cela signifie que l'image avec 3 références et un téléchargement original aura 4 marques d'utilisation. Quand quelque chose le référence une fois de plus, il passe à 5. Si quelque chose ne fait pas référence, une marque d'utilisation disparaît. Et si vous avez seulement téléchargé un fichier avec quelque chose comme # managed_file le fichier n'est PAS marqué comme utilisé jusqu'à ce que le formulaire soit enregistré, et même alors seulement si la fonction de gestion de la soumission le décide.

Lorsque vous appelez file_delete () , uniquement si le nombre d’utilisations 0, Drupal supprimera un fichier - les deux se déposent à partir du disque dur et toutes ses métadonnées des tables. Aucun test sur votre côté sont nécessaires, vous pouvez simplement le boucler sur tous les fichiers que vous voulez, ou l'appeler après chaque suppression d'utilisation (c'est la pratique habituelle).

L'idée est - vous ne devez jamais interagir directement avec cette table, uniquement via file_usage_add () , file_usage_delete () et file_usage_list () . Et vous ne devez jamais supprimer le fichier réel ou son enregistrement de base de données. Eh bien, sauf si cela est nécessaire immédiatement en raison d'un problème de sécurité du contenu ou de quelque chose comme ça. Mais sinon, Drupal prend soin.

4
Mołot