背景:我的服务器太旧,无法升级。某些软件仅适用于 PHP 5.6,并且与较新版本的 PHP 不兼容。新的服务器托管包不支持 PHP 5.6,因为它不久前已被弃用。
我正在将应用程序移动到支持 docker 的新服务器,并且我打算将 PHP 5.6 及其所有 deps 打包到 docker 映像中。然后,我将重新配置 Apache 2.4 以使用 fcgi/php-fpm 与需要 PHP 5.6 的域的容器化 php 进行通信。我的 PHP-FPM 容器化版本可以与平台的 MySQL 和 Mongo 通信。
我一直在阅读 PHP-FPM 文档,但不清楚文件如何从 Apache 到 PHP-FPM 或者 PHP-FPM 是否从文件系统读取文件。
PHP-FPM 是一个纯网络应用程序吗?即我可以将它放在网络上的任何计算机上,它将翻译 PHP 文件并返回输出,而无需访问文件系统?在新的设置中,PHP 将在自己的容器中运行并拥有自己的文件系统。我需要关心这个吗?
有人可以帮我理解 PHP-FPM、Apache、源文件和文件系统之间的关系吗?
简化:
Apache httpd 将传入请求映射到 Web 服务器文件系统上的某个位置(即在解析
DocumentRoot
和任何/所有适用的Alias
、Location
、 mod_rewrite 和其他扩展之后)。当该请求映射到 PHP 文件时,Apache httpd 将该文件的文件系统位置传递给 PHP-FPM 进行处理,并将 PHP-FPM 生成的输出返回给站点访问者。
例如,当您的 Apache 配置如下所示时:
该目录
/var/www/apps/my-app/release-2.3
没有index.html
,但包含index.php
和可能的 Web 应用程序的其他数据。因此,请求
http:///www.exaple.com/my-app
将映射到文件系统上的 PHP 文件,以/var/www/apps/my-app/release-2.3/index.php
该位置将传递给 PHP-FPM。
相当于“请
/var/www/apps/my-app/release-2.3/index.php
帮我解析”Apache 不会将内容发送
/var/www/apps/my-app/release-2.3/index.php
到 PHP-FPM。这有几个原因:但其中之一是 PHP 应用程序很少只包含单个 PHP 文件的内容。通常,应用程序代码的其他部分会加载和include
/或require
PHP 指令,并且 PHP 解释器、PHP-FPM 也需要加载这些文件。当您在 Docker 容器中运行 PHP-FPM 时,您需要确保您的 PHP 源可用并映射到与 PHP 源驻留在 Web 服务器上的文件系统位置相同的位置。