这是一个有点老的问题,但这里是如何做到这一点,你需要使用 php-fpm 版本和快速 CGI 来做到这一点。
例如,您可以使用虚拟主机配置来做到这一点。如果您有一个根目录并且在根目录内有多个网站(从浏览器中您可以这样访问它: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>
Run Code Online (Sandbox Code Playgroud)
或者,如果每个站点都有自己的域,您可以使用多个虚拟主机:
<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>
Run Code Online (Sandbox Code Playgroud)
在这两个示例中,默认 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>
Run Code Online (Sandbox Code Playgroud)
其他一些说明我的 apache 根目录位于我的用户的主目录/环境中。这样我就可以轻松访问我的网络服务器文件。为此,我将 apache 作为我的用户和组运行,以防止文件权限问题。
您可能还需要更改 apache 运行的端口(在我的示例中为 8080)。
我有一个非常相似的问题:“如何在不破坏运行旧版本 PHP 的现有代码的情况下测试新版本的 PHP?”
我尝试了通过上面的其他一些链接提供的不同解决方案,包括尝试使用 .htaccess 文件来尝试为一个目录强制使用特定的 PHP 版本,但它们不起作用。我使用的是共享托管服务,因此我无法重新配置 Apache 或类似的东西。
这是一个确实有效的解决方案,尽管不一定完全按照您要求的方式:
我使用了子域。我创建了一个名为“test”的子域(可能被称为“Project20”,如上面的问题),然后我可以使用 test.mydomain.com 访问该子域。使用我的共享托管服务 (Lunarpages),我能够设置一个名为“test”的单独目录(可能是“Project20”),并将我的 PHP 7 文件放入其中进行测试。然后我选择仅此子域使用 PHP 7.2 而不是 PHP 5.6。瞧!
下面是一步一步的操作方法(这是在共享托管服务上完成的,使用基于 Web 的 cPanel 进行站点管理,并使用 ftp 将文件放在服务器上:
在 cPanel 中选择“子域”并创建一个新的子域,例如“test”,然后将文档根设置为“/public_html/test”。
创建“/public_html/test”目录并在其中填充您的项目测试文件。
在 cPanel 中,使用 MultiPHPManager 仅为子域“test.mydomain.com”选择 PHP 7.2。(注意这个MultiPHPManager工具好像是新的,可能还有其他方法。)
现在,使用 Web 浏览器访问 test.mydomain.com 会使用新的 PHP 版本运行任何 php 文件,并且主站点的其余部分不受影响。
这是测试这是否有效的好方法:
创建一个名为 phpinfo.php 的文件,其中包含以下代码:
<? phpinfo(); ?>
然后,在切换到新版本的 PHP 之前(在上述步骤 3 之前),请访问网页“test.mydomain.com/phpinfo.php”,您应该会看到显示的旧 PHP 版本。
然后完成上面的步骤 3 并刷新页面,您应该会看到显示新的 PHP 版本。瞧!
很抱歉没有为您提供这些说明的良好命令行版本,但我没有对我的托管提供商的 shell 访问权限...
| 归档时间: |
|
| 查看次数: |
8141 次 |
| 最近记录: |