为什么必须使用 Homestead 来开发 Laravel 应用?

file

文章说明

运营社区多年,经常遇到很多新手询问能不能不装 Homestead,有些同学还在朋友的推荐下使用了 WAMP, MAMP, PHPStudy 等集成环境。

个人开发 PHP 也有六七年时间了,各种集成环境、自建的 Windows 环境等都使用过。一路走来,踩坑太多,所以对虚拟机开发环境非常推崇。以至于在 《Laravel 教程 - Web 开发实战入门》 中,Homestead 也是作为唯一的学习开发环境。

新手开发者,如果你身边有优秀的开发者,或者比较靠谱的 Team Leader,他们会毫不犹豫的让你使用 Homestead,不给你更多理由。此篇文章不讲太多技术细节,而是从一些反面例子和经验,来向你阐述为何你需要使用 Homestead。

踩坑不完全统计

先讲五个例子,这五个例子是我在运营 Laravel China 社区时注意到的,在此做下收集和总结。这些前人的经验,希望能为你带来一些启示,同时这里也感谢这些作者的知识分享。

1. 多个 Laravel 应用数据库连接错乱?

来自文章:大家有没有遇到多个应用中数据库连接错乱问题?

『多个应用中数据库连接错乱。同事无意中发现,在多个基于Laravel 的 Web 应用中,当应用 A进行一个长时间操作时(PHP 会运行超过30s+),在这期间,在应用 B 中进行数据库操作时, B应用会连接到 A 应用中的数据库,而非 B 的数据库。』

在此贴中,作者细致地做了各种分析,估计也是花了不少时间在 Debug 这个问题,最后原因是 Windows 下的 .env 没加载上。

2. Lavarel 应用突然无法登录?

来自文章: Laravel 登录报错 Crypt : The Mac is invalid

用 lavarel 框架写的项目,今天登陆突然提示 “The MAC is invalid.” 有没有人遇到过这种情况?

最后原因是 Windows 下的 .env 没加载上,导致系统底层的加密解密功能出错。

3. Laravel 不支持高并发?

来自文章:Laravel 不支持高并发?

我在用 $.post 刷一个 url 的时候(用鼠标点按钮触发,大概一秒钟3、4次吧),按这个速度,大概每隔个十几二十次,就会报一个500错误:Whoops, looks like something went wrong.没有更具体的错误提示了。

一个神鬼莫测的问题,让一个即使是 十几年开发经验的老鸟,也栽坑里。

4. .env 不支持中文?

来自:关于 Laravel 的.env 配置不显示的问题

在使用 laravel 开发的过程中,我把项目名称放入了 .env 配置文件里面再用 env() 方法调用,发现三个中文的情况下只能返回 default 值。

最后作者的答复是:『在 Mac 上能正常,Windows上三个字不能显示。』

5. Mac 环境也不行?

来自:一个小坑提醒:某个 Class 或某个 Trait 突然找不到

“我 Mac 本地没问题啊!”
“但是为什么 Linux 服务器上报这个错啊???”
“太诡异了,这怎么查?”

上面几个例子讲的都是坑爹的 Windows 开发环境下的 BUG。这个例子中,@lijinma 金马的同事很不幸的踩了 Mac 的坑,金马同学很大方的分享了出来,详细的解说了这个坑出现的原因,并且也提供了解决方案。

但是其实,最好的解决方案应该是:在一开始开发的时候,就是用 Homestead。

非虚拟化环境会有什么问题?

一般来说,一个 Web 商业项目的项目会有以下几个运行环境,也就是你写的代码最终会运行在这些环境上:

  • 我的开发环境
  • 队友的开发环境
  • 线上测试环境
  • 生产环境

以下是一个混乱的例子::

  • 我的开发环境 - 小明使用的是公司电脑,系统是 Win7, WAMP 集成环境;
  • 队友的开发环境
    • 队友 A,使用的是自己使用多年的戴尔笔记本,系统是 Win8,用的是 XAMPP;
    • 队友 B,使用的是公司电脑,但是他自己重装系统到最新版本的 Win10,自己配置的 PHP 环境;
  • 生产环境 - 标配的 LNMP( Linux, Nginx, MySQL, PHP),使用 laravel-ubuntu-init 构建。
  • 线上测试环境 - 一般要求是跟生产环境一模一样。但是在我们这个例子里,为了偷懒省去了这个环境。

同一份代码,不同环境的话,会经常面临这样的问题:

小明兴高采烈的提交了新功能代码,队友 Pull 下代码后,发现代码无法运行,原因会有很多,例如PHP 不同版本不兼容,php.ini 或者 my.ini 配置不一致等。

经过一番仔细排查和搜索,终于解决掉问题并上线。但是,网站当场挂掉,老板在质问,产品经理在大叫这是谁干的,一下子整个团队陷入混乱。最终发现,原来是 大小写敏感 ,Windows 下文件路径不区分大小写,Linux 却对大小写严格,一运行就直接 Fatal Error。

Windows 和 Linux 不兼容的还不止 文件路径大小写敏感 问题。

相对于 Windows 来说,Linux 为多用户操作系统,不同于 Windows 操作系统,在 Linux 上存在许多权限的问题,需要时时刻刻关注文件的权限。

除了代码质量无法保证的问题以外,本机开发还面临系统软件限制的问题。你正在开发的公司的项目,需要使用一些系统软件,如 MongoDB, Elasticsearch, Cron, ImageMagick, 等。如果在 Mac 下要去安装这些软件,你就会发现你的电脑配置会变得越来越凌乱。而 Windows 下,有些软件根本就没法安装,如 Laravel 官方推荐队列使用的 Supervisor 或者 ImageMagick 等。这时候你就会感叹,使用集成环境是多么不成熟的做法。

使用 Homestead 有哪些好处?

Homestead 基于 Vagrant 提供的便利,定制了一整套的可配置、可移植和复用的 Laravel 开发环境。homestead.box 是一台 Ubuntu 16 虚拟机,里面包含了 Nginx Web 服务器、PHP 7、MySQL 5.7、Postgres、Redis、Memcached、Node,以及所有你在使用 Laravel 开发时需要用到的各种软件。

使用 Homestead 能解决掉上面讲的开发环境不一致的问题,并且你也可以选择使用 laravel-ubuntu-init 布置服务器,来达到开发环境和线上环境的统一。

Homestead 另一个优势在于,提供了极其简单易用的接口,使我们只需要通过傻瓜化配置 Homestead.yaml 文件,即可完成复杂、重复的任务。如 Nginx 站点创建,数据库创建,文件夹挂载等,为日常开发提供了便利。

是否可以使用 Docker ?

可以,如果你是新手的话,不推荐这么做。Homestead 是官方推荐的做法,作为最佳实践,最好按着标准来。

结语

作为 Laravel 新手,如果你立志成为一名优秀的 Laravel 工程师,请从现在开始使用 Homestead。

推荐阅读

@Summer | Work at: 优帆远扬,我们正在招聘 全职伙伴Remote 工程师,欢迎加入 :bowtie: