在同一台服务器上运行两个PHP版本
我在本地服务器上有两个项目,一个项目运行PHP5.6,另一个运行PHP7.0。现在是否可以基于项目启用这两个版本?我已经尝试在一个项目htaccess中添加在同一台服务器上运行两个PHP版本,php,apache,Php,Apache,我在本地服务器上有两个项目,一个项目运行PHP5.6,另一个运行PHP7.0。现在是否可以基于项目启用这两个版本?我已经尝试在一个项目htaccess中添加AddHandler应用程序/x-httpd-php7.php,但它不起作用。目前,服务器上已经安装了PHP7.0和PHP5.6-fpm。下面是phpinfo的屏幕截图 所以在谷歌搜索了一整天之后。我设法在不同的php版本上用FastCgi运行了我的两个项目。多亏了这里的人。我卸载了所有东西,包括Apache,然后重新开始。下面是我用来在本地
AddHandler应用程序/x-httpd-php7.php
,但它不起作用。目前,服务器上已经安装了PHP7.0和PHP5.6-fpm。下面是phpinfo的屏幕截图
所以在谷歌搜索了一整天之后。我设法在不同的php版本上用FastCgi运行了我的两个项目。多亏了这里的人。我卸载了所有东西,包括Apache,然后重新开始。下面是我用来在本地服务器上启用两个版本的PHP的步骤。顺便说一句,我的电脑是在Linux Mint 18上运行的
site56.local
,为PHP7.0调用项目site70.local
。通过运行以下命令安装php5.6-fpm
和php7.0-fpm
:
sudo apt-get install php5.6-fpm
sudo apt-get install php7.0-fpm
/usr/lib/cgi-bin/
下创建两个文件(老实说,我不知道这一步是否仍然必要),然后保存:
sudo nano /usr/lib/cgi-bin/php56-fcgi
sudo nano /usr/lib/cgi-bin/php70-fcgi
<IfModule mod_fastcgi.c>
AddHandler php56-fcgi .php
Action php56-fcgi /php56-fcgi
Alias /php56-fcgi /usr/lib/cgi-bin/php56-fcgi -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization
Action php70-fcgi /php70-fcgi
Alias /php70-fcgi /usr/lib/cgi-bin/php70-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
</IfModule>
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
/etc/apache2/conf available/php5.6-fpm.conf
,添加此配置并保存:
sudo nano /usr/lib/cgi-bin/php56-fcgi
sudo nano /usr/lib/cgi-bin/php70-fcgi
<IfModule mod_fastcgi.c>
AddHandler php56-fcgi .php
Action php56-fcgi /php56-fcgi
Alias /php56-fcgi /usr/lib/cgi-bin/php56-fcgi -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization
Action php70-fcgi /php70-fcgi
Alias /php70-fcgi /usr/lib/cgi-bin/php70-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
</IfModule>
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
sudo a2dismod php5.6 php7.0
sudo systemctl restart apache2
.htacces
文件,并添加此处理程序:
AddHandler php70-fcgi .php
site70.local/phpinfo.php:
在尝试按照您的指示进行操作后,我找到了一种可能更简单的方法来获得相同的结果 通过添加以下行
ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "fcgi://localhost:9070/var/www/" enablereuse=on
在apachevhost配置中,您可以将vhost根/var/www目录php70project中的php版本更改为作为fastcgi运行的版本7
以下方法用于unix套接字
ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "unix:/var/run/php70fpm.sock|fcgi://localhost/var/www"
未按预期工作。
不幸的是,我找不到正确的代码来实现此功能,但由于该页面上没有unix套接字与子文件夹一起使用的示例,因此可能无法实现此功能。它不适用于debian 9 Stretch。我花了一段时间才想出该怎么办,但最后我找到了一个似乎更容易的解决办法:
sudo apt-get install php5.6-fpm
sudo apt-get install php7.0-fpm
sudo a2enconf php5.6-fpm
如果安装了php5.6和php5.7,请确保禁用这两个并重新启动apache
sudo a2dismod php5.6 php7.0
sudo systemctl restart apache2
此时,您的所有站点都必须使用PHP5.6
对于需要PHP7的站点,请在vhost中添加此行:
ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.0-fpm.sock|fcgi://localhost/path/to/my/main/file"
它应该可以做到这一点:)我尝试实现Makubex的解决方案,结果成功了。我新安装的灯只有一个问题,那就是fastcgi没有启用。 我只是使用下面的脚本再次安装了php,然后启用了fastcgi
sudo apt-get install libapache2-mod-fastcgi php5.6-fpm php5.6 php5.6-dev php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-zip php5.6-gd php5.6-xml php7.1-fpm libapache2-mod-fastcgi php7.1-fpm php7.1 php7.1-dev php7.1-mbstring php7.1-mysql php7.1-zip php7.1-gd php7.1-xml php7.1-curl php7.1-intl php7.1-json php7.1-mcrypt
然后:
a2enmod actions
a2enmod fastcgi
在这之后,这个解决方案非常有效。
我从中获得了上述两个功能首先,通过运行以下命令确保禁用所有与PHP相关的配置: #ls-la/etc/apache2/conf启用| grep php #ls-la/etc/apache2/mods启用| grep php 为特定站点设置不同版本的PHP-FPM: 在现有VirtualHost文件中添加以下行
Include "conf-available/php7.2-fpm.conf"
比如说,
#vim/etc/apache2/sites enabled/symfony.local.conf
<VirtualHost *:80>
ServerName symfony.local
Include "conf-available/php7.2-fpm.conf"
ServerAdmin webmaster@localhost
DocumentRoot /var/www/symfony.local/curr/public
<Directory /var/www/symfony.local/curr/web>
AllowOverride All
</Directory>
</VirtualHost>
ServerName symfony.local
包括“conf available/php7.2-fpm.conf”
服务器管理员webmaster@localhost
DocumentRoot/var/www/symfony.local/curr/public
允许超越所有
您可以使用.htaccess文件执行此操作
首先,您需要使用安装所需的FPM
sudo apt install php7.2-fpm
然后运行下面的命令
sudo a2enmod actions alias proxy_fcgi fcgid
然后重新启动服务器
sudo systemctl restart apache
然后在htacess文件中执行以下更改
<FilesMatch \.php$>
# Apache 2.4.10+ can proxy to unix socket
SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
#Apache 2.4.10+可以代理到unix套接字
SetHandler“proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
下面是启用PHP5.6时运行PHP7.2的示例我们已经在Ubuntu+Nginx上的php中介绍了这一点:
更改CLI PHP版本
sudo update-alternatives --set php /usr/bin/php7.2
fastcgi_pass unix:/run/php/php7.2-fpm.sock
更改Web PHP版本
sudo update-alternatives --set php /usr/bin/php7.2
fastcgi_pass unix:/run/php/php7.2-fpm.sock
其中,php7.2可以由您选择的PHP版本取代。所有linux软件包的内容都会使这个过程变得更加困难。简单的手动、独立于系统的方式: 从源代码构建您的2个PHP版本。您必须在modules目录中指定libphp7.so和libphp5.so。只需为每个文件运行一个单独的httpd.conf文件。我跑了5年和7年:
httpd-php7.conf
httpd-php5.conf
那么。只需将无法运行7的虚拟主机放在php5配置中,然后在启动时手动启动它们,或者创建rc.d文件或系统用于启动的任何文件。apache目录中启用的
mod
的输出是什么?您确定在那里同时启用了php5.x和php7.0x吗?thisHi@HassanAhmed,仅启用php7.0和php5.6-fpm。当我启用php5.6时,apache崩溃了。也许它不知道应该得到什么版本。看看Docker看看这个非常好地解释了debian/apache的答案如果你想用php5.5.9而不是php5.6,那么你还需要安装php5 fpm,php5-fpm.conf文件的内容应该与此链接中的内容相同:我还必须运行sudo apt get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml
,正如公认的答案中所述,我不知道您是否一步一步地正确尝试了解决方案,因为我在启用php5.6-fpm conf后重新启动Apache时遇到了这个错误,别名接受1-2个参数,fakename和realname,或者某个位置的realname
这真是太棒了!但我需要