在Mac从零搭建PHP7开发环境,由于我不想直接在本地环境下直接操作所以使用Vagrant+VirtualBox在虚拟机来搭建开发环境,这样可以不用考虑开发环境各种配置对于本机的影响。

关于Vagrant可以参考这两篇文章:为什么要使用VagrantVagrant使用简介我就不多做解释了。

如果你不想自己手动搭建整个环境可以直接使用Laravel Homestead,这是由Laravel框架开发者提供的一个已搭建好的跨平台(Windows、 Mac、 Linux)的PHP开发环境,内置了如Nginx、PHP7、 MySQL、 Postgres、 Redis、 Memcached、 Node等服务,只需在Vagrant下载入box文件做到了开箱即用。

绕了半天还是回归正题,从零搭建PHP7开发环境:

初始化虚拟环境

这里假设你已经在本机安装好了VirtualBox+Vagrant,进入自己的想要存放环境的目录并在终端下执行如下命令:

mkdir trusty64 && cd trusty64 # 创建并进入存放虚拟机的目录
vagrant init ubuntu/trusty64 # 使用Vagrant载入Ubuntu 14.04的box文件

上面的命令会从外网下载Ubuntu 14.04的box文件,所以会比较慢,需要耐心等待。执行成功后编辑trusty64目录下的Vagrantfile配置文件来修改一些虚拟机的配置。

由于网络原因box文件的下载可能出错,所以我这里提供我已下载的Vagrant Ubuntu 14.04 Box文件给大家,可以直接在trusty64目录下使用如下命令载入:

vagrant box add phpdev ubuntu-trusty64-20170831.box
vagrant init
调整虚拟机配置

我习惯将配置文件中config.vm.box_check_update = true修改为config.vm.box_check_update = false,这样每次启动虚拟机就不会检查box文件是否有更新了。

Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80 这种访问方式,我更喜欢以固定IP的方式访问虚拟机,修改配置:

config.vm.network :private_network, ip: "192.168.99.64"

这样启动虚拟机后我们就能用 192.168.99.64 访问这台机器了,你可以把IP改成其他地址,只要冲突就行。

默认Vagrant是把当前目录即trusty64映射到虚拟机的/vagrant目录下,你可以改变这个配置:

config.vm.synced_folder '.', '/vagrant', disabled: true
config.vm.synced_folder "./PHPCode" , "/code", :mount_options => ["dmode=777", "fmode=666"]

上面第一行关闭默认的目录映射,第二行将当前目录下的PHPCode映射到虚拟机的/code目录下。

启动虚拟机
vagrant up # 启动虚拟机
vagrant ssh # ssh登陆虚拟机

OK,现在咱们就有了一个纯净的Ubuntu 14.04的虚拟环境,接下来开始配置开发环境吧。

配置开发环境

sudo su # 切换为root用户

首先切换为root用户,因为后面有些安装步骤需要用到超级用户权限,我们在本地虚拟机配置开发环境对于安全性的要求没那么严格,所以这里直接切换成root用户减少麻烦。

安装Nginx
apt-get update # 更新软件源
apt-get install nginx

安装完成之后在本机直接访问http://192.168.99.64/,可以看到Welcome to nginx!的页面表示nginx安装成功。

编译安装PHP

apt-get install build-essential libtool libpcre3 libpcre3-dev openssl libssl-dev
apt-get install libxml2-dev libcurl4-gnutls-dev libjpeg-dev libpng-dev libmcrypt-dev libreadline6 libreadline6-dev libfreetype6-dev

安装一些编译要用到的包。

ln -s /lib/x86_64-linux-gnu/libssl.so.1.0.0 /usr/lib/libssl.so

解决缺少了openssl的问题。

tar zxvf php-7.1.9.tar.gz
cd php-7.1.9

下载PHP7的源码包,并解压。

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --disable-fileinfo --enable-maintainer-zts

配置PHP编译选项。

