Laravel Homestead

介绍

Laravel 致力于让整个 PHP 开发体验变的更愉快,包括你的本地开发环境。 Vagrant提供了一种简单、优雅的方式来管理和配置虚拟主机。

Laravel Homestead 是一个官方预封装的 Vagrant box ,它为你提供了一个完美的开发环境,你不需要在本地机器安装 PHP、web 服务器和其他的服务器软件。你再也不用担心会弄乱你的操作系统了!Vagrant boxes 是一次性的。 如果出现问题, 你可以在几分钟内销毁并重新创建 box !

Homestead 可以运行在任何 Windows、Mac、或 Linux 系统, 它包括了 Nginx web 服务器,PHP7.4、PHP 7.3、PHP 7.2、PHP 7.1、MySQL、PostgreSQL、Redis、Memcached、Node 以及你开发 Laravel 所需要的东西。

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

内置软件

  • Ubuntu 18.04
  • Git
  • PHP 7.4
  • PHP 7.3
  • PHP 7.2
  • PHP 7.1
  • PHP 7.0
  • PHP 5.6
  • Nginx
  • MySQL
  • lmm for MySQL or MariaDB database snapshots
  • Sqlite3
  • PostgreSQL
  • Composer
  • Node (With Yarn, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd
  • Mailhog
  • avahi
  • ngrok
  • Xdebug
  • XHProf / Tideways / XHGui
  • wp-cli

可选软件

  • Apache
  • Blackfire
  • Cassandra
  • Chronograf
  • CouchDB
  • Crystal & Lucky Framework
  • Docker
  • Elasticsearch
  • Gearman
  • Go
  • Grafana
  • InfluxDB
  • MariaDB
  • MinIO
  • MongoDB
  • MySQL 8
  • Neo4j
  • Oh My Zsh
  • Open Resty
  • PM2
  • Python
  • RabbitMQ
  • Solr
  • Webdriver & Laravel Dusk Utilities

安装与设置

第一步

在你启动 Homestead 环境之前,你必须安装 VirtualBox 6.xVMWareParallelsHyper-V 以及 Vagrant。以上所有软件均针对不同的操作系统提供了易于使用的可视化安装包。

若要使用 VMware 提供器,你需要购买 VMware Fusion / Workstation 和 VMware Vagrant plug-in。 虽然它不是免费的,但是 VMware 可以提供更快的共享文件夹性能。

若要使用 Parallels 提供器,你需要安装 Parallels Vagrant plug-in。它是免费的。

由于受到 Vagrant 限制,Hyper-V 提供程序会忽略所有的网络设置。

安装 Homestead Vagrant Box

一旦将 VirtualBox / VMware 和 Vagrant 都安装好之后,你可以在终端执行下面的命令将 laravel/homestead box 添加到 Vagrant 中安装。你可能需要几分钟的时间来下载 box,因为它取决于你的网络连接速度:

  1. vagrant box add laravel/homestead

如果这个命令失败了,请确保你安装的是最新版的 Vagrant。

注意:Homestead 会定期发出「alpha」/「beta」box 用于测试,这可能会影响 vagrant box add 命令。如果你在运行 vagrant box add 时遇到问题,可以运行 vagrant up 命令,当 Vagrant 尝试启动虚拟机时,将下载正确的 box。

安装 Homestead

你可以通过克隆代码来安装 Homestead。建议将代码克隆到你的「home」目录下的 Homestead 文件夹中,这样 Homestead box 就可以作为你的所有 Laravel 项目的主机:

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

因为 Homestead 的 master 分支并不是稳定的,你应该使用打过标签的稳定版本。您可以在 GitHub Release Page 上找到最新的稳定版。或者,你可以查看包含最新稳定版本的 release 分支:

  1. cd ~/Homestead
  2. git checkout release

一旦克隆 Homestead 代码完成以后,在 Homestead 目录中使用 bash init.sh 命令来创建 Homestead.yaml 配置文件。Homestead.yaml 文件将被放在 Homestead 目录中:

  1. // Mac / Linux...
  2. bash init.sh
  3. // Windows...
  4. init.bat

配置 Homestead

设置你的提供器

Homestead.yaml 文件中的 provider 参数决定了你用的是哪一个 Vagrant 提供器 : virtualbox, vmware_fusion, vmware_workstation, parallels 以及 hyperv。你可以根据你的喜好来设置他们:

  1. provider: virtualbox

配置共享文件夹

Homestead.yaml 文件的 folders 属性里列出了所有与 Homestead 环境共享的文件夹。这些文件夹中的文件如果发生变更,它们会保持本地机器与 Homestead 环境之间同步。你可以根据需要配置多个共享文件夹:

  1. folders:
  2. - map: ~/code/project1
  3. to: /home/vagrant/project1

注意:Windows用户不应使用 〜/ 路径语法,而应使用其项目的完整路径,例如 C:\Users\user\Code\project1

你应始终将各个项目映射到自己的文件夹映射,而不是映射整个 〜/ code 文件夹。映射文件夹时,虚拟机必须跟踪文件夹中 每个 文件的所有磁盘 IO。如果文件夹中有大量文件,则会导致性能问题。

  1. folders:
  2. - map: ~/code/project1
  3. to: /home/vagrant/project1
  4. - map: ~/code/project2
  5. to: /home/vagrant/project2

注意:使用Homestead时,不应该挂载到 .(当前目录)。这会导致 Vagrant 不将当前文件夹映射到 /vagrant,并且会破坏可选功能并在配置时导致意外结果。

若要开启 NFS,你只需要在共享的文件夹配置中添加一个简单的标志:

  1. folders:
  2. - map: ~/code/project1
  3. to: /home/vagrant/project1
  4. type: "nfs"

注意:当使用 NFS 时,你最好使用 vagrant-winnfsd 扩展插件。这个插件会替你处理 Homestead box 中的文件或目录权限的问题。

你也可以通过在 options 中列出 Vagrant 的 同步文件夹 支持的任何选项:

  1. folders:
  2. - map: ~/code/project1
  3. to: /home/vagrant/project1
  4. type: "rsync"
  5. options:
  6. rsync__args: ["--verbose", "--archive", "--delete", "-zz"]
  7. rsync__exclude: ["node_modules"]

配置 Nginx 站点

对 Nginx 不熟悉? 没关系。 sites 功能可以让你在 Homestead 上轻松的映射一个"域名"到一个文件夹。在 Homestead.yaml 文件中包含了一个简单的站点配置示例。同样,您可以根据需要为您的 Homestead 环境添加很多的站点。Homestead 可以为你正在开发的每个 Laravel 项目提供一个方便的虚拟化环境:

  1. sites:
  2. - map: homestead.test
  3. to: /home/vagrant/project1/public

如果你在 Homestead 虚拟机启动后更改了 sites 选项,你需要再次运行 vagrant reload —provision 命令去更新虚拟机上的 Nginx 配置。

注意:Homestead 脚本被设计为尽可能保证操作的幂等,不过,如果你在 provison 过程中还是出现问题,则需要通过 vagrant destroy && vagrant up 命令来销毁并重构虚拟机。

主机名解析

Homestead 通过 mDNS 发布主机名来自动解析主机。如果你在 Homestead.yaml 中设置了 hostname: homestead,则该主机会以 homestead.local 的形式生效。MacOS、iOS 和 Linux 桌面系统默认提供了对 mDNS 的支持,Windows 需要安装 Bonjour Print Services for Windows 使其生效。

自动主机名在每个项目独立安装的 Homestead 中工作最好,如果你在一个 Homestead 实例上托管了多个站点,可以在宿主机上将站点「域名」添加到 hosts 文件中做域名映射,hosts 文件会将针对 Homestead 站点的请求重定向到 Homestead 虚拟机。在 Mac 和 Linux 系统中,该文件位于 /etc/hosts,在 Windows 系统中,该文件位于 C:\Windows\System32\drivers\etc\hosts。我们以 homestead.test 域名映射为例,添加到 hosts 文件的记录如下所示:

  1. 192.168.10.10 homestead.test

确保 IP 地址和你的 Homestead.yaml 文件中的配置项一致,一旦你将域名添加到 hosts 文件中并启动 Homestead,就可以在浏览器中通过该域名访问站点了:

  1. http://homestead.test

启动 Vagrant 盒子

根据你的需求编辑完成 Homestead.yaml,在你的 Homestead 文件夹中运行 vagrant up 命令。Vagrant 将启动虚拟机并自动配置你的共享文件夹和 Nginx 站点。

若要删除虚拟机,只需要运行 vagrant destroy —force 命令。

根据项目安装

除了全局安装 Homestead 并且在所有项目共享相同的 Homestead box 之外, 你可以为每个项目配置 Homestead 实例。 通过在项目下创建 Vagrantfile,其他的项目成员只需运行 vagrant up 就能拥有相同的开发环境。

要将 Homestead 直接安装到项目中,需要使用 Composer 命令:

  1. composer require laravel/homestead --dev

Homestead 安装之后, 使用 make 命令在项目根目录中生成 VagrantfileHomestead.yaml 文件。 make 命令会自动配置 Homestead.yaml 文件中 sitesfolders 指令。

Mac / Linux:

  1. php vendor/bin/homestead make

Windows:

  1. vendor\\bin\\homestead make

接下来,在命令行中运行 vagrant up 命令,然后在浏览器中访问 http://homestead.test 。 记住,如果你没有使用自动 主机名解析,在访问之前你仍然需要在 /etc/hosts 文件中添加你的 homestead.test 记录或者其他的域名。

安装可选功能

安装可选功能可以在 Homestead 配置文件 Homestead.yaml 中使用 features 设置来实现,大部分功能只需要通过布尔值设置启用或者禁用来选择安装或者不安装,有些功能还允许配置多个选项:

  1. features:
  2. - blackfire:
  3. server_id: "server_id"
  4. server_token: "server_value"
  5. client_id: "client_id"
  6. client_token: "client_value"
  7. - cassandra: true
  8. - chronograf: true
  9. - couchdb: true
  10. - crystal: true
  11. - docker: true
  12. - elasticsearch:
  13. version: 7
  14. - gearman: true
  15. - golang: true
  16. - grafana: true
  17. - influxdb: true
  18. - mariadb: true
  19. - minio: true
  20. - mongodb: true
  21. - mysql8: true
  22. - neo4j: true
  23. - ohmyzsh: true
  24. - openresty: true
  25. - pm2: true
  26. - python: true
  27. - rabbitmq: true
  28. - solr: true
  29. - webdriver: true

MariaDB

启用 MariaDB 将会移除 MySQL 并安装 MariaDB。MariaDB 是 MySQL 的替代品,完全兼容 MySQL,所以在应用的数据库配置中你仍然可以使用 mysql 驱动。

MongoDB

默认安装的 MongoDB 将会设置数据库用户名为 homestead 及对应的密码为 secret

Elasticsearch

如果你要安装 Elasticsearch,你可以在 Homestead.yaml 文件中添加 elasticsearch 选项并指定支持的版本号。可以仅包含主版本,也可以是某个具体的版本号(major.minor.patch)。默认安装会创建一个名为「homestead」的集群。 注意永远不要赋予 Elasticsearch 超过操作系统一半的内存,因此请保证你的 Homestead 至少分配了两倍于 Elasticsearch 的内存。

提示:你可以查看 Elasticsearch documentation 文档学习如何自定义你的配置。

Neo4j

默认安装的 Neo4j 会设置数据库用户名为 homestead 及对应的密码 secret。要查看 Neo4j,可以在浏览器中访问 http://homestead.test:7474,Neo4j 对外提供了三个端口:7687(Bolt)、7474(HTTP)、7473(HTTPS) 用于从客户端访问。

别名

你可以在 Homestead 目录下通过编辑 aliases 文件为 Homestead 机器添加 Bash 别名:

  1. alias c='clear'
  2. alias ..='cd ..'

更新完 aliases 文件后,需要通过 vagrant reload —provision 命令重启 Homestead 机器,以确保新的别名在机器上生效。

日常使用

全局访问 Homestead

有时你可能想在文件系统的任意路径都能运行 vagrant up 命令启动 Homestead 虚拟机。在 Mac / Linux 系统上可以在 Bash 配置文件( ~/.bash_profile )中添加 Bash 函数 。在 Windows 上, 你可以添加「批处理」文件到 PATH 。这些脚本允许你在系统的任何位置运行 Vagrant 命令并自动将该命令指向 Homestead 的安装路径。

Mac / Linux

  1. function homestead() {
  2. ( cd ~/Homestead && vagrant $* )
  3. }

确保将该函数中的 ~/Homestead 路径调整为实际的 Homestead 安装路径。这样你就可以在系统的任意位置运行 homestead uphomestead ssh 等命令。

Windows

在系统的任意位置创建一个批处理文件 homestead.bat ,内容如下:

  1. @echo off
  2. set cwd=%cd%
  3. set homesteadVagrant=C:\Homestead
  4. cd /d %homesteadVagrant% && vagrant %*
  5. cd /d %cwd%
  6. set cwd=
  7. set homesteadVagrant=

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

通过 SSH 连接

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

但是,你可能需要频繁连接 Homestead 虚拟机,因此请考虑将上面的「函数」添加到主机以便快速地以 SSH 方式连接到 Homestead 虚拟机。

连接数据库

homestead 默认已经在虚拟机中为 MySQL 和 PostgreSQL 数据库做好了配置。要从主机的数据库客户端连接到 MySQL 或 PostgreSQL ,应该连接到 127.0.0.1 ,端口 33060 (MySQL) 或 54320 (PostgreSQL)。用户名和密码分别是 homestead / secret

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

数据库备份

当你的 Vagrant 盒子销毁时,Homestead 能自动备份你的数据库。为了利用这个功能,你必须使用 Vagrant 2.1.0 或者更高的版本。或者,如果你使用一个旧版本的 Vagrant,你必须安装 vagrant-triggers 插件。要开启自动数据库备份,需添加如下的行到你的 Homestead.yaml 文件:

  1. backup: true

一旦配置了,当 vagrant destroy 命令被执行时,Homestead 将导出你的数据库到 mysql_backuppostgres_backup 目录。如果你使用 每个项目安装 方法,则可以在克隆的 Homestead 或者在你的项目根目录中找到这些目录。

数据库快照

Homestead 支持保存 MySQL 和 MariaDB 数据库的状态并通过 Logical MySQL Manager在不同状态间进行切换。例如,假设你的站点数据库有几个 G 的数据量,你可以导入这个数据库并保存一份快照,在本地工作一段时间后有可能会创建一些新的测试内容,你可以通过快照快速恢复到最初的状态。

在底层,LMM 使用了 LVM 的支持写时复制的瘦快照功能,这意味着当修改表中某条记录时,只会将你所做的更改写入磁盘,从而在恢复期节省大量时间和磁盘空间。

由于 lmm 会与 LVM 进行交互,所以必须以 root 身份运行。要了解所有命令,可以在 Homestead 虚拟机中通过 sudo lmm 查看。常见的工作流会是这样:

  • 导入数据库到 lmm 默认的 master 分支。
  • 运行 sudo lmm branch prod-YYYY-MM-DD 保存尚未做任何修改的数据库快照。
  • 修改数据库记录。
  • 运行 sudo lmm merge prod-YYYY-MM-D 撤销所有修改。
  • 运行 sudo lmm delete <branch> 删除不需要的分支。

添加额外的站点

一旦你的 Homestead 环境已配置并运行,你可以为你的 Laravel 应用添加额外的 Nginx 站点。你可能希望在单个 Homestead 环境运行多个 Laravel 安装。要添加额外的站点,到 Homestead.yaml 文件中添加站点:

  1. sites:
  2. - map: homestead.test
  3. to: /home/vagrant/project1/public
  4. - map: another.test
  5. to: /home/vagrant/project2/public

如果 Vagrant 不能自动管理你的『hosts』文件,你可能还需要添加新的站点到该文件中:

  1. 192.168.10.10 homestead.test
  2. 192.168.10.10 another.test

一旦这个站点被添加,从你的 Homestead 目录运行 vagrant reload —provision 命令。

站点类型

Homestead 支持多种类型的站点,允许你轻松运行不是基于 Laravel 的项目。例如,我们可以使用 symfony2 站点类型轻松地添加一个 Symfony 应用到 Homestead:

  1. sites:
  2. - map: symfony2.test
  3. to: /home/vagrant/my-symfony-project/web
  4. type: "symfony2"

可用的站点类型是:apacheapigilityexpressivelaravel(默认),proxysilverstripestatamicsymfony2symfony4,和 zf

站点参数

你可以通过 params 站点指令添加额外的 Nginx fastcgi_param 值到你的站点。例如,我们可以添加一个 FOO 参数,对应参数值是 BAR

  1. sites:
  2. - map: homestead.test
  3. to: /home/vagrant/project1/public
  4. params:
  5. - key: FOO
  6. value: BAR

环境变量

你能通过添加如下的值到 Homestead.yaml 文件来设置全局环境变量:

  1. variables:
  2. - key: APP_ENV
  3. value: local
  4. - key: FOO
  5. value: bar

更新 Homestead.yaml 文件之后,确保通过运行 vagrant reload —provision 命令重新配置机器。这个将更新所有安装 的 PHP 版本的 PHP-FPM 配置并为 vagrant 用户更新环境。

配置 Cron 定时计划

Laravel 提供了一种 定时计划作业 的方式,只需每分钟运行一次 schedule:run Artisan 命令即可。schedule:run 命令将检查在你在 App\Console\Kernel 类中定义的计划来决定运行哪个作业。

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

  1. sites:
  2. - map: homestead.test
  3. to: /home/vagrant/project1/public
  4. schedule: true

站点的 Cron 作业将被定义在虚拟机的 /etc/cron.d 目录中。

配置 Mailhog

Mailhog 允许你轻松地捕获外发的电子邮件并进行检查它,而实际上没有将发送邮件给收件人。开始使用时,使用以下的邮件设置更新你的.env 文件:

  1. MAIL_DRIVER=smtp
  2. MAIL_HOST=localhost
  3. MAIL_PORT=1025
  4. MAIL_USERNAME=null
  5. MAIL_PASSWORD=null
  6. MAIL_ENCRYPTION=null

一旦 Mailhog 被配置,你可以在 http://localhost:8025 上访问 Mailhog 控制面板。

配置 Minio

Minio 是一个开源的对象存储服务器,具有与 Amazon S3 兼容的 API。要安装 Minio,用以下的配置选项更新 Homestead.yaml 文件中的 features 项:

  1. minio: true

默认情况下,Minio 在端口 9600 上是可用的。你可以通过访问 http://homestead:9600 进入Minio 控制面板。默认的 access keyhomestead,默认的 secret keysecretkey,访问 Minio 时,需要使用 us-east-1 区域。

为了使用 Minio,你将需要在你的 config/filesystems.php 配置文件中调整 S3 磁盘配置。你将需要添加 use_path_style_endpoint 选项到磁盘配置,并将 url 键更改为 endpoint

  1. 's3' => [
  2. 'driver' => 's3',
  3. 'key' => env('AWS_ACCESS_KEY_ID'),
  4. 'secret' => env('AWS_SECRET_ACCESS_KEY'),
  5. 'region' => env('AWS_DEFAULT_REGION'),
  6. 'bucket' => env('AWS_BUCKET'),
  7. 'endpoint' => env('AWS_URL'),
  8. 'use_path_style_endpoint' => true
  9. ]

最后,确保你的 .env 文件有如下的选项:

  1. AWS_ACCESS_KEY_ID=homestead
  2. AWS_SECRET_ACCESS_KEY=secretkey
  3. AWS_DEFAULT_REGION=us-east-1
  4. AWS_URL=http://localhost:9600

为了配置 buckets,要添加 buckets 指令到 Homestead 配置文件:

  1. buckets:
  2. - name: your-bucket
  3. policy: public
  4. - name: your-private-bucket
  5. policy: none

支持的 policy 值包括:nonedownloaduploadpublic

端口

默认情况下,如下的端口将转发到你的 Homestead 环境:

  • SSH:2222 -> 转发到 22
  • ngrok UI:4040 -> 转发到 4040
  • HTTP:8000 -> 转发到 80
  • HTTPS:44300 -> 转发到 443
  • MySQL:33060 -> 转发到 3306
  • PostgreSQL:54320 -> 转发到 5432
  • MongoDB:27017 -> 转发到 27017
  • Mailhog:8025 -> 转发到 8025
  • Minio:9600 -> 转发到 9600

转发额外的端口

如果你愿意,你可以转发额外的端口到 Vagrant 盒子,同时也指定他们的协议:

  1. ports:
  2. - send: 50000
  3. to: 5000
  4. - send: 7777
  5. to: 777
  6. protocol: udp

共享你的环境

有时你希望跟同事或客户共享你当前工作的内容。Vagrant 有内置的方法通过 vagrant share 去支持这个;然而,如果在 Homestead.yaml 文件中有多个站点配置,这个将不会工作。

为了解决这个问题,Homestead 包含它自己的 share 命令。开始时,SSH 通过 vagrant ssh 进入你的 Homestead 机器并运行 share homestead.test。这个将从你的 Homestead.yaml 配置文件中分享 homestead.test 站点。当然,你可以将任何其它配置的站点替换为 homestead.test

  1. share homestead.test

运行此命令之后,你将看到一个 Ngrok 屏幕出现,其中包含了活动日志和共享站点的可访问的 URLs。如果你想指定一个自定义的区域,子域,或者其它 Ngrok 运行时选项,你可以添加他们到你的 share 命令:

  1. share homestead.test -region=eu -subdomain=laravel

注意:记住,Vagrant 本质上是不安全的,并且在运行 share 命令时将虚拟机显露到互联网。

多版本 PHP

Homestead 6 在同一个虚拟机上引入了对多个 PHP 版本的支持。你可以在你的 Homestead.yaml 文件中指定要用于给定站点的 PHP 版本。可用的 PHP 版本是:『5.6』,『7.0』,『7.1』,『7.2』『7.3』和『7.4』(默认):

  1. sites:
  2. - map: homestead.test
  3. to: /home/vagrant/project1/public
  4. php: "7.1"

另外,你可以通过 CLI 使用任何支持的 PHP 版本:

  1. php5.6 artisan list
  2. php7.0 artisan list
  3. php7.1 artisan list
  4. php7.2 artisan list
  5. php7.3 artisan list
  6. php7.4 artisan list

还可以在虚拟机中通过如下这些命令来更新默认的 CLI 版本:

  1. php56
  2. php70
  3. php71
  4. php72
  5. php73
  6. php74

Web 服务器

默认情况下,Homestead 使用 Nginx 作为 Web 服务器。不过,如果指定 apache 作为站点类型,也能安装 Apache。两个 Web 服务器可以同时安装,但是不能同时运行。Shell 命令 flip 可用于简化在不同 Web 服务器之间的切换处理,其工作原理是先自动判断哪个 Web 服务器正在运行,然后将其关闭,接着启动另一个服务器。要使用这个命令,需要 SSH 进入到你的到 Homestead 虚拟机并在终端中运行:

  1. flip

邮件

Homestead 包含了 Postfix 邮件转发代理,默认监听 1025 端口,所以,你可以指定你的应用在 localhost 端口 1025 上使用 smtp 邮件驱动。这样,所有发送的邮件将由 Postfix 处理并由 Mailhog 捕获。要查看已发送的邮件,可以在浏览器打开 http://localhost:8025/

调试 & 分析

使用 Xdebug 调试 Web 请求

Homestead 引入了 Xdebug 提供对逐步调试的支持。例如,你可以从浏览器加载某个页面,此时 PHP 会连接到你的 IDE 以便允许对运行代码进行检查和修改。

默认情况下,Xdebug 已经运行并且准备好接收连接,如果你需要在 CLI 中启用 Xdebug,在 Homestead 虚拟机中运行 sudo phpenmod xdebug 命令即可。接下来,按照 IDE 的引导来启用调试功能。最后,通过浏览器扩展或者 bookmarklet 配置浏览器触发 Xdebug。

注意:Xdebug 会导致 PHP 运行变慢,要禁用 Xdebug,可以在虚拟机中运行 sudo phpdismod xdebug 并重启 PHP-FPM 服务。

调试 CLI 应用

要调试 PHP CLI 应用,可以在 Homestead 虚拟机中使用 xphp 命令:

  1. xphp path/to/script

自动启动 Xdebug

当发送请求到 Web 服务器调试功能测试时,自动启动调试比修改测试通过自定义请求头或者 Cookie 来触发调试要轻松许多。要设置 Xdebug 自动启动,可以在 Homestead 虚拟机中编辑 /etc/php/7.#/fpm/conf.d/20-xdebug.ini 添加如下配置来完成:

  1. ; If Homestead.yaml contains a different subnet for the IP address, this address may be different...
  2. xdebug.remote_host = 192.168.10.1
  3. xdebug.remote_autostart = 1

使用 Blackfire 分析应用

Blackfire 是一个用于分析 Web 请求和 CLI 应用以及编写性能断言的 Saas 服务,它提供了一个交互式用户界面用来显示调用关系图和时间线中的分析数据,可以在开发、预发和生产环境中使用,对终端用户来说也没有额外开销,我们可以通过它实现对代码和 php.ini 配置的性能、质量和安全检查。

Blackfire Player 是一个开源的功能强大的 Web 爬取、测试和数据提取应用,可以和 Blackfire 一起用于脚本分析场景。

要启用 Blackfire,需使用 Homestead 配置文件的 features 配置项来设置:

  1. features:
  2. - blackfire:
  3. server_id: "server_id"
  4. server_token: "server_value"
  5. client_id: "client_id"
  6. client_token: "client_value"

获取Blackfire 服务器凭证和客户端凭证需要注册账号,Blackfire 提供了多个方案来分析应用,包括一个客户端工具和浏览器扩展,更多详细请参考 Blackfire 官方文档

使用 XHGui 分析 PHP 性能

XHGui 是一个用于探索 PHP 应用性能的图形化界面,需要结合 XHProf 使用。要启用 XHGui,需在站点配置中新增 xhgui: 'true' 配置:

  1. sites:
  2. -
  3. map: your-site.test
  4. to: /home/vagrant/your-site/public
  5. type: "apache"
  6. xhgui: 'true'

如果站点已经存在,更新配置之后需要运行 vagrant provision 命令使其生效。

要分析一个 Web 请求,需要添加 xhgui=on 到查询字符串作为请求参数,XHGui 会自动添加 Cookie 到响应,以便后续请求不再需要添加查询字符串。你可以访问 http://your-site.test/xhgui 来查看应用分析结果。

要使用 XHGui 分析一个 CLI 请求,需要在命令之前加上 XHGUI=on 前缀:

  1. XHGUI=on path/to/script

CLI 分析结果可以通过和 Web 分析结果一样的方式查看。

注意以上分析行为会让脚本执行变慢,甚至会导致性能降低一半,因此,我们通常会按照百分比选取一小部分样本进行分析,并根据分析结果进行改进,此外,注意分析结果中的执行时间包含了调试器中花费的所有时间。

由于性能分析会耗费大量的磁盘空间,它们会在几天之后被自动删除。

网络接口

Homestead.yaml 中的 networks 属性为 Homestead 环境配置网络接口。你可以根据需要配置多个接口:

  1. networks:
  2. - type: "private_network"
  3. ip: "192.168.10.20"

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

  1. networks:
  2. - type: "public_network"
  3. ip: "192.168.10.20"
  4. bridge: "en1: Wi-Fi (AirPort)"

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

  1. networks:
  2. - type: "public_network"
  3. bridge: "en1: Wi-Fi (AirPort)"

扩展 Homestead

你可以使用 Homestead 根目录下的 after.sh 脚本来扩展 Homestead 的功能,在这个文件中,你可以添加任意 shell 命令来配置和自定义你的虚拟机。

当自定义 Homestead 时,Ubuntu 可能会询问你是要保留程序包的原始配置还是用一个新的配置文件覆盖它。为了避免这种情况,你应该在安装软件包时使用以下的命令,以避免覆盖之前由 Homestead 编写的任何配置:

  1. sudo apt-get -y \
  2. -o Dpkg::Options::="--force-confdef" \
  3. -o Dpkg::Options::="--force-confold" \
  4. install your-package

用户自定义

在团队环境中使用 Homestead 时,你可能想要调整 Homestead 以便更好地适应你自己喜好的个人开发风格,这可以通过在 Homestead 根目录下创建 user-customizations.sh 文件来完成,在这个文件中,你可以做一些自己喜欢的定制化工作;不过,注意不要把 user-customizations.sh 文件提交到代码仓库中。

更新 Homestead

更新 Homestead 之前确保你已经在 Homestead 目录下通过如下命令移除了当前的虚拟机:

  1. vagrant destroy

接下来,需要更新 Homestead 源码,如果你已经克隆仓库到本地,可以在项目根目录下运行如下命令进行更新:

  1. git fetch
  2. git pull origin release

这些命令从 GitHub 仓库拉取最新的 Homestead 代码,获取最新的标记,然后检出最新的标记版本。你能在 GitHub 版本页面 找到最新稳定的版本。

如果你通过你的项目的 composer.json 安装 Homestead,你应当确保你的 composer.json 包含 "laravel/homestead": "^10" 并更新你的依赖项:

  1. composer update

然后,需要通过 vagrant box update 命令更新 Vagrant 盒子:

  1. vagrant box update

最后,你需要重新生成新的 Homestead 盒子来使用最新安装的 Vagrant:

  1. vagrant up

提供特殊设置

VirtualBox

natdnshostresolver

默认情况下,Homestead 将 natdnshostresolver 配置设置为 on。这允许 Homestead 去使用你的主机操作系统的 DNS 设置。如果你不想覆盖这个行为,添加如下的行到你的 Homestead.yaml 文件:

  1. provider: virtualbox
  2. natdnshostresolver: 'off'

Windows 上的符号链接

如果符号链接在你的 Windows 机器上无法正常工作,你可能需要添加以下的块到 Vagrantfile 文件:

  1. config.vm.provider "virtualbox" do |v|
  2. v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
  3. end

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接 我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

Laravel China 社区:https://learnku.com/docs/laravel/7.x/homestead/7450