Может ли 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)