Почему код для выполнения внешней программы из консоли работает а при его выполнении из браузера - нет?
У меня есть программа для разброса слов предназначенных для заучивания a.out написана она на Си. Порылся в документации нашел функцию exec() для выполнения программ написанных не на php. Проблема в том что когда я запускаю код через браузер внешняя программа не запускается на выполнение, а когда запускаю код из консоли все работает.
Вот мой код, который я использую для работы из браузера:
<?php
$path = explode('/', $_SERVER['REQUEST_URI']);
if($path[1] == 'link')
exec('./a.out');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<a href="link">link</a>
<p>$path[1] = <?= $path[1] ?></p>
</body>
</html>
А вот код который я запускаю из терминала, так как переменная $_SERVER из консоли недоступна - ее я просто убираю вместе с условием.
<?php
exec('./a.out');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<a href="link">link</a>
<p>$path[1] = <?= $path[1] ?></p>
</body>
</html>
Как мне запустить внешнюю программу?? Я знаю что php язык однопоточный - но и код у меня последовательный без какого либо распараллеливания. Не понимаю почему не работает.
Ответы (1 шт):
При использовании функции exec() для внешних программ особенно тех что были написаны собственноручно - необходимо четко понимать что делает вызываемая программа. В данном случае вызываемая программа a.out нацелена на рандомный разброс слов в файлах NW.txt - для новых слов, и TNW.txt - для соответствующего перевода этих слов.
Для того чтобы понимать что происходит на самом деле введем в терминале команду whoami - в моем случае я получаю имя пользователя reiji вызвавшего эту команду, теперь посмотрим от чьего имени вызываются программы запускаемые через apache. В файле index.php записываем инструкцию var_dump(exec('whoami')) - в моем случае результат www-data.
Поскольку программа a.out не просто редактирует содержимое файлов, а полностью пересоздает файл с тем же именем - то для успешного завершения работы этого цикла нужно:
- дать разрешение пользователю на работу в данном каталоге
sudo chmod -R 755 (тут ваш файл или файлы) - дать разрешение на запуск внешнего исполняемого файла
sudo chmod 755 (исполняемый файл) - установить разрешение на запись используемых внешних файлов
sudo chmod 752 (перезаписываемый файл)