的奇怪问题我正在研究一个PHP脚本来自动解压缩和扫描位于外部USB驱动器上的tar.gz存档,而且我遇到一些奇怪的问题,一旦脚本找到一个档案,它会尝试在USB驱动器上创建一个临时目录来解压档案,为了保证唯一的临时目录名称(因为这个脚本可能同时运行多次)我使用当前时间的MD5的随机5位部分为文件命名,例如:PHP:shell_exec(“mkdir”)和shell_exec(“rm -rf)
$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);
因为USB驱动器未安装在服务器文件系统,我无法使用PHP的内置文件管理命令(mkdir(),glob()等),而只能使用exec()或shell_exec()执行的终端命令与文件系统交互。因此,实际创建上述名称的临时目录,我用一个基本的终端mkdir命令:
shell_exec("mkdir $temp");
接下来,我解压存档到临时目录:
shell_exec("tar -xzf $archivePath -C $temp");
最后,在完成存档分析后,删除临时目录及其内容:
shell_exec("rm -rf $temp");
不过,我遇到了个怪问题:
偶尔,也许就是每五只奔跑的,临时目录与一个已损坏的名称创建。当使用
ls directory
显示时,它看起来像06191v??????.???v???
。但是,使用Tab键自动填充cd
命令时,它会填充更长的字符串,如06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/
。我知道在将字符串传递给shell_exec()之前该字符串没有问题(我甚至试图使用substr()将其限制为正确的长度,但无济于事),并且第一个斜杠后面的一系列字符(从342开始)始终是相同的,不管最初的五个字符是什么(最初的五个字符和斜杠之间的字符总是一个字母,但是在其他情况下是随机的)。但是,除此之外,我很茫然。由于某种原因,我用来删除脚本末尾的临时目录的
shell_exec("rm -rf $temp");
只有在执行两次时才有效。如果我只执行一次,我会得到以下错误:rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty
,这本身很奇怪,因为-rf
应该重写此错误。此行为也可以在服务器的命令提示符中重复。
我似乎无法找到与这些问题之一在网上任何东西,所以我希望这只是我做出愚蠢的错误,而不是与我的安装或USB驱动器有问题。预先感谢任何帮助!
编辑:我其实有第三个问题,可能与第一个问题有关。运行shell_exec("tar -xzf")
命令解压缩我的压缩文件后,生成的目录总是附加了一些奇怪的字符。例如,对于名为BOOT的压缩目录执行一次运行,解压缩的目录在终端中显示为BOOT??w??????.???w???
,其回显输出显示为BOOT²w▀╚.∙wâ–€
。在使用Tab键填写cd
命令到这个目录后,我得到一个几乎相同模式的字符串:BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/
。 99%的时间,这不影响脚本的执行,但偶尔它会导致脚本无法扫描目录。
这个问题是我需要能够将临时目录的名称保存到一个变量(我可以使用终端命令找到它,但似乎不必要地迂回)。我尝试过这样:'shell_exec(“mkdir”。$ temp);'但它似乎没有什么区别。 – NinjaBlob
你可以直接回显$ temp变量吗?我的猜测是一些非ASCII字符正在进入。 –
我试过了,但我仍然遇到同样的问题: 'ob_start(); echo $ temp; $ temp = ob_get_clean();' – NinjaBlob