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






Разве вы не хотели бы передать «перезагрузку» вместо «перезагрузки»?
Для этого вам нужно будет отредактировать файл sudo, а затем выполнить команду перезапуска, которая используется в вашей системе, используя, конечно, sudo. Если вы дадите подробности, я могу вам сказать, но есть ли у вас доступ к этому? Это размещено? Однако Cron, вероятно, был бы здесь лучшим выбором.
Я использовал cron-скрипт (написанный на PHP, а не запускаемый с веб-сервера), чтобы проверить, работает ли сервер, и перезапустить сервер.
Однако я бы не стал делать это из процесса, созданного сервером, потому что вы знаете, что собираетесь убить родительский процесс, что имеет плохие последствия для дочернего процесса.
Самый простой способ - создать файл / tmp / RESTART_APACHE, который PHP может создать и который проверяет сценарий cron. Если сценарий cron видит файл / tmp / RESTART_APACHE, он выполняет правильный перезапуск Apache.
Использование скрипта cron приведет к задержке (до 60 секунд, если вы запускаете его каждую минуту), но в остальном все должно работать так, как вы хотите.
В зависимости от того, как вы собираетесь это использовать, это может помочь.
(Вероятно, вы захотите использовать каталог, отличный от / tmp /, чтобы установить разрешения и запретить кому-либо на сервере создавать файл.)
Обновлено: См. Комментарий Аарона Х. к этому сообщению. Я согласен с тем, что он говорит: вы действительно хотите быть осторожными, чтобы возможность перезапуска веб-сервера не была общедоступной услугой.
Ограничить доступ к системе, которая может вызвать перезапуск; убедитесь, что файл, запускающий перезапуск, имеет ограничительные разрешения, поэтому только веб-процесс может создать этот файл и, как правило, действовать разумно.
Вы не сказали, как именно будет происходить этот перезапуск? какой код нужно выполнить
@Java PHP - если вы просто пытаетесь перезагрузить конфигурацию, вам нужно только запустить "apachectl graceful" (или "apache2ctl graceful")
Такая штука нарушает стандартную цепочку команд, поскольку apache вызывает php, а не наоборот. Я поддерживаю предложение cron. Просто установите задание cron с достаточными привилегиями для проверки изменений в файле хоста и перезапустите apache, если они будут найдены.
в сможет это сделать, не уверен, что вы можете запланировать до второго, но я предполагаю, что это зависит от реализации
at обычно запускается из cron, так что это не будет быстрее, чем запуск cron, не так ли?
Я сделал это очень точно. Однако это было исключительно для среды разработки, чтобы быстро создать виртуальный хост для наших разработчиков по запросу. Пока работает очень хорошо.
Мой подход заключался в том, чтобы создать нового пользователя в системе, дать этому пользователю права 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 @».
Я бы создал демона для мониторинга каталога с включенными сайтами и перезапуска Apache при добавлении или изменении файлов. Тогда вам не нужно ждать до 60 секунд, как при работе cron.
Важно добавить, что это очень плохая идея, если служба (PHP) вообще доступна снаружи ... То, что перезапускает ваши веб-службы, должно использоваться только администраторами, иначе вы откроете дверь для целого ряда возможность компрометации вашего сервера.