PHP exec () выполняет код, но не работает полностью - PullRequest
0 голосов
/ 30 сентября 2019

В некоторой части моего кода я сравниваю 2 файла и выводю разницу в другой файл с помощью функции exec().

В exec функции, которую я использую comm -13 <(sort file_a) <(sort file_b) > output

КогдаЯ запускаю свой PHP-код, он создает выходной файл, но сам файл пуст. Когда я непосредственно копирую и вставляю команду в терминал, она также заполняет файл отличиями, но не заполняет мой выходной файл на php.

Часть кода;

exec('bash -c \'comm -13 <(sort "' . $path_d_raw.$least_recent_raw_file . '") <(sort "' . $path_d_raw.$most_recent_raw_file . '") > test.txt 2>&1\'', $output, $return);

$path_d_raw.$least_recent_raw_file and $path_d_raw.$most_recent_raw_file имеет правильный путь, / файл проверял его сто раз.

Я также пытался использовать shell_exec, но никак не мог это сделать.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Полагаю, это будет проблема побега. Вы должны использовать правильные функции для экранирования аргументов и (в данном случае) команд. Попробуйте это:

<?php
$command = sprintf(
    "comm -13 <(sort %s) <(sort %s) > test.txt 2>&1",
    escapeshellarg($path_d_raw . $least_recent_raw_file),
    escapeshellarg($path_d_raw . $most_recent_raw_file)
);
$escaped_command = escapeshellarg($command);
exec("bash -c $escaped_command", $output, $return);

Мы дважды убегаем, потому что вы передаете саму команду другой оболочке для выполнения.

Я бы также предложил записать файл, расположенный по абсолютному пути, вотдельный каталог. Вас должно беспокоить то, что ваш веб-сервер может выполнять запись в каталог, где хранятся исполняемые сценарии PHP.

0 голосов
/ 30 сентября 2019

Вы можете напрямую сравнивать размеры файлов с помощью функции filesize (), вы также можете отобразить значение.

    <?php

// outputs e.g.  somefile.txt: 1024 bytes

$filename = 'somefile.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';

?>

https://www.php.net/manual/ro/function.filesize.php

...