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

时间:2014-09-26 07:38:19

标签: php mysql file

首先是一些背景信息:

我正在尝试编写仅使用PHP的应用程序,因此拒绝对服务器进行任何更改。出于安全考虑,Exec()和喜欢的东西都被关闭了。服务器在PHP 5.3上运行,MySQL(通过PDO)是使用的数据库。

应用程序现在需要跟踪几个文件,并将某些文件格式(pdf,doc,docx,xl​​sx,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为空,因此不会搜索。将来,这些行将消失。所有这些信息目前已被编入索引,因此如果需要,可以在答案中使用。

然后问题:

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

2 个答案:

答案 0 :(得分:1)

如果您将服务器视为分层环境,那么您将得出结论,仅在PHP中没有真正有效的方法来实现它。

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

答案 1 :(得分:0)

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

为每个“新”目录生成随机哈希,并将其放在每个目录的隐藏文件中。生成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;

您可以在循环浏览目录时或在数组中循环时引用此数组。您需要循环使用两者来实现目标,删除文件和目录的数组,新文件和目录的目录。