Проблема при запуске приложения из PHP-скрипта в среде Linux - PullRequest
1 голос
/ 27 июня 2011

Недавно я написал программу на C, которая должна работать в среде Linux следующим образом:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    system("notify-send -u normal -t 200 'You Have received a new message'");
    system("cvlc /home/ashenafis/Music/BabyMessage.mp3");
    return 0;
}

Скомпилировал ее и сохранил исполняемый файл в "/usr/sbin/play".

Когда я запускаю его из терминала, он работает нормально, однако он не работает, когда я пытаюсь запустить его из сценария PHP, используя

<?php exec("/usr/sbin/play"); ?>

Что-то мне не хватает?Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 22 декабря 2011

Имейте в виду, что это будет попытка работать от имени любого пользователя веб-сервера, который, скорее всего, ограничен по соображениям безопасности.Например, на моей машине (Ubuntu), использующей Apache, это пользователь с именем www-data.Вы можете использовать команду 'su', чтобы попробовать запустить программу от имени этого пользователя и, возможно, увидеть, в чем проблема.Если вы не знаете пароль для этого пользователя, запустите команду su от имени пользователя root.

su -c /path/your/program www-data

Если подумать, я очень сомневаюсь, что пользователь веб-сервера имеет доступ к двоичным файлам системыто есть что-нибудь в /usr/sbin.Возможно, лучше в /var/www/cgi-bin или что-то в этом роде.

0 голосов
/ 29 июня 2011

Я не знаю, что это излишнее, но вы можете попробовать SWIG, а именно: инструмент разработки программного обеспечения, который соединяет программы, написанные на C и C ++, с различными языками программирования высокого уровня.

Здесь вы можете увидеть поддерживаемые языки http://www.swig.org/compat.html#SupportedLanguages,, что поддерживается PHP. Я думаю, это то, что вы ищете.

0 голосов
/ 29 июня 2011

notify-send и cvlc могут быть не по пути, известному PHP. Попробуйте заставить программу C ссылаться на них по полному имени файла. Также убедитесь, что соответствующие вещи имеют разрешение o + x.

0 голосов
/ 27 июня 2011

Вы можете попробовать использовать оператор backtick , который выполняет оболочку, которая затем вызывает программу, вместо непосредственного вызова программы.Код будет такой:

<?php echo `/usr/sbin/play`; ?>
...