如果你打算好好开始学一下PHP,可能光是安装个可以学习的PHP环境就已经让你开始怀疑是不是还要继续下去了。因此,作为整个系列的开始,我们就来看几个常用的准备PHP开发环境的方法。
Homebrew
其实,就像Ruby或Python一样,作为一种脚本语言,PHP只需要一个解释器就可以工作了,不需要任何复杂的环境配置。如果你使用MacOS,打开终端,直接执行php -v,应该能看到电脑上已经安装了5.6版本的PHP。因此,如果只是学习PHP语言,甚至你无需额外安装任何环境。
但是,在2015年12月,PHP发布了7.0版,无论是语言自身还是执行性能,这都是PHP历史上最大的一次更新,如果你要从PHP 7开始学习,就需要自己安装了。同样,如果你用MacOS开发,安装PHP解释器最简单的办法,就是Homebrew。打开Homebrew官网,在终端执行下面的命令(注意不需要使用sudo命令):
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Homebrew是MacOS上的包管器,就如同各种Linux发行版上的apt-get或yum一样。如果你不熟悉Linux也没关系,记住下面这些常用的Homebrew命令就好了:
brew search *package_name*:查询软件包;brew install *package_name*:安装软件包;brew info *package_name*:查看软件包信息;brew uninstall *package_name*:删除软件包;brew update:更新Homebrew自身;brew outdated:查看所有过期的软件包;brew upgrade:更新所有过期的软件包;
为了通过Homebrew安装PHP,我们先执行brew search php71,7.1是当前PHP最新的版本,然后就会看到Homebrew会提示一大堆相关的软件包:

当然,这里我已经安装了php7.1,Homebrew会在对应的软件包后面显示一个绿色的对勾。如果你还没装过,直接执行下面的命令就好了:
brew install homebrew/php/php71
根据你的网络情况,可能需要等上一阵子,安装完成之后,重新打开Terminal,执行php -v,看到类似下面的结果,就表示已经安装成功了:

这样,严格来说,你就可以可以开始学习PHP了,在你的当前目录新建一个demo.php的文件,添加下面的内容:
<?php
phpinfo();
然后,执行php demo.php,就能在终端看到执行的结果了。因此,这种在命令行里执行PHP脚本的方式,可以帮助你学习绝大多数PHP的语言特性。你只需要像其他脚本语言一样,编写程序,然后在终端执行就好了。这种执行PHP脚本的模式,叫做php-cli。
Homestead
一点关于CGI,FastCGI和PHP-fpm的小知识
但如果要用PHP开发一个Web应用,情况就会稍微复杂一些,这时PHP就需要和一个HTTP服务器配合起来。简单来说,Homestead就是一个方便配置和管理的Web应用开发环境。在了解Homestead的细节之前,我们先来普及一点相关的知识,PHP和Web服务器究竟是什么关系呢?
最早,网页都是静态的(那真的是很早的时候)。所谓静态,就是所有人在所有情况下,同一个地址看到的页面都是一样的,在这种场景里,只需要一个HTTP服务器就搞定了,它获取用户的网络访问请求,在服务器上找到对应的资源,然后返回给用户:

但很快,随着应用需求日益复杂,我们需要在不同情况下,给不用的用户显示不同的内容,例如,用户是否登录、登录后的用户名等等。为了能尽可能用统一的方式处理未知多变的需求,1993年美国NCSA为HTTP服务器开发了第一个CGI(Common Gateway Interface)程序,每当HTTP服务器收到一个请求,就新建一个CGI进程,并按照协议的约定传给它一些参数等待它处理,CGI处理完成,并把内容返回给HTTP服务器后,就退出结束了,最终,由HTTP服务器把内容返回给客户端:

但可以预见的是,为每个请求创建一个进程的方式非常低效,人们基于CGI的思路,对它的执行模式进行了改进。让所有的CGI进程(CGI worker)统一由一个服务进程(CGI master)管理,这些worker进程时刻处于待命状态,HTTP服务器只把工作派发给CGI的管理进程,进而由其自行分发任务,这就是后来的Fast CGI:

