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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Команда, которую я использовал, была:

ssh -i /path/to/key-file wwwctrl@localhost sudo /etc/init.d/apache2 reload 

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

Я использовал proc_open (), чтобы наблюдать за исполнением команды.

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

Разве вы не хотите передавать «перезагрузку» вместо «перезагрузки»?

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

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

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

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

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

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

повторно на

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

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

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

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