很可能,许多habrozhitel已经熟悉了本文的某些部分,但是在购买新的工作笔记本电脑时,我决定将所有谷物收集在一起,并组织一个方便的开发工具。 我经常不得不处理许多带有不同版本PHP的小型项目,经常将旧项目转换为新版本。 遥远的过去,当我是Windows用户时,我使用OpenServer。 但是,随着转向Linux,我缺乏创建主机和切换其中版本的简单性。 因此,我不得不在Linux上提供一个更加方便的解决方案=)
目标
- 在撰写本文时使用当前软件
- 为了区分本地域,我们将使用特殊的.loc域
- 我们使用fast-cgi通过子域实现PHP版本切换
- 使用vhost_alias和dnsmasq自动创建主机
到底我们有什么。 切换到
56.test.loc
Apache将以PHP 5.6.36版本启动
/var/www/test.loc/public_html/index.php
将子域更改为
72 .test.loc
将启动相同的文件,但已经使用PHP 7.2.7版本
其他版本的交付方式如下所述。
要创建另一个站点,只需在
/ var / www /中创建
一个以
.loc结尾
的文件夹,其中应为
public_html文件夹,该文件夹是该站点的根目录
仅此而已。 无需额外的折磨,重新启动和编辑配置,我们就有一个自动系统来处理站点。
我将在基于Ubuntu18.04的LinuxMint19上进行所有测试,因此一切都将相同。
首先,我们将提供必要的程序包
sudo apt update sudo apt install build-essential pkg-config libxml2-dev libfcgi-dev apache2 libapache2-mod-fcgid postfix
我们将
Postfix设置为包子,作为一种简单的解决方案(在安装向导中,默认情况下选择所有选项),以便从本地计算机发送邮件。
由于这是本地开发,因此我是唯一的用户。 对于我来说,将项目文件夹转移到主目录更加方便。 它安装有单独的驱动器,并在我重新安装系统时迁移。 最简单的方法是创建一个链接,然后您无需在设置中更改路径,并且每个人都熟悉该路径。
我们将由Apache创建的文件夹复制到主目录,在其位置创建一个链接,而不会忘记将用户更改为自己并与Apache交换组。
sudo mv /var/www/ ~/www sudo ln -s ~/www /var/www sudo chown $USER:$USER -R ~/www sudo usermod -a -G www-data $USER sudo usermod -a -G $USER www-data
创建一个文件夹,在该文件夹中我们将收集不同版本的PHP源代码
sudo mkdir /usr/local/src/php-build
我们还需要CGI脚本的文件夹
sudo mkdir /var/www/cgi-bin
和运行时文件夹相同的脚本,具有权限
sudo mkdir /var/run/mod_fcgid sudo chmod 777 /var/run/mod_fcgid
由于该目录位于RAM中,因此我们
将在系统启动时添加其创建内容,为此,我们
将其添加至
/etc/tmpfiles.d/fcgid.conf #Type Path Mode UID GID Age Argument d /var/run/mod_fcgid 0755 www-data www-data - -
我的
dnsmasq-base来自包装盒,如果没有,则可以随时发货。
sudo apt install dnsmasq
在其配置中添加一个规则。
您可以
找到dnsmasq.conf配置文件,
如下所示
sudo updatedb locate dnsmasq.conf
或者,如果它像我的一样是NetworkManager的一部分,则在
/etc/NetworkManager/dnsmasq.d/local.conf中创建一个新的配置文件。
向其添加一行以将我们的本地域重定向到本地计算机。
address=/loc/127.0.0.1
您还需要启用必要的Apache模块
sudo a2enmod fcgid vhost_alias actions rewrite
初步准备已完成,我们将继续组装各种本地版本的PHP。 对于
每个版本的PHP,请执行以下4个步骤。 例如
5.6.361.下载所需版本的源代码并将其解压缩
cd /usr/local/src/php-build sudo wget http://pl1.php.net/get/php-5.6.36.tar.bz2/from/this/mirror -O php-5.6.36.tar.bz2 sudo tar jxf php-5.6.36.tar.bz2
2.我们从源代码中收集了必要的PHP版本,并将其放在
/opt/php-5.6.36中 sudo mkdir /opt/php-5.6.36 cd php-5.6.36 sudo ./configure --prefix=/opt/php-5.6.36 --with-config-file-path=/opt/php-5.6.36 --enable-cgi sudo make sudo make install sudo make clean
3.在
/var/www/cgi-bin/php-5.6.36.fcgi中创建一个CGI以处理此版本
#!/bin/bash PHPRC=/opt/php-5.6.36/php.ini PHP_CGI=/opt/php-5.6.36/bin/php-cgi PHP_FCGI_CHILDREN=8 PHP_FCGI_MAX_REQUESTS=3000 export PHPRC export PHP_FCGI_CHILDREN export PHP_FCGI_MAX_REQUESTS exec /opt/php-5.6.36/bin/php-cgi
4.使文件可执行
sudo chmod +x /var/www/cgi-bin/php-5.6.36.fcgi
5.在
/etc/apache2/mods-available/fcgid.conf中添加操作以处理每个版本
<IfModule mod_fcgid.c> AddHandler fcgid-script fcg fcgi fpl Action application/x-httpd-php-5.6.36 /cgi-bin/php-5.6.36.fcgi AddType application/x-httpd-php-5.6.36 .php
6.在
/etc/apache2/sites-available/000-default.conf中添加处理每个版本的规则
<VirtualHost *:80> # ServerNam ServerAlias *.loc # CGI ScriptAlias /cgi-bin /var/www/cgi-bin # DocumentRoot VirtualDocumentRoot /var/www/%2+/public_html # <Directory /var/www/*.loc/> Options +ExecCGI -Indexes AllowOverride All Order allow,deny Allow from all <FilesMatch \.php$> # <If "%{SERVER_NAME} =~ /56\..*?\.loc/"> SetHandler application/x-httpd-php-5.6.36 </If> <Else> # , , SetHandler application/x-httpd-php-7.2.7 </Else> </FilesMatch> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
好吧,就是这样。 它仍然只是重新启动apache和dnsmasq并使用
sudo service apache2 restart sudo service network-manager restart
放入
index.php新的测试站点
phpinfo()并验证一切正常。