仅在PHP中跟踪文件夹/文件的更改


Track folder/file changes in PHP only

首先一些背景信息:

我正在尝试编写一个只使用PHP的应用程序,从而拒绝对服务器的任何更改。为了安全起见,Exec()等已关闭。服务器运行在PHP 5.3上,MySQL(通过PDO)是使用的数据库。

该应用程序现在需要跟踪几个文件,并将一些文件格式(pdf、doc、docx、xlsx、txt)的纯文本保存到数据库中进行索引和搜索。这些文件位于网络驱动器上,但服务器可以通过readdir()-函数进行访问。访问每个文件大约需要10-15秒。我可以遍历目录中的每个文件(以及递归的子目录),计算该文件的md5哈希,将其保存到数据库中,然后使用该数据库通过全文搜索进行彻底搜索。目前使用的数据库看起来像这样:

CREATE TABLE IF NOT EXISTS `MY_FILE` (
  `FILE_ID` int(11) NOT NULL,
  `FILE_NAME` varchar(55) NOT NULL,
  `FILE_CHECKSUM` varchar(255) NOT NULL,
  `FILE_MODIFIED` datetime NOT NULL,
  `FILE_TEXT` text,
  `FILE_FULLPATH` varchar(255) NOT NULL,
  `FILE_BYTESIZE` int(11) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

当文件没有明文(如图像)时,FILE_TEXT为null,因此不会被搜索。在未来,这些争吵将会消失。所有这些信息目前已经被编入索引,因此,如果答案中需要,可以访问这些信息。

那么问题来了:

我今天遇到的问题是,我不知道如何用PHP来跟踪文件是被移动、重命名还是删除。文件的索引(读取,检查数据库中文件的路径是否存在,如果存在,则更新它,如果它有不同的校验和)已经需要几分钟以上的时间,因为文件加载大约需要10-15秒(PER file!),所以使用相同的方法检查数据库中的每一行以确保文件仍然存在是不可能的。这将需要几天的时间才能完成,到那时,文件可能已经被再次移动/删除/重命名。

如果你认为服务器是一个分层的环境,那么你会得出结论,只有在PHP中才能真正有效地实现这一点。

一种方法可能是File Alteration Monitor包,它与PHP捆绑在一起,版本高达5.0.5,现在它是PECL扩展。

根据目录的递归方式,可以构建一个哈希数组内容哈希。我认为您还需要在每个目录中放置一个文本文件来跟踪目录重命名。如果文件被重命名为并更新了,将无法跟踪它,但您可以跟踪更新或重命名。

为每个"新"目录生成一个随机散列,并将其放置在每个目录的隐藏文件中。生成directory_hash.filename_hash和文件contents_hash。

示例:

$dir_hash = md5(c:'dir1); //03b3b29430d1bf67ffe51263d270a94c

您可能需要使其更随机,以防删除一个目录并创建另一个同名

因此,在c:''dir1 中放置一个隐藏文件03b3b29430d1bf67ffe51263d270a94c

c: ''dir1''image.jpg

$filename_hash = md5(image.jpg); //0d5b1c4c7f720f698946c7f6ab08f687
$contents_hash = md5(file_get_contents(c:'dir1'image.jpg)); 

所以构建你的哈希数组应该是这样的:

$hash_array[$dir_hash][$filename_hash] = $contents_hash;

您可以在目录中循环或在数组中循环时引用此数组。为了实现目标,您需要循环使用这两种方法:已删除文件和目录的数组,新文件和目录。