PHP exec() не удается получить доступ.файл jar


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

$name = $_POST['name']; 
$email_address = $_POST['email']; 
$date = $_POST['date'];
$time = $_POST['time'];
$message = $_POST['message']; 
$info = array($name, $email_address, $date, $time, $message);

exec('java -jar "C:\SomePathTo\HelloWorld.jar" $info 2>&1' , $output);`
var_dump($output);

И мой Java-код

public class HelloWorld {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}

Когда мой веб-сайт запускает этот код, я получаю следующий вывод/ сообщение об ошибке

array(1) { [0]=> string(197) "Error: Unable to access jarfile C:\SomePathTo\HelloWorld.jar" }

Помогите!

Author: Dan Doyon, 2013-11-13

1 answers

Очевидно, что экранирование обратной косой черты не является проблемой, поскольку в сообщении об ошибке перечислены правильные обратные косые черты. Если бы проблема заключалась в обратных косых чертах, это было бы не так. (Вы использовали одинарные кавычки, которые лишают обратные косые черты их особого значения.)

Кроме того, мы можем заметить, что независимо от того, что сгенерировало сообщение об ошибке, оно знает, что ищет "файл jar". Что, в твоем стеке, это делает? Это не PHP; это не ядро операционной системы. По-видимому, вы запускаем виртуальную машину Java для запуска. Наверное, это хорошо.

Почему виртуальная машина Java не может получить доступ к вашему файлу jar? Возможно, вы неправильно написали его название, но это было бы настолько очевидно, что оно возникло бы, когда вы дважды проверили код. Более вероятно, что это происходит потому, что файл jar находится где-то глубоко в вашем домашнем каталоге (я могу сделать вывод "глубоко" из того факта, что при очистке имени файла вы сохранили длину сообщения об ошибке 197), где пользовательский контекст Виртуальная машина Java не умеет читать. Поскольку вы запускаете PHP через веб-сервер, это будет определяться конфигурацией вашего веб-сервера, но довольно часто используется выделенная учетная запись пользователя с именем что-то вроде "www-данные" или "Интернет-скрипты", под которыми выполняется код. Вы должны выяснить, какой он в вашей системе.

Как только это будет сделано, у вас будет несколько вариантов. Вы можете предоставить пользователю, работающему на вашем PHP (и в данном контексте виртуальной машине Java), доступ на чтение к файлу jar. Как только ваша банка файл хочет получить доступ к другим файлам, вам также потребуется разрешить этой учетной записи пользователя также получать доступ к этим файлам. (Просто убедитесь, что он не может перезаписать или удалить что-либо важное.) В качестве альтернативы вы можете перенастроить свой веб-сервер (или попросить администратора вашего веб-сервера), чтобы он запускал сценарии, написанные вами в контексте вашего пользователя.

 3
Author: dig, 2013-11-13 22:54:14