经过一整天在Google上的搜索,我终于设法在不同的PHP版本上以FastCgi的方式运行了我的两个项目。感谢这个论坛的各位。
我卸载了包括Apache在内的所有东西,然后重新开始。以下是我用来在本地服务器上启用两个版本的PHP所使用的步骤。顺便说一句,我的电脑运行在Linux Mint 18系统上。
假设您已经安装了Apache,为这两个项目创建了虚拟主机,并添加了必要的PHP PPAs。我们将称这两个项目分别为site56.local
和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
打开php56配置文件 /etc/apache2/conf-available/php5.6-fpm.conf
,添加以下配置并保存:
<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>
现在启用新的Apache配置:
sudo a2enconf php5.6-fpm
如果您安装了php5.6和php5.7,请确保禁用这两个版本并重新启动Apache:
sudo a2dismod php5.6 php7.0
sudo systemctl restart apache2
Create a .htacces
file on the project that should run on php7.0 and add this handler:
AddHandler php70-fcgi .php
现在在这两个项目上创建一个phpinfo文件,如果您看到类似于以下内容的信息,则表示恭喜!
PS:确保您在apache2.conf
或httpd.conf
中启用.htaccess
sudo apt-get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml
,如这里所述的被接受的答案。 - PawelAlias takes 1-2 arguments, a fakename and a realname, or a realname in a Location
。 - Morganmod_php
,并且对于特定的<Directory>
使用php-fpm
(不同版本)吗?SetHandler
应该有优先级,但不幸的是对我来说不起作用(PHP模块总是接管)。 - undefined首先,运行以下命令确保所有与PHP相关的配置都已禁用:
# ls -la /etc/apache2/conf-enabled | grep php
# ls -la /etc/apache2/mods-enabled | grep php
为特定网站设置不同版本的PHP-FPM:
将以下行添加到现有的VirtualHost文件中。
Include "conf-available/php7.2-fpm.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>
对于Debian 9 Stretch,它无法正常工作。我花了一些时间才搞清楚该怎么做,但最终我找到了一个看起来更加简单的解决方案:
sudo apt-get install php5.6-fpm
sudo apt-get install php7.0-fpm
sudo a2enconf php5.6-fpm
sudo a2dismod php5.6 php7.0
sudo systemctl restart apache2
目前,您的所有网站都必须在php 5.6上运行。
对于需要php 7的网站,请在vhost中添加以下行:
ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.0-fpm.sock|fcgi://localhost/path/to/my/main/file"
我尝试实现Makubex的解决方案,它起作用了。只有一个问题是在新安装的LAMP中,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
关于Ubuntu + Nginx上的PHP,我们已经掌握了这个问题:
https://blog.magepsycho.com/how-to-install-multiple-versions-of-php-on-ubuntu/
更改CLI PHP版本
sudo update-alternatives --set php /usr/bin/php7.2
更改 Web PHP 版本
fastcgi_pass unix:/run/php/php7.2-fpm.sock
在您选择的 PHP 版本中,可以将 php7.2 替换为相应版本。
update-alternatives
会有到处都是符号链接 (ln -fs
),例如 /run/php/php8.2-fpm.sock -> /run/php/php-fpm.sock
或者 /run/php/php5.6-fpm.sock -> /run/php/php-fpm.sock
。 - phili_b/lib/systemd/system/php5.6-fpm.service
ÕÆî/lib/systemd/system/php8.2-fpm.service
õ©¡õ¢┐þö¿ExecStartPost=....install /run/php/php-fpm.sock
´╝îÕì│ÕÉîµùµîçÕÉæþø©ÕÉîþÜäÞÀ»Õ¥äÒÇéõ©ñõ©¬þëêµ£¼þÜäphpõ║îÞ┐øÕêµûçõ╗Âõ╣ƒµÿ»Õªéµ¡ñÒÇé - phili_b你可以使用.htaccess
文件来实现这一点。
首先,您需要使用以下命令安装所需的FPM:
sudo apt install php7.2-fpm
然后运行以下命令
sudo a2enmod actions alias proxy_fcgi fcgid
sudo systemctl restart apache
然后在.htaccess
文件中进行以下更改
<FilesMatch \.php$>
# Apache 2.4.10+ can proxy to unix socket
SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
由于所有的Linux软件包都会使这个过程变得更加困难,因此这变得更加困难了。简单的手动、系统独立的方法:
从源代码构建您的2个PHP版本。您将在模块目录中拥有libphp7.so和libphp5.so。只需为每个运行一个单独的httpd.conf文件即可。我已经使用5和7运行了多年:
httpd-php7.conf
httpd-php5.conf
那么,只需在php5配置中放置无法运行7的虚拟主机,然后手动启动它们或创建rc.d文件或任何您的系统用于启动的文件。
在尝试按照您的指示操作后,我发现了一种可能更简单的方法来实现相同的结果。
通过添加以下行:
ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "fcgi://localhost:9070/var/www/" enablereuse=on
ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "unix:/var/run/php70fpm.sock|fcgi://localhost/var/www"
代码没有按预期工作。 不幸的是,我找不到正确的代码来使其工作,但由于该页面https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html上没有关于在子文件夹中使用Unix套接字的示例,这可能是不可能的。
mod-enabled
的输出是什么?你确定你在那里启用了 php5.x 和 php7.0x 两个版本吗? - hassan