我在一些PHP代码中遇到了一个非常奇怪的异常,我需要一些帮助来弄清楚这里发生了什么。
用户有一个文件目录,PHP将所有文件的名称和内容中继到网页。
它会检测scandir
的文件并使用fopen
读取它们。
另一个PHP文件能够通过unlink
删除这些文件,这是通过JavaScript AJAX请求调用的。
在测试过程中,我创建了一个名为_.txt
的文件,后来将其与上述unlink
文件一起删除。
这是事情变得非常奇怪的地方。
在我的工作区的文件浏览器中,_.txt
文件已消失。
在Bash终端中使用ls
表示_.txt
文件已消失。
但是PHP scandir
仍然检测到该文件,fopen
能够成功读取其内容。
从这一点开始,我通过Bash终端使用touch _.txt
我用nano _.txt
PHP正确检测文件并读取新_.txt
文件的内容。
然后我用rm _.txt
现在PHP仍然检测到_.txt
文件并且仍然会读取旧 _.txt
文件的内容。
为了使这个问题更奇怪,我不会通过这些PHP命令创建和删除任何其他文件。只有这一个文件_.txt
给了我所有这些麻烦。
自从这个开始发生以来,我已多次重启服务器。
我在网上看了一遍,找不到任何相关内容。
负责扫描和阅读文件的代码段:
$username = $_COOKIE['username'];
/*
password checks ommited as it's not relevant
*/
$directory = scandir('USERFILES/'.$username);
foreach($directory as $filename){
// do not select . and ..
if($filename != '.' && $filename != '..'){
// by default this remains an empty string
$fileusesunderscore = '';
// if invalid characters start the filename
if(strpos('0123456789.,-[]/+=\\`"\'!*:|@#%^&()<>?|;~', $filename[0]) !== false){
// set the empty string to underscore
$fileusesunderscore = '_';
}
// grab the file contents
$file = fopen('USERFILES/'.$username.'/'.$filename, 'r');
/*
line at this position is responsible for echo'ing the file
it is ommited as it is irrelevant, except that $fileusesunderscore is used like so when echoing:
$fileusesunderscore.pathinfo($filename, PATHINFO_FILENAME)
*/
fclose($file);
}
}
负责删除文件的代码段:
$username = $_COOKIE['username'];
// filename can only possibly equal a name that was
// given to the JS by the first PHP file
$filename = $_POST['file'];
/*
password checks ommited as it's not relevant
*/
$filepath = '/USERFILES/'.$username.'/'.$filename.'.txt';
unlink(getcwd().$filepath);
所以我想总结一下,这就是我遇到麻烦并需要帮助才能实现:
名为
_.txt
的文件已通过unlink
删除,不再存在。
scandir
仍然可以看到它,fopen
仍会看到其内容。我无法使用Bash
rm
删除文件,因为_.txt
已不存在。我正在尝试做的是成功摆脱此文件并防止再次发生这种情况。
我一直在寻找解决方案的所在地,找不到一个,所以我在这里寻求帮助。感谢您花时间来帮助解决这个问题。