【问题标题】:What are the performance implications of a php script calling 'exit'?调用“退出”的 php 脚本对性能有何影响?
【发布时间】:2009-11-24 21:31:31
【问题描述】:

我多次注意到一些 php 脚本退出的地方。在我看来,这将强制退出 httpd/apache 子节点(当然,如果下一个请求需要,另一个将启动)。

但在 CMS 中,下一个请求将需要整个 init.php 初始化,当然首先需要清理和启动 php。

似乎php文件通常以

开头
if ( !defined( 'SMARTY_DIR' ) ) {
include_once( 'init.php' );
}

这表明有人在想象一个 php 进程将服务于多个请求。但是如果每个脚本都退出,那么每个 php/apache 进程将只服务一个请求。

对于移除许多退出调用(尤其是从最常调用的脚本,如 index.php 等)以允许一个进程处理多个请求的性能和安全影响有何想法?

谢谢,彼得

--附录--

感谢您的回答。那个(php 永远不会服务超过一个请求)是我最初的想法,直到上周,当我调试一个只能在一个脚本中设置的配置变量(因为路径的设置方式)但仍然在另一个脚本中设置(这是在一个大约 20 次点击/秒的网络服务器上)。在那种情况下,我在一个脚本中没有一个 php 退出调用,它的配置设置略有不同。但是,当我将 php 退出调用添加到那个脚本(在备用目录中)时,这解决了我在主目录中的所有主脚本中遇到的错误配置(这是由于错误地设置了 css 目录变量,在以前页面执行)。所以现在我再次感到困惑,因为到目前为止所有的答案都说,php 永远不应该服务多个请求。

【问题讨论】:

    标签: php performance


    【解决方案1】:

    exit 对 Apache 进程没有任何作用(它当然不会杀死工人!)。它只是结束 PHP 脚本的执行并将执行返回 Apache 进程,该进程会将结果发送到浏览器并继续处理下一个请求。

    您摘录的 Smarty 代码与服务多个请求的 PHP 进程没有任何关系。它只是确保 Smarty 始终被初始化 - 如果 PHP 脚本可能包含在另一个脚本中或直接访问,这很有用。

    【讨论】:

      【解决方案2】:

      我认为您的困惑来自include_once 的用途。 PHP 基本上是一个“无共享”系统,其中没有真正的持久服务器对象。 include_once 并不意味着每个 Apache 子节点一次,而是每个 Web 请求一次。

      如果您将同一个文件包含两次,PHP 可能会出现问题。例如,具有特定名称的函数只能定义一次。这导致人们为每个包含的文件实现一次旧 C #ifndef-#define-#include 习惯用法的副本。 include_once 是解决此问题的方法。

      【讨论】:

        【解决方案3】:

        即使您不调用 exit,您的 PHP 脚本仍将结束执行,此时任何生成的 HTML 都将返回到 Web 服务器以发送到您的浏览器。

        exit 关键字允许您向 PHP 引擎发出信号,表明您的工作已完成,无需进行进一步处理。

        另请注意,exit 通常用于错误处理和流程控制 - 从包含中删除它可能会破坏您的应用程序。

        【讨论】:

          猜你喜欢
          • 2021-08-06
          • 2015-03-04
          • 1970-01-01
          • 2019-09-04
          • 2021-06-29
          • 2021-04-20
          • 1970-01-01
          • 1970-01-01
          • 2016-06-24
          相关资源
          最近更新 更多