не работают php фукции exec() system()

Столкнулся с проблемой, когда при запуске php скрипта через браузер функция exec() и system() не отрабатывала. Пробовал запускать сами команды через shell оболочку на сервере — все работает. Запускаю следующей командой скрипт с функцией exec() и все работало:

/usr/bin/php testexec.php

Опять пробовал через браузер — безрезультатно. Решение проблемы оказалось не таким уж и сложным, надо выключить safe_mode на сервере или в аккаунте, то есть поставить:


safe_mode = Off

Для начала, надо определить, точно ли проблема из безопасным режимом (safe_mode On). Для этого создадим файлик в аккаунте, который назвем info.php. Помещаем в этот файл следующий код и сохраняем:

<?php

phpinfo();

?>

При просмотре файла через браузер (например http://yourdomain.com/phpinfo.php) вы увидите настройки для php на Вашем сервере, а точнее для аккаунта, где находится созданный файл. Большинство из них возможно изменить только для одного аккаунта, используя файл php.ini или .htaccess. Значит так, находим там переменную «safe_mode» и смотрим, что напротив нее стоит. Например, может стоять следующее:

safe_mode On Off

или так:

safe_mode On On

Первый слева «On» (или может быть выключен «Off» но в нашем случае он включен) показывает, что безопасный режим пхп (safe_mode) включен для аккаунта. Второй «On» или «Off» показывает или включен он для всего сервера в глобальном конфигурационном файле php.ini.
Дело в том, что когда PHP работает в режиме safe_mode — exec(), system() и другие функции для выполнения системных команд и программ не выполняют программы или команды, которые находятся вне директории, указанной в пхп переменной safe_mode_exec_dir. Проверить значение этой переменной (то есть путь к директории) можем тоже через info.php файл. Она может быть вообще не указана и пуста.
В общем все просто, создать файл php.ini в директории, где будет находится скрипт и добавить в него следующее:

safe_mode = Off

Естественно сразу проверяем через info.php файлик или точно отключили. Например, если php используется просто как модуль апача, то изменения надо производить через .htaccess файл. То есть, если после выше описанных действий переменная safe_mode остается в режиме On (через info.php смотрим) тогда пробуем добавить следующую строчку в .htaccess файл:

php_flag safe_mode Off

Сохраняем и проверяем через info.php или все получилось. Если выдает ошибку сервера 500, то строку надо удалить с файла .htaccess. У меня, например на этом этапе ничего не изменилось.
А причиной тому есть использование панели управления Plesk на сервере.
Так вот, дальше опишу решение этой проблемы для пользователей панели управления Plesk на ОС Linux :-). Оказывается для всех поддоменов плеск прописал в конфигурационном файле апача следующую строчку:

php_flag safe_mode = On

Выглядит это примерно так:

<Directory /var/www/vhosts/domainname.com.subdomains/subdomain/httpddocs>

php_flag safe_mode = On


</Directory>

Это можем увидеть в конфигурационном файле апача главного домена, где прописаны виртуальные хосты для всех поддоменов. В этом файле находим виртуальный хост для поддомена или домена и выключаем там safe_mode. Файл примерно находится тут:

/var/www/vhosts/domainname.com/conf/conf.include

Находим выше описанную строчку из «safe_mode» в виртуальном хосте домена и меняем ее на следующую:

php_flag safe_mode = Off

Вот собственно и все, на этом этапе проблема была решена.

6 comments on “не работают php фукции exec() system()

  1. Berg 29.05.2009 20:37

    Отличная статья !

  2. deo 29.05.2012 13:08

    Да. Спасибо!!!

  3. Антон 17.09.2012 00:06

    Не работает

  4. admin 19.09.2012 20:14

    еще могут быть на сервере данные функции прописаны в php.ini серверном в disable_functions = параметре, тогда их надо оттуда удалить и перезагрузить веб-сервер. Если это хостинг — обратитесь к хостеру.

  5. Владимир 21.04.2013 08:03

    Нобелевскую премию за статью! Голосуем. С этим safe_mode так хрен бы разобрался

  6. Ринат 20.08.2015 17:04

    Да, статья просто супер, большое спасибо!

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>