【问题标题】:Can PHP restart Apache?PHP可以重启Apache吗?
【发布时间】:2009-01-08 20:16:04
【问题描述】:

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

PHP 可以做到这一点吗?我尝试了 passthru 和 exec 但他们没有工作。也许问题是我正在尝试重新启动 PHP 的父进程?

感谢您的帮助!!

【问题讨论】:

    标签: php apache


    【解决方案1】:

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

    但是,我不会从服务器创建的进程中执行此操作,因为您知道您将要终止父进程,这对子进程有不好的影响。

    最简单的方法是创建一个 PHP 可以创建的文件 /tmp/RESTART_APACHE,并且 cron 脚本会检查该文件。如果 cron 脚本看到文件 /tmp/RESTART_APACHE,那么它会正确重启 Apache。

    使用 cron 脚本会引入延迟(如果您每分钟运行它,最多会延迟 60 秒),但除此之外应该可以按您的意愿工作。

    根据您打算如何使用它,这可能会奏效。

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

    编辑:请参阅 Aaron H 对这篇文章的评论。我同意他的说法:您确实要小心,重新启动网络服务器的能力不是公众普遍可用的服务。

    限制对可以触发重启的系统的访问;确保触发重启的文件具有限制性权限,因此只有 Web 进程可以创建该文件,并且通常是智能的。

    【讨论】:

    • 重要的是要补充一点,如果服务 (PHP) 在外部完全可用,这是一个非常糟糕的主意...重启 Web 服务的东西只能由管理员使用,否则你打开一扇门,让您的服务器受到攻击。
    • 你没有说这个重启到底是怎么做的?需要执行什么代码
    • @Java PHP - 如果你只是想重新加载配置,你只需要运行“apachectl graceful”(或“apache2ctl graceful”)
    【解决方案2】:

    我已经这样做了。然而,它仅用于开发环境,为我们的开发人员按需快速创建虚拟主机。到目前为止工作得非常愉快。

    我的方法是在系统上创建一个新用户,赋予该用户 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 hosts as host do ... wwwctrl@host @"。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        为此,您需要编辑 sudo 文件,然后执行系统上使用的重启命令,当然使用 sudo。如果您提供详细信息,我可以告诉您,但是您甚至可以这样做吗?是托管的吗?不过,Cron 在这里可能是更好的选择。

        【讨论】:

          【解决方案5】:

          at 将能够做到这一点,不确定您是否可以安排到第二个,但我想这取决于实施

          【讨论】:

          • at 通常是从 cron 运行的,所以这不会比运行 cron 快吗?
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            这种事情违反了标准的命令链,因为 apache 调用 php,而不是相反。我支持 cron 建议。只需设置一个具有足够权限的 cron 作业来检查主机文件的更改,如果发现任何更改,请重新启动 apache。

            【讨论】:

              猜你喜欢
              • 2011-05-02
              • 2011-07-11
              • 1970-01-01
              • 2010-09-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-08
              • 1970-01-01
              相关资源
              最近更新 更多