PHP可以重启Apache吗?

15

我有一个本地服务器,需要对虚拟主机Apache配置文件进行更改,然后重新启动Apache以使新配置生效。

PHP能够实现这个吗?我尝试了passthru和exec,但它们没有起作用。也许问题是我在尝试重新启动PHP的父进程?

感谢任何帮助!!

7个回答

18

我使用了一个cron脚本(用PHP编写,不从Web服务器执行)来检查服务器是否正常并重新启动服务器。

但是,我不会从服务器创建的进程中执行此操作,因为你知道你即将杀死父进程,这对子进程有不良影响。

最简单的方法是在PHP可以创建的文件/tmp/RESTART_APACHE中,让cron脚本进行检查。如果cron脚本看到文件/tmp/RESTART_APACHE,则会对Apache进行适当的重启。

使用cron脚本将引入一些延迟(如果每分钟运行一次,则最多延迟60秒),但除此之外应该按照您想要的方式工作。

根据您打算如何使用此功能,这可能就能达到目的。

(您可能希望使用与/tmp/不同的目录来设置权限并防止服务器上的任何人都能创建该文件。)

编辑:请参见Aaron H对此帖子的评论。我同意他的观点:确保重启Web服务器的能力不是对公众普遍可用的服务。

限制可以触发重启的系统的访问权限;确保触发重启的文件具有限制性权限,以便只有Web进程才能创建该文件,并且一般要聪明谨慎。


重要的是要指出,如果服务(PHP)在外部可用,这是一个非常糟糕的想法...重新启动您的Web服务应该只由管理员使用,否则您将打开许多机会,使您的服务器受到威胁。 - Aaron H.
你没有说重启应该如何完成?需要执行哪些代码? - Ali
2
@Java PHP - 如果你只是想重新加载配置文件,你只需要运行 "apachectl graceful"(或者 "apache2ctl graceful")。 - Chris Burgess

13

我曾为这个非常准确的事情做过。然而,这仅仅是为了开发环境,以便快速为我们的开发人员按需创建虚拟主机。到目前为止,效果非常好。

我的方法是在系统上创建一个新用户,给这个用户sudo权限以重新加载Apache,并从Apache->PHP使用SSH连接到具有授权密钥但没有密码的本地主机,发出命令。

之所以这样做,是因为我不想让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 hosts as host do ... wwwctrl@host@”中执行此操作。


1
我会创建一个守护进程来监视 sites-enabled 目录,并在添加或修改文件时重新启动 Apache。这样,您就不必像使用 cron 作业一样等待长达60秒的时间了。

1

你不想传递一个“重新加载”而不是“重新启动”吗?


1
要做到这一点,您需要编辑sudo文件,然后使用sudo执行在您的系统上使用的重启命令。如果您提供详细信息,我可以告诉您,但是您是否有权限这样做呢?它是托管的吗?在这种情况下,Cron可能是更好的选择。

1

at 能够做到这一点,不确定是否可以精确到秒进行调度,但我想这取决于具体实现方式。


这通常是从cron运行的,所以这不会比运行cron更快,对吧? - Chris Burgess

0

这种做法违反了标准的命令链,因为Apache调用PHP,而不是相反。我赞同使用cron建议。只需设置一个具有足够权限的cron作业来检查主机文件的更改,并在发现任何更改时重新启动Apache。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接