[ Laravel 5.4 文档 ] 开发环境 —— Laravel Homestead

1、简介

Laravel 致力于让整个 PHP 开发过程变得让人愉悦,包括本地开发环境,为此官方为我们提供了一整套本地开发环境 —— Laravel Homestead

Laravel Homestead 是一个打包好各种 Laravel 开发所需要的软件及工具的 Vagrant 盒子(Vagrant 提供了一个便捷的方式来管理和设置虚拟机),该盒子为我们提供了优秀的开发环境,有了它,我们不再需要在本地环境安装 PHP、HHVM、Web服务器以及其它工具软件,我们也完全不用再担心误操作搞乱操作系统 —— 因为 Vagrant 盒子是一次性的,如果出现错误,可以在数分钟内销毁并重新创建该 Vagrant 盒子!

Homestead可以运行在 Windows、Mac 以及 Linux 系统上,其中已经安装好了Nginx、PHP 7.1、MySQL、Postgres、Redis、Memcached、Node以及很多其它开发 Laravel 应用所需要的东西。

注:如果你使用的是Windows,需要开启系统的硬件虚拟化(VT-x),这通常可以通过BIOS来开启。如果你是在UEFI系统上使用 Hyper-V,则需要关闭 Hyper-V以便可以访问VT-x。

