# 開始 —— Laravel Homestead
## 1、簡介
Laravel致力于將整個PHP開發體驗變得讓人愉悅,包括本地開發環境。
[Vagrant](http://vagrantup.com/)提供了一個便捷的方式來管理和設置虛擬機盒子,該盒子提供了一流的開發環境,有了它,我們不再需要在本地環境安裝PHP、HHVM、web服務器以及其它服務器軟件,我們也完全不用再擔心誤操作搞亂操作系統——因為Vagrant盒子是一次性的,如果出現錯誤,可以在數分鐘內銷毀并重新創建該Vagrant盒子!
Homestead可以運行在Windows、Mac以及Linux系統上,其中已經安裝好了Nginx、PHP5.6、MySQL、Postgres、Redis、Memcached、Node以及很多其它開發牛逼Laravel應用所需要的東西。
> 注意:如果你使用的是Windows,需要開啟系統的硬件虛擬化(VT-x),這通常可以通過BIOS來開啟。
Homestead目前基于Vagrant 1.7進行構建和測試。
### 1.1 包含軟件
* Ubuntu 14.04
* PHP 5.6 / PHP 7.0
* HHVM
* Nginx
* MySQL
* Postgres
* Node (With PM2, Bower, Grunt, and Gulp)
* Redis
* Memcached(只支持PHP 5.x)
* Beanstalkd
* [Laravel Envoy](http://laravelacademy.org/post/232.html)
* [Blackfire Profiler](http://laravelacademy.org/post/51.html#blackfire-profiler)
## 2、安裝 & 設置
### 2.1 首次安裝
在啟用Homestead環境之前,需要先安裝[Virtual Box](https://www.virtualbox.org/wiki/Downloads)或者[VMWare](http://www.vmware.com/)和[Vagrant](http://www.vagrantup.com/downloads.html),所有這些軟件包都會常用操作系統提供了一個便于使用的可視化安裝器。
### 2.1.1 安裝Homestead Vagrant 盒子
VirtualBox/VMWare和Vagrant安裝好了之后,在終端中使用能如下命令將`laravel/homesterad`添加到vagrant安裝中。這將會花費一些時間下載該盒子,時間長短主要取決于你的網絡連接速度:
~~~
vagrant box add laravel/homestead
~~~
如果上述命令執行失敗,可以使用vagrant老版本的方式,這需要輸入完整的URL:
~~~
vagrant box add laravel/homestead https://atlas.hashicorp.com/laravel/boxes/homestead
~~~
### 2.1.2 克隆已有的Homestead倉庫
你還可以通過簡單克隆倉庫代碼來實現Homestead安裝,考慮到克隆倉庫到home目錄下的`Homestead`文件夾,Homestead盒子將會作為所有其他Laravel項目的主機:
~~~
git clone https://github.com/laravel/homestead.git Homestead
~~~
克隆完成后,在Homestead目錄下運行?`bash init.sh?`命令來創建`Homestead.yaml`配置文件,`Homestead.yaml`配置文件文件位于?`~/.homestead`目錄:
~~~
bash init.sh
~~~
### 2.1.3 升級到PHP 7.0
如果你已經在使用PHP 5.x版的Homestead盒子,可以輕松升級安裝到PHP 7.0。首先,克隆`laravel/homestead`的`php-7`分支到一個新的文件夾:
~~~
git clone -b php-7 https://github.com/laravel/homestead.git Homestead
~~~
不需要運行`init.sh`腳本來覆蓋整個`Homestead.yaml`文件,你只需要簡單添加該盒子到已存在的`Homestead.yaml`文件頂部即可:
~~~
box: laravel/homestead-7
~~~
接下來,從包含克隆`laravel/homestead`倉庫的目錄運行`vagrant up`命令即可。
### 2.2 配置Homestead
### 2.2.1 設置Provider
`Homestead.yaml`文件中的`provider`鍵表示哪個Vagrant提供者將會被使用:`virtualbox`、`vmware_fushion`,還是`vmware_workstation`,你可以將其設置為自己喜歡的提供者:
~~~
provider: virtualbox
~~~
### 2.2.2 設置SSH key
在`Homestead.yaml`文件中還要配置公共SSH key的路徑,如果沒有SSH key,那么在Mac或Linux上,可以通過如下命令來生成:
~~~
ssh-keygen -t rsa -C "you@homestead"
~~~
在Windows上,可以安裝Git然后使用[Git](http://git-scm.com/)自帶的“Git Bash”來執行上述命令。除此之外,你還可以使用[PUTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)和[PUTTYgen](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)工具來生成SSH key。
### 2.2.3 配置共享文件夾
`Homestead.yaml`文件中的`folders選項`列出了所有你想要和Homestead環境進行共享的目錄,一旦這些目錄中的文件有了修改,將會在本地和Homestead環境中保持同步,如果有需要的話,你可以配置盡可能多的共享目錄:
~~~
folders:
- map: ~/Code
to: /home/vagrant/Code
~~~
如果想要開啟[NFS](http://docs.vagrantup.com/v2/synced-folders/nfs.html),只需簡單添加一個標識到同步文件夾配置:
~~~
folders:
- map: ~/Code
to: /home/vagrant/Code
type: "nfs"
~~~
### 2.2.4 配置Nginx站點
對Nginx不熟?沒問題,`sites選項`允許你方便的匹配“域名”到Homestead環境的某個目錄,一個示例站點配置已經包含到`Homestead.yaml`文件。跟共享文件夾一樣,你可以想配置多少個站點就配置多少個。Homestead可以為你的每個Laravel項目充當方便的、虛擬化的開發環境:
~~~
sites:
- map: homestead.app
to: /home/vagrant/Code/Laravel/public
~~~
你可以通過設置`hhvm`為`true`讓所有的Homestead站點使用[HHVM](http://hhvm.com/):
~~~
sites:
- map: homestead.app
to: /home/vagrant/Code/Laravel/public
hhvm: true
~~~
默認情況下,每個站點都可以通過HTTP(端口號:8000)和HTTPS(端口號:44300)進行訪問。
### 2.2.5 Hosts文件
不要忘記把Nginx站點中的域名添加到本地機器上的`hosts`文件,該文件會將對本地域名的請求重定向到Homestead環境,在Mac或Linux上,該文件位于`/etc/hosts`,在Windows上,位于`C:\Windows\System32\drivers\etc\hosts`,添加方式如下:
~~~
192.168.10.10 homestead.app
~~~
確保IP地址和你的Homestead.yaml文件中列出的一致,一旦你將域名放置到`hosts`文件,就可以在瀏覽器中通過該域名訪問站點了!
~~~
http://homestead.app
~~~
### 2.3 啟動Vagrant Box
編輯好`Homestead.yaml`文件后,在Homestead目錄下運行`vagrant up`命令,vagrant將會啟動虛擬機并自動配置共享文件夾以及Nginx站點。
銷毀該機器,可以使用`vagrant destroy?--force`
### 2.4 為指定項目安裝Homestead
全局安裝Homestead將會使每個項目共享同一個Homestead盒子,你還可以為每個項目單獨安裝Homestead,這樣就會在該項目下創建`Vagrantfile`,允許其他人在該項目中執行`vagrant up`命令,在指定項目根目錄下使用Composer執行安裝命令如下:
~~~
composer require laravel/homestead --dev
~~~
這樣就在項目中安裝了Homestead。Homestead安裝完成后,使用`make`命令生成`Vagrantfile`和`Homestead.yaml`文件,`make`命令將會自動配置`Homestead.yaml`中的`sites`和`folders`屬性。
**Mac/Linux:**
~~~
php vendor/bin/homestead make
~~~
**Windows:**
~~~
vendor\bin\homestead make
~~~
接下來,在終端中運行`vagrant up`命令然后在瀏覽器中通過`http://homestead.app`訪問站點。不要忘記在`/etc/hosts`(Linux)文件中添加域名`homestead.app`。
## 3、日常使用
### 3.1 通過SSH連接
你可以在Homestead目錄下通過終端命令`vagrant ssh`以SSH方式連接到虛擬機,但是如果你需要以更平滑的方式連接到Homestead,可以為主機添加一個別名來快速連接到Homestead盒子。創建完別名后,可以簡單使用`vm`命令來從任何地方以SSH方式連接到Homestead機器:
~~~
alias vm="ssh vagrant@127.0.0.1 -p 2222"
~~~
### 3.2 連接到數據庫
默認已經在`homestead`中為MySQL和Postgres數據庫做好了配置,更加方便的是,Laravel的`local`數據庫配置已經為使用數據庫做好了設置。
想要通過本地的Navicat或Sequel Pro連接上MySQL或Postgres數據庫,可以通過新建連接來實現,主機IP都是`127.0.0.1`,對于MySQL而言,端口號是33060,對Postgres而言,端口號是54320,用戶名/密碼是`homestead/secret`。
> 注意:只有從本地連接Homestead的數據庫時才能使用這些非標準的端口,在Homestead環境中還是應該使用默認的3306和5432端口進行數據庫連接配置。
### 3.3 添加更多站點
Homestead環境在運行時,你可能想要添加額外Laravel應用到Nginx站點,你可以在單個Homestead環境中運行多個Laravel應用,添加站點很簡單,只需將站點添加到`Homestead.yaml`文件,然后在Homestead目錄中運行`vagrant provision`命令即可。
> 注意:該處理是不可逆的,運行`provision`命令時,已經存在的數據庫會被銷毀并重建。
### 3.4 端口轉發配置
默認情況下,Homestead端口轉發配置如下:
* **SSH:**?2222 → Forwards To 22
* **HTTP:**?8000 → Forwards To 80
* **HTTPS:**?44300 → Forwards To 443
* **MySQL:**?33060 → Forwards To 3306
* **Postgres:**?54320 → Forwards To 5432
### 3.4.1 轉發更多端口
如果你想要在Vagrant盒子添加更多端口轉發,做如下轉發協議設置即可:
~~~
ports:
- send: 93000
to: 9300
- send: 7777
to: 777
protocol: udp
~~~
## 4、使用Blackfire?Profiler進行性能分析
SensioLabs的[Blackfire Profiler](https://blackfire.io/)能自動收集代碼執行數據,比如內存、CPU時間、硬盤I/O等,Homestead使得在應用中使用該profiler變得輕而易舉。
所有需要的軟件包已經安裝到Homestead盒子,你只需要在`Homestead.yaml`文件中設置Blackfire Server ID和token:
~~~
blackfire:
- id: your-server-id
token: your-server-token
client-id: your-client-id
client-token: your-client-token
~~~
配置好Blackfire的憑證之后,在Homestead目錄下使用`vagrant provision`重新指配盒子。在此之前,確保你已經查看過[Blackfire文檔](https://blackfire.io/getting-started)了解了如何為你的瀏覽器安裝相應應的Blackfire擴展。
> 擴展閱讀1:實例教程——[在 Windows 上進行 Laravel Homestead 安裝、配置及測試](http://laravelacademy.org/post/354.html)
> 擴展閱讀2:實例教程——[在Laravel Homestead中使用Blackfire Profiler對應用性能進行分析](http://laravelacademy.org/post/377.html)
- 前言
- 序言
- 序言 ―― 發行版本說明
- 序言 ―― 升級指南
- 序言 ―― 貢獻代碼
- 開始
- 開始 ―― 安裝及配置
- 開始 ―― Laravel Homestead
- 基礎
- 基礎 ―― HTTP路由
- 基礎 ―― HTTP 中間件
- 基礎 ―― HTTP 控制器
- 基礎 ―― HTTP 請求
- 基礎 ―― HTTP 響應
- 基礎 ―― 視圖
- 基礎 ―― Blade模板
- 架構
- 架構 ―― 一次請求的生命周期
- 架構 ―― 應用目錄結構
- 架構 ―― 服務提供者
- 架構 ―― 服務容器
- 架構 ―― 契約
- 架構 ―― 門面
- 數據庫
- 數據庫 ―― 起步
- 數據庫 ―― 查詢構建器
- 數據庫 ―― 遷移
- 數據庫 ―― 填充數據
- Eloquent ORM
- Eloquent ORM ―― 起步
- Eloquent ORM ―― 關聯關系
- Eloquent ORM ―― 集合
- Eloquent ORM ―― 調整器
- Eloquent ORM ―― 序列化
- 服務
- 服務 ―― 用戶認證
- 服務 ―― Artisan 控制臺
- 服務 ―― Laravel Cashier(交易)
- 服務 ―― 緩存
- 服務 ―― 集合
- 服務 ―― Laravel Elixir
- 服務 ―― 加密
- 服務 ―― 錯誤&日志
- 服務 ―― 事件
- 服務 ―― 文件系統/云存儲
- 服務 ―― 哈希
- 服務 ―― 幫助函數
- 服務 ―― 本地化
- 服務 ―― 郵件
- 服務 ―― 包開發
- 服務 ―― 分頁
- 服務 ―― 隊列
- 服務 ―― Redis
- 服務 ―― Session
- 服務 ―― Envoy 任務運行器(SSH任務)
- 服務 ―― 任務調度
- 服務 ―― 測試
- 服務 ―― 驗證