我对如何配置Apache
和服务器知之甚少。目前,我的服务器正在运行PHP 5.X
版本
我想升级到PHP 7
但是会有很多项目需要升级。
所以这是我的问题:
我可以为服务器上的特定文件夹指定PHP版本吗?例如,我在/var/www/html
所有人都在PHP 5.
工作
对于我的新项目,我可以强制目录“项目21”使用PHP7
(而其他人仍使用PHP5
)吗?
感谢。
答案 0 :(得分:1)
我有一个非常相似的问题:“如何在不破坏运行旧版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访问我的托管服务提供商...
答案 1 :(得分:1)
这是一个有点老的问题,但这是如何做到的,您很可能需要 php-fpm。
例如,您可以使用虚拟主机配置来实现。如果您有一个根并且在根内有多个网站(从浏览器访问它,如下所示: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 命令启用才能使用。* 编辑:*实际上不是。我已经全部禁用,只有 vhost 确定哪个 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 根在我用户的主目录/环境中。这样我就可以轻松访问我的 Web 服务器文件。为此,我以我的用户和组身份运行 apache 以防止文件权限问题。
您可能还需要更改 apache 运行的端口(在我的示例中为 8080)。