我服务器上每个文件夹的不同 PHP 版本

Posted

技术标签:

【中文标题】我服务器上每个文件夹的不同 PHP 版本【英文标题】:Different PHP version for each folder on my server 【发布时间】:2018-07-08 14:57:28 【问题描述】:

我对如何配置Apache 和服务器知之甚少。目前,我的服务器正在运行php 5.X 的版本 我想升级到PHP 7,但是会有很多项目需要升级。

所以这是我的问题: 我可以为服务器上的特定文件夹指定 PHP 版本吗?比如我在/var/www/html有20个项目

项目 01/ 项目 02/ ... 项目 20/

所有人都在努力PHP 5. 对于我的新项目,我可以强制目录“project 21”使用PHP7(而其他人仍然使用PHP5)吗?

谢谢。

【问题讨论】:

Scandir 将是一个不错的起点。 php.net/manual/en/function.scandir.php 为什么?我不想列出我所有的文件夹。只是为了配置 apache 为每个文件夹使用特定版本的 PHP。 ***.com/questions/40053765/… 只有 CGI 才能做到。 相关:***.com/questions/12561203/… 【参考方案1】:

这是一个有点老的问题,但是这里是怎么做的,你需要使用 php-fpm 版本和快速 CGI 来做。

例如,您可以使用虚拟主机配置来做到这一点。如果你有一个 root 并且在 root 中有多个网站(从浏览器访问它,你可以像这样:www.domain.com/site1),这个例子是合适的,这是来自我的开发环境,所以设置不完全适合生产:

<VirtualHost *:8080>
    #ServerName www.example.com
    
    <Directory /home/my_user/environment>
        Options Indexes FollowSymLinks
        RewriteEngine on
        RewriteBase /
        RewriteCond %REQUEST_FILENAME !-f
        RewriteCond %REQUEST_FILENAME !-d
        RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
        AllowOverride All
        Require all granted
        
        <FilesMatch ".+\.ph(ar|p|tml)$">
            SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
        </FilesMatch>
    </Directory>
    
    <Directory /home/my_user/environment/site1>
        <FilesMatch ".+\.ph(ar|p|tml)$">
            SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
        </FilesMatch>
    </Directory>
    <Directory /home/my_user/environment/site2>
        <FilesMatch ".+\.ph(ar|p|tml)$">
            SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
        </FilesMatch>
    </Directory>

    ServerAdmin webmaster@localhost
    DocumentRoot /home/my_user/environment

    ErrorLog $APACHE_LOG_DIR/error.log
    CustomLog $APACHE_LOG_DIR/access.log combined

    AccessFileName .htaccess
</VirtualHost>

或者,如果每个站点都有自己的域,您可以使用多个虚拟主机:

<VirtualHost *:8080>
    #ServerName www.example.com
    
    <Directory /home/my_user/environment>
        Options Indexes FollowSymLinks
        RewriteEngine on
        RewriteBase /
        RewriteCond %REQUEST_FILENAME !-f
        RewriteCond %REQUEST_FILENAME !-d
        RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
        AllowOverride All
        Require all granted
        
        <FilesMatch ".+\.ph(ar|p|tml)$">
            SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
        </FilesMatch>
    </Directory>

    ServerAdmin webmaster@localhost
    DocumentRoot /home/my_user/environment

    ErrorLog $APACHE_LOG_DIR/error.log
    CustomLog $APACHE_LOG_DIR/access.log combined

    AccessFileName .htaccess
</VirtualHost>
<VirtualHost *:8080>
    ServerName site1.localhost
    DocumentRoot "/home/my_user/environment/site1"
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>
<VirtualHost *:8080>
    ServerName site2.localhost
    DocumentRoot "/home/my_user/environment/site2"
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

在这两个示例中,默认 PHP 为 7.3,而 site1 从 5.6 运行,site2 从 7.2 运行。

两者之间的区别在于,您有一个仅指向该网站或指向多个网站的域,并且仅路径决定了应显示哪个网站。

旁注,如果您有多个虚拟主机文件,apache 将选择最具体的一个,这就是我们在第二个示例中使用的。

