从PHP exec运行命令显示的结果与从Shell显示的结果不同

时间:2019-05-16 15:58:00

标签: php exec

PHP exec命令的执行与外壳程序的交互执行不同。

cd /var/www/myfolder
zip -r /var/www/myfolder/temp/newfile.zip  ./*

仅生成temp目录中的文件zip。但是(简化版):

$zip_dir = '/var/www/myfolder';
$temp_dir = $zip_dir . '/temp/';
chdir($zip_dir);
exec('zip -r ' . $temp_dir . 'newfile.zip ./*', $return);

生成相同的zip,但具有完整路径varwww(这将产生myfolder的两个副本,因此我的文件是所需文件的两倍)。 $return具有与命令行执行相同的输出。两者都只压缩了15个文件目录/文件夹。在PHP输出中没有提到varwww

1 个答案:

答案 0 :(得分:1)

我相信chdir()命令对exec()中的命令的运行方式没有任何影响。因此,这可能会解决它:

$zip_dir = '/var/www/myfolder';
$temp_dir = $zip_dir . '/temp/';
$cmd = 'cd ' . escapeshellarg($zip_dir) . ' && zip -r ' . escapeshellarg($temp_dir . 'newfile.zip') . ' ./*';
exec($cmd, $return);

请注意,我们总是对转义变量进行转义,并将其传递给命令行。

但是为什么不仅仅在PHP中压缩呢?

<?php
$zip_target = "/var/www/myfolder";
$zip_file = "/var/www/myfolder/temp/newfile.zip";


$zip_temp = tempnam(sys_get_temp_dir(), 'a458');
$zip_obj = new \ZipArchive();

if ($zip_obj->open($zip_temp, ZIPARCHIVE::OVERWRITE)) {
    $zip_obj->addGlob("$zip_target/**/*.*");
}
$zip_obj->close();
rename($zip_temp, $zip_file);