孤立した画像ファイルをDrupal 7で削除していますが、最初に、画像を使用している可能性のある他のテーブルにそれらを相互参照する必要があります。IMCEエディターを介して画像をアップロードしないことを考えると、インターフェイスと主に画像モジュールを介してアップロードを行う場合、file_managedテーブルとimage_dimensionsテーブルをfile_usageに相互参照し、そこにないものを削除できると言っても安全でしょうか?
今私はただfile_usageがどのように入力されるのか疑問に思っています。ファイルタイプをアップロードするたびに入力されますか?
Drupalが一時ファイルを削除するために使用するコードは次のとおりです(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() は、「file_usage」テーブルを照会する関数です。
そのテーブルに行を追加する関数は file_usage_add() ;です。それを呼び出す関数/フックを見ると、「file_usage」テーブルが管理対象ファイルに使用されていると結論付けます。 「file_managed」テーブルの行を含むファイルは削除しないので、「file_usage」テーブルを確認しないようにできます。
canonicalを行う方法は、画像を使用するときに使用マークを追加し、画像を使用しなくなったら削除することです。これは、3つの参照を持つ画像を意味し、1つの元のアップロードには4つの使用マークが付きます。何かがもう一度それを参照すると、5にバンプされます。参照されていないものがある場合、1つの使用法マークが消えます。そして、もし #managed_file のようなものでファイルをアップロードしただけなら、フォームが保存されるまで、ファイルは使用済みとしてマークされません。
file_delete() を呼び出す場合、使用カウントが0の場合のみDrupalはファイルを削除します-hddからファイル自体とテーブルからのすべてのメタデータの両方です。サイドが必要な場合は、必要なすべてのファイルをループするか、使用法を削除するたびに呼び出すことができます(通常の方法です)。
アイデアは、 file_usage_add() 、 file_usage_delete() および file_usage_list() を介してのみ、そのテーブルと直接対話しないでください。また、実際のファイルやデータベースレコードは削除しないでください。まあ、コンテンツのセキュリティ問題などですぐに必要にならない限り。しかし、それ以外の場合は、Drupalが注意します。