Может ли PHP перезапустить Apache?

У меня есть локальный сервер, который должен внести изменения в файл конфигурации apache виртуальных хостов, а затем перезапустить apache, чтобы новая конфигурация вступила в силу.

Может ли PHP это сделать? Я попробовал passthru и exec, но они не сработали. Может быть, проблема в том, что я пытаюсь перезапустить родительский процесс PHP?

Спасибо за любую помощь!

Ответы

Ответ 1

Я использовал cron script (написанный на PHP, не выполненный с веб-сервера), чтобы проверить, что сервер встал и перезапустил сервер.

Однако я бы не сделал этого из процесса, созданного сервером, потому что вы знаете, что собираетесь убить родительский процесс, что имеет плохие последствия для ребенка.

Самый простой способ - создать файл /tmp/RESTART _APACHE, который может создать PHP, и который проверяет cron script. Если cron script видит файл /tmp/RESTART _APACHE, то он делает правильный перезапуск Apache.

Использование cron script приведет к задержке (до 60 секунд, если вы запустите ее каждую минуту), но кроме того, что должно работать так, как вы хотите.

В зависимости от того, как вы собираетесь использовать это, это может сделать трюк.

(Вероятно, вы захотите использовать другой каталог, чем /tmp/, чтобы установить разрешения и запретить кому-либо на сервере возможность создавать файл.)

EDIT: см. комментарий Aaron H к этому сообщению. Я согласен с тем, что он говорит: вы действительно хотите быть осторожным, что возможность перезапуска вашего веб-сервера не является общедоступной услугой.

Ограничить доступ к системе, которая может инициировать перезапуск; убедитесь, что файл, запускающий перезапуск, имеет ограничительные разрешения, поэтому только веб-процесс может создать этот файл и, как правило, быть умным.

Ответ 2

Я сделал это очень точно. Однако это было исключительно для среды разработки, для быстрого создания виртуального хоста для наших разработчиков по требованию. До сих пор хорошо подготовлен.

Мой подход состоял в том, чтобы создать нового пользователя в системе, предоставить этому пользователю права sudo для перезагрузки apache и из Apache- > PHP. Я использовал SSH для localhost с авторизованным ключом без кодовой фразы для этого пользователя, выдавая команду.

Причиной этого было то, что я не хотел давать пользователю apache (обычно www-data) власть вообще перезагружать себя. Я назвал нового пользователя wwwctrl.

Используемая мной команда:

ssh -i /path/to/key-file [email protected] sudo /etc/init.d/apache2 reload

Мне пришлось выполнить эту команду вручную один раз в качестве пользователя wwwctrl, чтобы добавить локальный ключ хоста в ~ wwwctrl/.ssh/known_hosts.

Я использовал proc_open() для просмотра выполнения команды.

Фактически я создавал партию виртуальных хостов для разных установок Apache в разных системах, поэтому в каждой системе у меня был этот пользователь wwwctrl для перезагрузки Apache, в основном это делал это в "хостах foreach в качестве хоста... wwwctrl @host @".

Ответ 3

Не хотите ли вы передать "перезагрузку" вместо "перезагрузки"?

Ответ 4

Для этого вам нужно будет отредактировать файл sudo, а затем выполнить команду перезапуска, которая используется в вашей системе, используя, конечно, sudo. Если вы сообщите подробности, я могу сказать вам, но у вас есть доступ к этому? Он размещен? Крон, вероятно, был бы лучшим выбором здесь.

Ответ 5

at сможет это сделать, не уверен, что вы можете запланировать до второго, но я думаю, это зависит от реализация

Ответ 6

Я бы создал демона для мониторинга каталога с поддержкой сайтов и перезапуска Apache при добавлении или изменении файлов. Тогда вам не нужно ждать до 60 секунд, как при задании cron.

Ответ 7

Я имею полный контроль над сервером и могу внести любые изменения.

Ответ 8

Эта сортировка нарушает стандартную цепочку команд, поскольку apache вызывает php, а не наоборот. Я второй предлагаю cron. Просто установите задание cron с достаточными полномочиями для проверки изменений в файле хоста и перезапустите apache, если они найдены.

Ответ 9

Было бы здорово, если бы это была мгновенная перезагрузка... но я думаю, я мог бы подождать минуту.

Ответ 10

re at

  • он запускается каждую минуту, поэтому имеет ту же самую задержку 60 секунд
  • запускается cron на большинстве серверов, поэтому не будет быстрее, чем использование cron
  • но это позволит избежать того, что ваш script должен запускаться вообще и проверить наличие файла блокировки

Ответ 11

Я бы предположил, что если ваш script получил доступ к оболочке, вы можете использовать функцию exec() для запуска команды, которая перезапускает apache или сервер.

Ответ 12

вы можете попробовать отредактировать /etc/sudoers и дать тому, кто запускает apache-процесс apache для вашего apache init script... но этот вопрос сейчас полностью раздувает мой разум. Мне любопытно, как и почему..... если вы пытаетесь перезапустить apache через php.. что-то подсказывает мне, что, какую цель вы пытаетесь достичь, вы, вероятно, делаете это неправильно. пожалуйста, напишите назад и сообщите нам, что произошло, им действительно интересно об этом сейчас.

Ответ 13

с shell_exec вы можете (но php должен работать как суперпользователь, что может быть выполнено с suphp)