У меня есть локальный сервер, который должен внести изменения в конфигурационный файл виртуальных хостов 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, если они есть.
Было бы здорово, если бы это могло быть мгновенной перезагрузкой … но я думаю, я мог подождать минуту.
повторно на
Я предполагаю, что если ваш скрипт получил доступ к оболочке, вы можете использовать функцию exec()
для запуска команды, которая перезапускает apache или сервер.
вы можете попробовать отредактировать / etc / sudoers и дать тому, кто запускает apache-процесс apache, в ваш сценарий инициализации apache … но этот вопрос полностью раздувает мой разум прямо сейчас. Мне любопытно, как и почему ….. если вы пытаетесь перезапустить apache через php .. что-то подсказывает мне, что, какую цель вы пытаетесь достичь, вы, вероятно, делаете это неправильно. пожалуйста, напишите назад и сообщите нам, что произошло, им действительно интересно об этом сейчас.
с shell_exec вы можете (но php должен быть запущен как суперпользователь, что может быть выполнено с suphp)