私はmongoデータベースとPHPを使用して、ファイルのメタ情報をファイルのディレクトリと比較して、どこに何が欠けているかを確認しています。次に、ファイルとデータベースの連想配列を返し、不足しているものとその場所を確認します。
注:私を助けるために mongo を知る必要はありません。
たとえば、ディレクトリからファイルを削除しても、データベースにエントリがある場合、配列は次のようになります。
array(2) {
'File System' =>
array(1) {
[0] =>
string(28) "50e72bce045aca4c04000004.txt"
}
'Database' =>
array(0) {
}
}
このチェックのコードは次のとおりです。
public function compareDatabaseToDirectory(){
// Fetch all file meta information
$files = $this->_model->fetchAll(array());
// Create a file based on id and extension.
foreach($files as $id=>$model){
$dataBaseEntries[] = $id . $model->fileExtension;
}
// Get all files in our directory
$directoryFiles = preg_grep('/^([^.])/', scandir($this->getDestination()));
// Get the differneces of files
$differences = array_diff($dataBaseEntries, $directoryFiles);
// Check if missing from database OR missing from file system
$missingFromDataBase = array_diff($differences, $dataBaseEntries);
$missingFromFileSystem = array_diff($differences, $directoryFiles);
// Create an associative array
$filesMissing = array(
'File System' => $missingFromFileSystem,
'Database' => $missingFromDataBase
);
// Return results.
return $filesMissing;
}
ここで行っていたのは、mongo ID を使用し、それをファイル拡張子に追加して、そのファイルを作成することだけです。
ファイルの配列をファイルのディレクトリ内の配列と比較し、違いを返します。
私のテストでは、次のことだけを行います。
public function testComapreDatabaseToFileSystemMissingFile(){
$this->resetNoSqlDatabase();
unlink(APPLICATION_PATH . '/data/uploadedFiles/testing/50e72bce045aca4c04000004.txt');
$result = $this->_file->compareDatabaseToDirectory();
$expectedArray = array(
'File System' => array(
'50e72bce045aca4c04000004.txt'
),
'Database' => array(),
);
$this->assertEquals($result, $expectedArray);
}
上記の配列が返されます。ブラウザで同じ概念を複製すると、上記の配列が空であってはならないときに空になります。
何か案は?