Почему код для выполнения внешней программы из консоли работает а при его выполнении из браузера - нет?

У меня есть программа для разброса слов предназначенных для заучивания 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 шт):

Автор решения: Reiji Akkerman

При использовании функции exec() для внешних программ особенно тех что были написаны собственноручно - необходимо четко понимать что делает вызываемая программа. В данном случае вызываемая программа a.out нацелена на рандомный разброс слов в файлах NW.txt - для новых слов, и TNW.txt - для соответствующего перевода этих слов.

Для того чтобы понимать что происходит на самом деле введем в терминале команду whoami - в моем случае я получаю имя пользователя reiji вызвавшего эту команду, теперь посмотрим от чьего имени вызываются программы запускаемые через apache. В файле index.php записываем инструкцию var_dump(exec('whoami')) - в моем случае результат www-data.

Поскольку программа a.out не просто редактирует содержимое файлов, а полностью пересоздает файл с тем же именем - то для успешного завершения работы этого цикла нужно:

  1. дать разрешение пользователю на работу в данном каталоге sudo chmod -R 755 (тут ваш файл или файлы)
  2. дать разрешение на запуск внешнего исполняемого файла sudo chmod 755 (исполняемый файл)
  3. установить разрешение на запись используемых внешних файлов sudo chmod 752 (перезаписываемый файл)
→ Ссылка