Запуск команд из PHP exec показывает другой результат, чем из оболочки - PullRequest
1 голос
/ 16 мая 2019

Команда PHP exec не выполняется так же, как взаимодействие с оболочкой.

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

создает только zip-файлы в каталоге temp. Однако (упрощенная версия):

$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.

1 Ответ

2 голосов
/ 16 мая 2019

Я считаю, что команда 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...