此配置代表 ubuntu/debian 系统,即 centos 将套接字放置在不同位置。

所有使用的 PHP 版本配置需要通过 a2enconfig 命令启用才能使用。* 编辑:*实际上不是。我已经全部禁用,只有虚拟主机决定了哪个 PHP 需要在哪个目录/站点上运行。我必须这样做,因为我有一个简单的脚本可以更改默认 PHP 版本。

但也可以不使用虚拟主机,在这种情况下,您需要在配置文件之间添加这样的内容:

<Directory /home/my_user/environment>
    Options Indexes FollowSymLinks
    RewriteEngine on
    RewriteBase /
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    AllowOverride All
    Require all granted

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
    </FilesMatch>
</Directory>

<Directory /home/my_user/environment/site1>
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
    </FilesMatch>
</Directory>
<Directory /home/my_user/environment/site2>
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</Directory>

其他一些说明,我的 apache 根目录位于用户的主目录/环境中。所以我可以很容易地访问我的网络服务器文件。为此,我将 apache 作为我的用户和组运行以防止文件权限问题。 您可能还需要更改 apache 运行的端口(在我的示例中为 8080)。

【讨论】:

【参考方案2】:

我有一个非常相似的问题:“如何在不中断运行旧版本 PHP 的现有代码的情况下测试新版本的 PHP?”

我尝试了通过上面的一些其他链接提供的不同解决方案,包括尝试使用 .htaccess 文件来尝试为一个目录强制使用特定的 PHP 版本,但它们不起作用。我使用的是共享托管服务,所以我也无法重新配置 Apache 或类似的东西。

这是一个确实有效的解决方案,但不一定完全按照您的要求:

我使用了一个子域。我创建了一个名为“test”的子域(在上面的问题中可以称为“Project20”),然后我可以使用 test.mydomain.com 访问它。使用我的共享托管服务(Lunarpages),我能够建立一个名为“test”的单独目录(可能是“Project20”)并将我的 PHP 7 文件放入其中进行测试。然后我只选择这个子域使用 PHP 7.2 而不是 PHP 5.6。瞧!

这里是如何一步一步的(这是在共享托管服务上使用基于网络的 cPanel 进行站点管理和 ftp 将文件放在服务器上的:

    在 cPanel 中选择“子域”并创建一个新的子域,例如“test”,然后将文档根目录设置为“/public_html/test”。

    创建“/public_html/test”目录并用您的项目测试文件填充它。

    在 cPanel 中,使用 MultiPHPManager 仅为子域“test.mydomain.com”选择 PHP 7.2。 (注意这个MultiPHPManager工具好像是新的,可能还有其他方法。)

现在使用您的网络浏览器访问 test.mydomain.com 会使用新的 PHP 版本运行任何 php 文件,并且您的主站点的其余部分不受影响。

这是测试这是否有效的好方法:

    创建一个名为 phpinfo.php 的文件,其中包含以下代码:

    &lt;? phpinfo(); ?&gt;

    然后在切换到新版本的 PHP 之前(在上述第 3 步之前)访问网页“test.mydomain.com/phpinfo.php”,您应该会看到您的旧 PHP 版本显示。

    然后完成上面的步骤 3 并刷新页面,您应该会看到显示的新 PHP 版本。瞧!

很抱歉没有为您提供这些指导的良好命令行版本,但我没有对我的托管服务提供商的 shell 访问权限...

【讨论】:

以上是关于我服务器上每个文件夹的不同 PHP 版本的主要内容,如果未能解决你的问题,请参考以下文章

phpinfo在哪个文件夹里能找到啊?

使用批处理文件自动启动 5 个单独的 cmd 提示,其中每个 cmd 提示指向不同的目录并启动 php web 服务器

PHP Wamp 服务器 - 一台服务器上有 2 个 SSL 证书

我可以在我的服务器上安装和运行不同版本的 php 吗?

对多个 FTP 服务器的版本控制

PHP - 每个虚拟主机都有一个不同的 open_basedir