PHP可以';在fclose之后,请不要取消文件链接
脚本完成后,我可以删除文件,但在文件运行时,即使在执行PHP可以';在fclose之后,请不要取消文件链接,php,fopen,unlink,rm,fclose,Php,Fopen,Unlink,Rm,Fclose,脚本完成后,我可以删除文件,但在文件运行时,即使在执行fclose()。以下是我尝试使用的代码: $Files = glob("$_SERVER[DOCUMENT_ROOT]/files/*.csv"); $File = fopen($Files[0], "r"); //while (($Data = fgetcsv($File)) !== false) {... $i = 0; while (is_resource($File))
fclose()。以下是我尝试使用的代码:
$Files = glob("$_SERVER[DOCUMENT_ROOT]/files/*.csv");
$File = fopen($Files[0], "r");
//while (($Data = fgetcsv($File)) !== false) {...
$i = 0;
while (is_resource($File)) {
$i && sleep(1);
echo "Closing handle.\n";
fclose($File);
if (++$i > 5)
die("Could not close handle.");
}
foreach ($Files as $File) {
$i = 0;
while (file_exists($File)) {
$i && sleep(1);
echo "Deleting file.\n";
@unlink($File);
echo 'www-data@debian:~$ ', $Command = "rm -f '$File' 2>&1", "\n", shell_exec($Command);
if (++$i > 5)
die("Could not delete the file.");
}
}
正如您所看到的,我试图通过unlink()
和使用shell命令删除它,但两者都不起作用,这两个命令都给了我以下错误:
rm:无法删除
“invincible file.csv”:
文本文件忙
我也意识到这个脚本可能有点过火,但这纯粹是因为我无法让它以任何方式工作,而一些额外的代码只是为了输出目的,以尝试和调试正在发生的事情 我以前遇到过这个问题,并且能够通过在关闭文件后和取消链接之前强制垃圾收集来解决:
gc_collect_cycles();
到目前为止,这不是最好的解决方案,但它确实解决了我在删除以前打开和关闭的文件时遇到的一个问题。$files
的内容是什么?此外,您还可以在“r”模式下使用fopen
进行读取,并在稍后尝试删除该文件。您确定用户有删除权限吗?也许这是许可问题。尝试在不使用任何其他代码的情况下执行取消链接
。在取消链接
之前删除@
,以便让php告诉您失败的原因。另外,检查fclose
@KodosJohnson的返回值感谢您迄今为止的帮助,我将尝试在根本不使用fopen
的情况下取消链接,并且我在示例中添加了更多的代码,希望我没有遗漏任何更重要的代码parts@chiliNUT我已经做过了,我得到的xdebug输出给出了相同的结果error@KodosJohnson如果我删除fopen
等,它将删除所有文件,而不会出现任何问题。只有当我用PHP脚本打开和关闭文件时,我才能再删除它。哇,我在哪里都找不到这个函数可以在fclose()
之后运行,但是没有任何问题,谢谢你。你认为除此之外,清除缓存(clearstatcache
)是否有助于解决这种溢出问题?@BrianLeishman请在fclose
之前尝试fflush
,而不使用gc\u collect\u cycles
hack?使用touch创建的文件也会出现此问题,同样的解决方案也适用于它。我曾经将一个文件作为互斥对象来处理,以防止同一脚本在同时运行多次时重叠。我无法在脚本末尾取消链接。