预装软件

  • Ubuntu 16.04
  • Git
  • PHP 7.1
  • Nginx
  • MySQL
  • MariaDB
  • SQLite 3
  • Postgres
  • Composer
  • Node(With Yarn, PM2, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd

2、安装 & 设置

首次安装

在使用 Homestead 之前,需要先安装 Virtual Box 5.1VMWareParallels 以及 Vagrant,所有这些软件包都为常用操作系统提供了一个便于使用的可视化安装器。

要使用VMware的话,需要购买 VMware Fusion/Workstation 以及 VMware Vagrant plug-in,尽管不便宜,但是VMware可以提供更好的性能和更好的体验。

要使用Parallels的话,需要安装 Parallels Vagrant plug-in,这是免费的。

安装 Homestead Vagrant 盒子

VirtualBox/VMWare 和 Vagrant 安装好了之后,在终端中使用如下命令将 laravel/homesterad 添加到 Vagrant 中。下载该盒子将会花费一些时间,时间长短主要取决于你的网络连接速度:

vagrant box add laravel/homestead

如果上述命令执行失败,需要确认 Vagrant 是否是最新版本。

通过 GitHub 安装 Homestead

你还可以通过克隆仓库代码来实现 Homestead 安装。将仓库克隆到用户目录下的 Homestead 目录,这样 Homestead 盒子就可以作为所有其他 Laravel 项目的主机:

cd ~
git clone https://github.com/laravel/homestead.git Homestead

克隆完成后,在 Homestead 目录下运行 bash init.sh 命令来创建 Homestead.yaml 配置文件,Homestead.yaml 配置文件文件位于 ~/.homestead 目录:

// Mac/Linux...
bash init.sh

// Windows...
init.bat

配置 Homestead

设置 Provider

Homestead.yaml 文件中的 provider 键表示使用哪个 Vagrant 提供者:virtualboxvmware_fushionvmware_workstationparallels,你可以将其设置为自己喜欢的提供者:

provider: virtualbox

配置共享文件夹

Homestead.yaml 文件中的 folders 属性列出了所有主机和 Homestead 虚拟机共享的文件夹,一旦这些目录中的文件有了修改,将会在本地和 Homestead 虚拟机之间保持同步,如果有需要的话,你可以配置多个共享文件夹(一般一个就够了):

folders:
    - map: ~/Code
      to: /home/vagrant/Code

如果要开启 NFS,只需简单添加一个标识到同步文件夹配置:

folders:
    - map: ~/Code
      to: /home/vagrant/Code
      type: "nfs"

配置 Nginx 站点

对 Nginx 不熟?没问题,通过 sites 属性你可以方便地将“域名”映射到 Homestead 虚拟机的指定目录,Homestead.yaml 中默认已经配置了一个示例站点。和共享文件夹一样,你可以配置多个站点:

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public

如果你是在 Homestead 盒子启动之后进行了上述修改,需要运行 vagrant reload --provision 更新虚拟机上的 Nginx 配置。

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

启动 Vagrant Box

配置好 Homestead.yaml 文件后,在 Homestead 目录下运行 vagrant up 命令,Vagrant 将会启动虚拟机并自动配置共享文件夹以及 Nginx 站点。

销毁该机器,可以使用 vagrant destroy –force 命令。

为指定项目安装 Homestead

全局安装 Homestead 将会使每个项目共享同一个 Homestead 盒子,你还可以为每个项目单独安装 Homestead,这样就会在该项目下创建 Vagrantfile,允许其他人在该项目中执行 vagrant up 命令,在指定项目根目录下使用 Composer 执行安装命令如下:

composer require laravel/homestead --dev

这样就在项目中安装了 Homestead。Homestead 安装完成后,使用 make 命令生成 VagrantfileHomestead.yaml 文件,make 命令将会自动配置 Homestead.yaml 中的 sitesfolders 属性。

Mac/Linux:

php vendor/bin/homestead make

Windows:

vendor\bin\homestead make

接下来,在终端中运行 vagrant up 命令然后在浏览器中通过 http://homestead.app 访问站点。不要忘记在 /etc/hosts 文件中添加域名 homestead.app

安装MariaDB

如果你希望使用 MariaDB 来替代 MySQL,可以添加 mariadb 配置项到 Homestead.yaml 文件,该选项会移除 MySQL 并安装 MariaDB,MariaDB 是 MySQL 的替代品,所以在应用数据库配置中你仍然可以使用 mysql 驱动:

box: laravel/homestead
ip: "192.168.20.20"
memory: 2048
cpus: 4
provider: virtualbox
mariadb: true

3、日常使用

全局访问 Homestead

有时候你想要在文件系统的任意位置运行 vagrant up 启动 Homestead 虚拟机,要实现这一目的,在Mac/Linux系统上,可以添加 Bash 函数到 Bash profile;在Windows系统上,需要添加“批处理”文件到PATH。这些脚本允许你在系统的任意位置运行 Vagrant 命令,并且把命令执行位置指向 Homestead 的安装路径。

Linux

function homestead() {
    ( cd ~/Homestead && vagrant $* )
}

确保将该函数中的 ~/Homestead 路径调整为指向实际的 Homestead 安装路径。这样你就可以在系统的任意位置运行 homestead uphomestead ssh 来启动/登录虚拟机。

Windows

在系统的任意位置创建一个批处理文件homestead.bat

@echo off

set cwd=%cd%
set homesteadVagrant=C:\Homestead

cd /d %homesteadVagrant% && vagrant %*
cd /d %cwd%

set cwd=
set homesteadVagrant=

你需要将脚本中实例路径 C:\Homestead 调整为 Homestead 实际安装路径。创建文件之后,添加文件路径到PATH,这样你就可以在系统的任意位置运行 homestead uphomestead ssh

通过 SSH 连接

你可以在 Homestead 目录下通过运行 vagrant ssh 以 SSH 方式连接到虚拟机。

如果你需要以更简捷的方式连接到 Homestead,可以为主机添加一个别名来快速连接到 Homestead 盒子,创建完别名后,可以使用 vm 命令从任何地方以 SSH 方式连接到 Homestead 虚拟机:

alias vm="ssh vagrant@127.0.0.1 -p 2222"

连接到数据库

Homestead 默认已经在虚拟机中为 MySQL 和 Postgres 数据库做好了配置,更方便的是,这些配置值就是Laravel的 .env 中默认提供的。

想要通过本地的 Navicat 或 Sequel Pro 连接到 Homestead 上的 MySQL 或 Postgres 数据库,可以通过新建连接来实现,主机 IP 都是 127.0.0.1,对于 MySQL 而言,端口号是33060,对 Postgres 而言,端口号是54320,用户名/密码是 homestead/secret

注意:只有从本地连接 Homestead 的数据库时才能使用这些非标准的端口,在 Homestead 虚拟机中还是应该使用默认的 33065432 端口进行数据库连接配置。

添加更多站点

Homestead 虚拟机在运行时,可能需要添加额外 Laravel 应用到 Nginx 站点。如果是在单个 Homestead 环境中运行多个 Laravel 应用,添加站点很简单,只需将站点添加到 Homestead.yaml 文件,然后在 Homestead 目录中运行 vagrant provision 命令即可:

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
    - map: another.app
      to: /home/vagrant/Code/another/public

如果 Vagrant 不是自动管理“hosts”文件,仍然需要添加站点域名到本地 hosts 文件:

192.168.10.10  homestead.app
192.168.10.10  another.app

添加完站点后,在Homestead目录下运行 vagrant reload --provision 命令重启虚拟机。

配置 Cron 调度任务

Laravel 提供了很方便的方式来调度 Cron 任务:只需每分钟调度运行一次 Artisan 命令 schedule:run 即可。schedule:run 会检查定义在 App\Console\Kernel 类中定义的调度任务并判断运行哪些任务。

如果想要为某个 Homestead 站点运行 schedule:run 命令,需要在定义站点时设置 scheduletrue

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
      schedule: true

该站点的 Cron 任务会被定义在虚拟机的 /etc/cron.d 目录下。

端口转发配置

默认情况下,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

转发更多端口

如果你想要为 Vagrant 盒子添加更多端口转发,做如下转发协议设置即可:

ports:
    - send: 93000
      to: 9300
    - send: 7777
      to: 777
      protocol: udp

4、网络接口

Homestead.yamlnetworks 属性用于配置 Homestead 的网络接口,你可以想配多少就配多少:

networks:
    - type: "private_network"
      ip: "192.168.10.20"

要开启 bridged 接口,需要配置 bridge 设置并修改网络类型为 public_network

networks:
    - type: "public_network"
      ip: "192.168.10.20"
      bridge: "en1: Wi-Fi (AirPort)"

要开启DHCP,只需要从配置中移除 ip 选项即可:

networks:
    - type: "public_network"
      bridge: "en1: Wi-Fi (AirPort)"

5、更新 Homestead

更新 Homestead 只需两步即可,首先,使用 vagrant box update 命令更新 Vagrant 盒子:

vagrant box update

接下来,需要更新 Homestead 源码,如果你是通过Github仓库安装的,只需在克隆仓库的地方运行 git pull origin master即可。

如果你是通过项目的 composer.json 文件安装的 Homestead,需要确保 composer.json 文件包含 "laravel/homestead": "^4" 并更新你的依赖:

composer update

6、老版本

你可以通过添加如下这行配置到 Homestead.yaml 文件来覆盖Homestead使用的老版本的盒子:

version: 0.6.0

例如:

box: laravel/homestead
version: 0.6.0
ip: "192.168.20.20"
memory: 2048
cpus: 4
provider: virtualbox

如果你使用的是更老版本的Homestead盒子,需要为之匹配一个与之兼容的Homestead源码。下面的表格展示了支持的盒子版本,使用的Homestead源码的版本,以及对应的PHP版本:

PHP Homestead Version Box Version
7.0 3.1.0 0.6.0
7.1 4.0.0 1.0.0

学院君 has written 595 articles

资深PHP工程师,Laravel学院院长

发表评论

标记为*的字段是必填项(邮箱地址不会被公开)

你可以使用这些HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>