文章說明
運營社群多年,經常遇到很多新手詢問能不能不裝 Homestead,有些同學還在朋友的推薦下使用了 WAMP, MAMP, PHPStudy 等整合環境。
個人開發 PHP 也有六七年時間了,各種整合環境、自建的 Windows 環境等都使用過。一路走來,踩坑太多,所以對虛擬機器開發環境非常推崇。以至於在 《Laravel 教程 - Web 開發實戰入門》 中,Homestead 也是作為唯一的學習開發環境。
新手開發者,如果你身邊有優秀的開發者,或者比較靠譜的 Team Leader,他們會毫不猶豫的讓你使用 Homestead,不給你更多理由。此篇文章不講太多技術細節,而是從一些反面例子和經驗,來向你闡述為何你需要使用 Homestead。
踩坑不完全統計
先講五個例子,這五個例子是我在運營 Laravel China 社群時注意到的,在此做下收集和總結。這些前人的經驗,希望能為你帶來一些啟示,同時這裡也感謝這些作者的知識分享。
請注意,這是一個不完整列表。事實上,使用 Windows 你可能會踩的坑比這個要多得多,這只是冰山一角。
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 配置檔案裡面再用 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。
推薦閱讀
本作品採用《CC 協議》,轉載必須註明作者和本文連結