【问题标题】:Best practices for using PHP's exit from FastCGI使用 PHP 从 FastCGI 退出的最佳实践
【发布时间】:2015-05-08 17:06:10
【问题描述】:

我遇到了一些使用exit 的代码,一旦遇到错误就中止处理请求。我不是 PHP 专家,但我的直接反应是,在高层次上了解 FastCGI,这将退出该过程并且通常是一个坏主意。这不是 Nginx 和我当前的 PHP 的情况,而是古老的 Apache 版本,this was a problem。关于 FastCGI 的 PHP 文档是 pretty sparse,但它确实提到了 fastcgi_finish_request,这看起来是完成请求的一种优雅方式。

exit 的文档不清楚它是否对 FastCGI 有任何性能影响,但存在一个细微的区别,即它存在于 脚本,而不是进程。 header 的文档实际上使用了 exit,我在 several Stack Overflow posts 中找到了该模式,但理由是“所以你不发送正文”,而不是“如果你不发送在标头之后发出正文,正文将为空,重定向将按预期工作。”

我还发现conflicting answers 是否会导致问题。那和Dreamhost recommends against exit when using FastCGI(尽管他们的例子是在Perl中)。它肯定会导致问题的一个地方是单元测试。

所以我的问题是:在 PHP 网页中使用 exit 的最佳做法是什么? fastcgi_finish_request 是更好的选择吗?重组控制流会更好吗?人们报告的问题是特定于 Apache 的吗?或者这只是另一个版本的“是多个returns 糟糕的编程习惯?”

【问题讨论】:

  • "重组控制流会更好吗?" 是的;退出是懒惰的。

标签: php apache nginx cgi fastcgi


【解决方案1】:

1、首先,你应该使用php-fpm,而不是旧的fastcgi模块。
2、php中的exit不代表退出当前进程。文档已经说过,尤其是当 php 在 fastcgi 服务器中运行时。它只是中止解释器会话。该过程继续并从 nginx/apache 连接池中选择另一个 http 请求,然后 php-fpm 再次调用引擎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多