我正在开发一个php脚本来自动解压缩和扫描位于外部usb驱动器上的tar.gz文件,我遇到了一些奇怪的问题。一旦脚本找到一个存档文件,它就会尝试在USB驱动器上创建一个临时目录,将存档文件解压缩到。为了保证一个唯一的临时目录名(因为这个脚本可能同时运行多次),我使用当前时间md5的5位随机部分命名文件,如下所示:
$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开始)总是相同的,不管最初的五个字符是什么(介于首字母5和斜线总是一个字母,否则是随机的)。不过,除此之外,我很茫然。
出于某种原因,我用于删除脚本末尾的临时目录的shell_exec("rm -rf $temp");仅在我执行两次时才起作用。如果我只执行一次,就会得到以下错误:rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty,这本身就很奇怪,因为-rf应该覆盖这个错误。此行为也可以在服务器的命令提示符中复制。
我在网上似乎找不到任何与这两个问题相关的东西,所以我希望只是我犯了个愚蠢的错误,而不是我的安装或USB驱动器的问题。提前感谢您的帮助!
编辑:实际上我有第三个问题,可能与第一个有关。在运行shell_exec("tar -xzf")命令来解压缩我的归档文件之后,生成的目录总是附加一些奇怪的字符。例如,对于一个名为boot的压缩目录运行,解压缩的目录在终端中显示为BOOT??w??????.???w???,其echo输出显示为BOOT²w▀╚.∙wâ–€。使用tab将cd命令填充到此目录中时,我得到一个模式几乎相同的字符串:BOOT\302\262w\342\226\200\342\225\2322.\342\210\231w\342\226\200/。99%的情况下,这不会影响脚本的执行,但偶尔会导致脚本扫描目录失败。

最佳答案

对于1,似乎有一些奇怪的角色进入了里面。
在我的机器上试了一下,似乎很管用:

<?php

for($x = 0; $x < 30 ; $x++)
    shell_exec('mkdir ' . substr(md5(microtime()), rand(0, 26), 5));
    sleep(1);

我将变量从引号中分离出来,并用“.”重新添加。
-肯

10-07 21:06