make # 编译
make install # 安装

这样PHP将被安装到/usr/local/php目录,编辑/etc/enviornment, 将/usr/local/php/bin添加到PATH 变量,然后在终端执行source /etc/environment更新环境变量。

cp <php-source-dir>/php.ini-development /usr/local/php/etc/php.ini

配置php.ini文件。

php -v

验证PHP安装成功。

配置PHP-FPM

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

拷贝创建FPM配置文件,并修改/usr/local/php/etc/php-fpm.d/www.conf部分配置如下:

; listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
; unix socket

listen.owner = www-data
listen.group = www-data
listen.mode = 0660
初始化PHP-FPM服务脚本
cp <source-dir>/sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpm

FPM Installation and Configuration

修改部分/etc/init.d/php-fpm为如下:

prefix=
exec_prefix=
php_fpm_BIN=/usr/local/php/sbin/php-fpm
php_fpm_CONF=/usr/local/php/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
启动PHP-FPM服务
/etc/init.d/php-fpm start # start php-fpm
# /etc/init.d/php-fpm stop
# /etc/init.d/php-fpm reload

编辑/etc/rc.local文件,在开机启动中加入PHP-FPM服务:

/etc/init.d/php-fpm start
···
exit 0

至此PHP-FPM配置成功。

创建phpinfo()脚本

vim /etc/nginx/sites-available/trusty64
ln -s /etc/nginx/sites-available/trusty64 /etc/nginx/sites-enabled/

创建Nginx虚拟主机配置文件,并在中输入一下内容:

server {
        listen 80;
        server_name trusty64.local; # 设置域名
        charset UTF-8;
        # 配置访问日志和错误日志
        access_log /var/log/trusty64-access.log;
        error_log /var/log/trusty64-error.log;
        # 站点根目录
        root /code/www/trusty64/public;

        index index.php index.html;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location ~ \.php$ {
                #fastcgi_pass   127.0.0.1:9000;
                fastcgi_pass   unix:/var/run/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_read_timeout 5000;
                include        fastcgi_params;
        }

        location ~ /\.ht {
                deny all;
        }

        # Prevents caching of css/less/js/images, only use this in development
        location ~* \.(css|less|js|jpg|png|gif)$ {
                add_header Cache-Control "no-cache, no-store, must-revalidate"; 
                add_header Pragma "no-cache";
                expires 0;
        }

}

在虚拟机/code/www/trusty64/public目录(位于映射的共享目录下)下创建index.php,输入一下内容:

<?php
    phpinfo();

重启nginx,使配置的虚拟主机生效

service nginx restart #

修改本机(不是虚拟机)的/etc/hosts文件添加trusty64.local的域名解析:

192.168.99.64 trusty64.local

打开本机浏览器访问http://trusty64.local/可以看到phpinfo()的输出,Nginx+PHP-FPM的开发环境已配置成功。

安装Mysql

apt-get install mysql-server mysql-client

注意在提示时输入root密码,安装完成后登陆Mysql为本机配置数据库访问权限。

修改Mysql配置文件:

vim /etc/mysql/my.cnf
# 把bind-address参数的值改成你的内/外网IP或0.0.0.0,或者直接注释掉这行.
# 重启Mysql使配置生效
service mysql stop
service mysql start

登陆Mysql为本机IP添加访问权限。

mysql -u root -p

mysql> use mysql;
mysql> update user set host='192.168.99.1' where user='root';
mysql> flush privileges;
mysql> select user,host from user;

然后就可以直接使用本机的数据库管理工具如Navicat连接192.168.99.64访问和管理虚拟机上的Mysql。

总结

至此我们在Vagrant的Ubuntu 14.04下搭建了LNMP的开发环境,可以在本机上直接编辑映射的共享目录下的脚本文件,通过虚拟来进行测试,做到开发与测试环境隔离,不必担心在本地搭建过多的服务引起的混乱。