Php-fpm 如何访问文件系统?

Php-fpm 如何访问文件系统?

背景:我的服务器太旧,无法升级。某些软件只能在 PHP 5.6 上运行,与较新版本的 PHP 不兼容。新的服务器托管包不支持 PHP 5.6,因为它不久前已被弃用。

我正在将应用程序移动到支持 docker 的新服务器,并打算将 PHP 5.6 及其所有依赖项打包到 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、源文件和文件系统之间的关系吗?

答案1

简化:

Apache httpd 将传入的请求映射到 Web 服务器文件系统上的某个位置(即,在解析DocumentRoot和任何/所有适用的Alias、、Locationmod_rewrite 和其他扩展之后)。

当该请求映射到 PHP 文件时,Apache httpd 会将该文件的文件系统位置传递给 PHP-FPM 进行处理,并将 PHP-FPM 生成的输出返回给网站访问者。

因此当您的 Apache 配置如下所示时:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/www.example.com

    DirectoryIndex  index.html index.php

    Alias "/my-app" "/var/www/apps/my-app/release-2.3"
 
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
    </FilesMatch>

</VirtualHost>

该目录/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/或requirePHP 指令,而 PHP 解释器 PHP-FPM 也需要加载这些文件。


当您在 docker 容器中运行 PHP-FPM 时,您需要确保您的 PHP 源可用并且映射到与 PHP 源驻留在 Web 服务器上的相同文件系统位置。

相关内容