Функции PHP system () и exec () не работают с временными файлами

Я использую функцию system() в PHP для вызова программы CLI, которую мне нужно использовать, которая в настоящее время недоступна из PHP (код ниже). Я использую CLI xml2brl (liblouisxml) для создания выходного файла, который содержит текст ASCII Брайля. Используя приведенный ниже код, эти два файла успешно создаются, и первый файл имеет удобный для него текст ввода; однако выходной файл (второй файл) никогда не получает переведенный текст.

Вот странная часть. Используя ту же команду, которая передается system() и тем же временным файлам, которые я создаю в PHP, я могу успешно запустить эту команду в качестве моего пользователя в терминале. Что может быть вызвана этой проблемой? Когда я запускаю команду whoami через system() , я получаю своего пользователя, и никаких специальных разрешений не требуется ни для временного файла, ни для команды CLI xml2brl .

В настоящее время я создаю два временных файла в PHP:

 //Create the temporary files that will be passed to xml2brl $_standardText = tempnam("~/tmp", "pll_"); $_translatedText = tempnam("~/tmp", "pll_"); 

Временные файлы хранятся в / private / tmp и имеют для них префикс pll_ , чтобы идентифицировать файлы, pll_ PHP-скриптом.

Затем я пишу содержимое переданного текста в файл temp следующим образом:

 //Write the contents of the passed text to the temp file $handle = fopen($_standardText, "w"); fwrite($handle, $text); fclose($handle); 

Теперь файл temp, расположенный в /private/tmp/xxxx имеет текст, написанный на нем (проверено это), а затем я иду вперед и отформатирую команду:

 $command = escapeshellcmd("xml2brl -p" . " " . $_standardText . " " . $_translatedText); 

У этого формата есть такой формат, когда он повторяет переменную $ command:

 xml2brl -p /private/tmp/pll_MYRy9m /private/tmp/pll_DmiK7E 

И идите вперед и запустите команду exec, которая должна обработать входной файл и записать переведенный текст в выходной файл, но это не так:

 exec($command); 

Теперь, вот странная часть … когда я пытаюсь сделать только ls , я могу получить список каталогов из своего домашнего каталога и повторить это через PHP-скрипт, что означает, что у меня должен быть доступ для запуска системы и exec команды с Apache, но всякий раз, когда эта команда запускается, она не работает. Однако, когда я не удаляю временные файлы и использую ту же созданную PHP команду ( xml2brl -p /private/tmp/pll_MYRy9m /private/tmp/pll_DmiK7E ) и временные файлы в CLI, я могу запускать их под моим пользователь.

Solutions Collecting From Web of "Функции PHP system () и exec () не работают с временными файлами"

Первое, что вы должны сделать (убедившись, что ваш скрипт может запускать простые команды, такие как /bin/ls ), полностью использует аргументы exec() :

 exec($command, $out, $code); if ($code) { // an error occurred while running the command } 

Во-вторых, убедитесь, что пути верны. xml2brl может быть на вашем пути, но, возможно, не на пути вашего скрипта:

 $command = '/usr/bin/xml2brl -p ' . escapeshellarg($_standardText); exec($command, $out, $code); if ($code) { die("An error occurred while attempting torun xml2brl"); } else { echo "Output was: ", join("\n", $out); } 

Если это все еще не работает, вы можете перенаправить stderr :

 exec("$command 2>&1", $out, $code); 

Включить error_reporting (E_ALL); в начале скрипта, чтобы увидеть, есть ли какие-либо предупреждения, которые вы не заметили. chmod xml2brl – 777, чтобы обеспечить его выполнение. Просто из любопытства, где находится xml2brl? убедитесь, что apache имеет доступ к этому каталогу. Вы сказали, что можете сделать это самостоятельно через термин, вы уверены, что apache сделал эти файлы, если вы тоже делали это вручную?

Убедитесь, что apache имеет доступ на чтение и запись к временным файлам и убедитесь, что у apache есть доступ и разрешение на выполнение xml2brl.

сначала попробуйте включить полный путь для xml2brl в своей команде и сообщите нам об этом. что-то вроде

 $command = escapeshellcmd("/opt/local/bin/xml2brl -p" . " " . $_standardText . " " . $_translatedText);