运营社区多年,经常遇到很多新手询问能不能不装 Homestead,有些同学还在损友的推荐下使用了 WAMP, MAMP, PHPStudy 等集成环境。
个人开发 PHP 也有六七年时间了,各种集成环境、自建的 Windows 环境等都使用过。一路走来,踩坑太多,所以对虚拟机开发环境非常推崇。以至于在 《Laravel 教程 – Web 开发实战入门》 中,Homestead 也是作为唯一的学习开发环境。
此篇文章不讲太多技术细节,而是从一些反面例子,还有一些过去经验来告诉你,如果在一开始就用上 Homestead,你可以免去很多麻烦。
踩坑不完全统计
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。
为什么集成环境不好?
如果你使用集成环境,或者自己部署的本机 Windows/ Mac 开发环境,咱们先来看看有可能导致问题出现的变量有多少:
- 系统变量 Mac , 不同版本的 Mac 系统,如 Mac OS X Public , Mac OS X 10.0 Cheetah,Mac OS X 10.4 Tiger, Mac OS X 10.6 Snow Leopard;
- 系统变量 Windows,不同版本的 Windows 系统,如 Windows Vista, Windows 7, Windows 8, Windows 10 等;
- PHP 的不同版本,Mac 自带的 PHP 阉割版,WAMP 的定制版等…
- MySQL 的不同版本;
- 系统下的其他软件有时也会影响集成环境的使用(防火墙,系统补丁…)
- 如果是团队开发的话,还有你的环境和你队友的环境 … OMG …
以上这些维度搭配起来,会让复杂度到达非常恐怖的程度,会出现这些神鬼莫测的问题,真是一点都不奇怪。事实上,即使是现在,我每每回想起那些扯着头发抓狂的日子,多么的不堪回首的岁月啊。
也有有些同学会说,『么事么事,这些对我来说都不难』。可是你仔细想想,熟悉这些 Bug 的意义在哪?这本来就是一条错的路,即使你能走的再远。
为什么说这是一条错的路?
因为使用集成环境,或者各种与『生产环境』不同 的开发环境,都会面临以下一个巨大的问题:
你上线的代码,有可能无法工作。
就如这个例子 一个小坑提醒:某个 Class 或某个 Trait 突然找不到 ,他在 Mac 下代码工作得好好的,放到 Linux 服务器下却无法工作。有时候不止是系统问题,不同版本,如 MySQL 5.6 和 5.7 差别就挺大,PHP 5.6 和 PHP 7 也经常出现代码不兼容,再加上你使用 Memached, Redis….。
结语
Homestead 是一种生活方式,请把这篇文章发给你身边的 Laravel 同志看,让他们一起来使用 Homestead。下次有新手问你可不可以不同 Homestead 的话,也可以让他先看看这篇文章。
人生苦短,请使用 Homestead