我有一个本地服务器,需要对虚拟主机Apache配置文件进行更改,然后重新启动Apache以使新配置生效。
PHP能够实现这个吗?我尝试了passthru和exec,但它们没有起作用。也许问题是我在尝试重新启动PHP的父进程?
感谢任何帮助!!
我使用了一个cron脚本(用PHP编写,不从Web服务器执行)来检查服务器是否正常并重新启动服务器。
但是,我不会从服务器创建的进程中执行此操作,因为你知道你即将杀死父进程,这对子进程有不良影响。
最简单的方法是在PHP可以创建的文件/tmp/RESTART_APACHE中,让cron脚本进行检查。如果cron脚本看到文件/tmp/RESTART_APACHE,则会对Apache进行适当的重启。
使用cron脚本将引入一些延迟(如果每分钟运行一次,则最多延迟60秒),但除此之外应该按照您想要的方式工作。
根据您打算如何使用此功能,这可能就能达到目的。
(您可能希望使用与/tmp/不同的目录来设置权限并防止服务器上的任何人都能创建该文件。)
编辑:请参见Aaron H对此帖子的评论。我同意他的观点:确保重启Web服务器的能力不是对公众普遍可用的服务。
限制可以触发重启的系统的访问权限;确保触发重启的文件具有限制性权限,以便只有Web进程才能创建该文件,并且一般要聪明谨慎。
我曾为这个非常准确的事情做过。然而,这仅仅是为了开发环境,以便快速为我们的开发人员按需创建虚拟主机。到目前为止,效果非常好。
我的方法是在系统上创建一个新用户,给这个用户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@”中执行此操作。
你不想传递一个“重新加载”而不是“重新启动”吗?
at 能够做到这一点,不确定是否可以精确到秒进行调度,但我想这取决于具体实现方式。
这种做法违反了标准的命令链,因为Apache调用PHP,而不是相反。我赞同使用cron建议。只需设置一个具有足够权限的cron作业来检查主机文件的更改,并在发现任何更改时重新启动Apache。