理解了这个演进的过程之后,你就会明白,为了通过PHP定制服务器返回的内容,我们当然也得需要一个PHP版的FastCGI程序搭配HTTP服务器,这个FastCGI程序,就是PHP-fpm,HTTP服务器,通常我们会选择Nginx。而Homestead,就是一个集成了PHP-fpm,Nginx以及其他PHP开发相关的工具的环境,它可以大幅简化Web应用开发需要的配置。
安装Homestead
在安装Homestead之前,要先在你的MacOS上安装好Vagrant以及VirtualBox。我们并不会直接和这些工具打交道,稍后,Homestead会在VirtualBox里安装一个Ubuntu Linux,并安装和配置并要的工具和服务。
如果你已经装了VMware或者Parallels,也可以安装Vagrant为这两个产品提供的插件,但是VMware的插件是付费的,Parallels的插件没有得到Vagrant官方支持,并且,Homestead针对VirtualBox的更新也是最频繁的,因此,还是推荐大家使用Vagrant + VirtualBox的组合。
安装好这些工具之后,在Terminal执行下面的命令:
git clone https://github.com/laravel/homestead.git Homestead
这样,当前目录下就会多出一个叫做Homestead目录,进入这个目录之后,执行bash init.sh,Homestead就完成初始化了,这时,当前目录下,就会有一个叫做Homestead.yaml的文件。接下来,所有对Homestead的配置,我们都通过Homestead.yaml来完成。
配置Homestead
在启动前,我们至少要配置以下这些内容:
首先,要把Host上的源代码同步到Homestead虚拟机里,在Homestead.yaml里,添加下面的配置:
folders:
- map: ~/demo
to: /var/www/demo
这样,在Host上~/Demo目录的所有内容,都会同步到虚拟机里的/var/www/demo目录。
其次,我们要配置自己网站的地址,继续在Homestead.yaml里,添加下面的内容:
sites:
- map: demo.app
to: /var/www/demo
这样,Homestead就会在VirtualBox虚拟机的Nginx配置里,添加一个叫做demo.app站点,这个站点的根目录,会被设置成/var/www/demo。于是,我们在Host上~/demo目录里编写的代码,就可以自动让虚拟机里的Nginx访问了。
最后,我们要让Host可以访问在虚拟机中的站点。打开Host中的/etc/hosts文件,添加下面的配置:
192.168.10.10 demo.app
注意这里的demo.app要和刚才我们添加在Homestead.yaml中站点名称是相同的。
全部配置完成后,把我们之前写的demo.php文件拷贝到~/demo目录。然后在~/Homestead目录执行vagrant up启动虚拟机。启动完成之后,在浏览器里访问在浏览器里访问http://demo.app/demo.php,就可以看到类似下面这样的页面了。
这样,我们就可以在~/demo目录下编写学习代码,然后通过http://demo.app/xxxx.php的方式来观察结果了。
两个Tips
如果你第一次启动Vagrant的时候报错,多半是由于在你Host的~目录中还没有证书文件造成的,判断的依据就是看下~目录中是否存在.ssh/id_rsa和.ssh/id_rsa.pub文件,如果没有,按照Github上的指导一步步完成就好了,很简单。生成证书之后,就应该可以正常启动了。
另外,如果你觉得每次到要到Homestead目录中启动Vagrant很麻烦,可以新建一个叫做homestead的文件,然后添加下面的内容:
#!/bin/bash
cd ~/Projects/Homestead && vagrant $*
当然,上面把cd命令后面的目录设置成你的安装目录就好。保存退出之后,执行chmod +x homestead给它添加可执行权限,并把这个脚本文件移动到/usr/local/bin目录。这样,新打开一个终端,我们就可以在任意位置,执行:
homestead up启动虚拟机;homestead halt关闭虚拟机;homestead ssh登录到虚拟机;
其他的选择
如果你使用macOS,还可以使用一个叫做Valet的项目,它会把Web应用开发用到的各种服务直接装在Host上。但是,当你部署到生产环境的时候,通常还是会使用Linux,并且,当你把环境搞糟的时候,虚拟机也更容易让你推倒重来,所以,如果没有特别的原因,通常Homestead还是更好的选择。
MAMP
或者,如果你使用Windows,还可以使用一个叫做MAMP的项目,这是一个图形化一键配置工具,让你更容易的配置Web服务器和数据库。
What's next?
以上,就是关于如何配置PHP开发环境的内容,配置好一个环境,是顺利开始学习PHP的一半,而另一半,就是配置好一个得心应手的工具,这就是我们下一节的内容。