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,但具有完整路径var
和www
(这将产生myfolder
的两个副本,因此我的文件是所需文件的两倍)。 $return
具有与命令行执行相同的输出。两者都只压缩了15个文件目录/文件夹。在PHP输出中没有提到var
或www
。
答案 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);