如何在使用vagrant up命令启动Homestead时自动启用php扩展

13

我在虚拟机环境下,使用Vagrant 1.8.7 和 VirtualBox 运行 Laravel 5.3。

我需要启用一些php扩展。

我知道我可以ssh进入虚拟机并编辑php.ini以启用扩展,但这似乎不是一个很好的vagrant方式。

我希望告诉Vagrant在启动时自动启用特定的php扩展,这样我就可以只需调用 vagrant up --provision,虚拟机就可以准备好了(这不是vagrant的意义所在吗?)

那么,如何在Homestead中自动启用php扩展以供vagrant启动时使用?

3个回答

13

经过一些摸索,以下是我想出来的内容。我不保证这是正确的方法,只是在我的情况下它似乎起作用了:

找到在你安装Homestead时生成的after.sh文件。在我这里,在Mac El Capitain上,该文件被创建在~/.homestead/after.sh,我想在Windows上有一个类似位置的.bat文件。

不要错误地编辑~/Homestead/src/stubs/after.sh,那是Homestead安装的模板文件,而不是你实际生成的副本。


编辑after.sh

将以下行添加到after.sh中(这是我的整个文件,只有前5个注释行是默认文件):

#!/bin/sh

# If you would like to do some extra provisioning you may
# add any commands you wish to this file and they will
# be run after the Homestead machine is provisioned.

# in the below --assume-yes is to avoid confirms [y/N]
# DEBIAN_FRONTEND=noninteractive is to avoid a big menu asking if it's ok to 
# overwrite the php.ini file, may make --assume-yes redundant, not sure

# run apt-get update first, without it I was getting errors not finding the extensions 
sudo DEBIAN_FRONTEND=noninteractive apt-get --assume-yes update

# load any extensions you like here 
sudo DEBIAN_FRONTEND=noninteractive apt-get --assume-yes install php-xdebug 
sudo DEBIAN_FRONTEND=noninteractive apt-get --assume-yes install php7.0-ldap # update to php7.2-ldap if using php 7.2 etc...

# enable xdebug via cli
sudo phpenmod -s cli xdebug

# restart php and nginx
sudo service php7.3-fpm restart && sudo service nginx restart
如果你不确定需要什么扩展名,可以使用sudo apt-cache search php7-*命令列出可用的扩展名。
现在,如果你已经启动了Homestead,在终端中,cd到你的Homestead目录下,比如我的是 cd ~/Homestead,然后运行vagrant destroy
/Homestead目录下运行vagrant up --provision来启动虚拟机。
为了检查安装是否正确,在/Homestead目录下运行以下两个命令: vagrant ssh php -r "print_r(get_loaded_extensions());" 我的输出结果(添加了33和61):
DoDSoftware:Homestead DOoDSoftware$ vagrant ssh
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
vagrant@homestead:~$ php -r "print_r(get_loaded_extensions());"
Array
(
    [0] => Core
    [1] => date
    [2] => libxml
    [3] => openssl
    [4] => pcre
    [5] => zlib
    [6] => filter
    [7] => hash
    [8] => pcntl
    [9] => Reflection
    [10] => SPL
    [11] => session
    [12] => standard
    [13] => mysqlnd
    [14] => PDO
    [15] => xml
    [16] => apcu
    [17] => apc
    [18] => bcmath
    [19] => calendar
    [20] => ctype
    [21] => curl
    [22] => dom
    [23] => mbstring
    [24] => fileinfo
    [25] => ftp
    [26] => gd
    [27] => gettext
    [28] => iconv
    [29] => igbinary
    [30] => imap
    [31] => intl
    [32] => json
    [33] => ldap
    [34] => exif
    [35] => mcrypt
    [36] => msgpack
    [37] => mysqli
    [38] => pdo_mysql
    [39] => pdo_pgsql
    [40] => pdo_sqlite
    [41] => pgsql
    [42] => Phar
    [43] => posix
    [44] => readline
    [45] => shmop
    [46] => SimpleXML
    [47] => soap
    [48] => sockets
    [49] => sqlite3
    [50] => sysvmsg
    [51] => sysvsem
    [52] => sysvshm
    [53] => tokenizer
    [54] => wddx
    [55] => xmlreader
    [56] => xmlwriter
    [57] => xsl
    [58] => zip
    [59] => memcached
    [60] => blackfire
    [61] => Zend OPcache
    [62] => xdebug
)

正如我一开始所说的,我不能说这是正确的方法,但目前对我来说有效。

如果有人发现这种方法存在缺陷,请随时告诉我我做错了 :)


1
太好了,谢谢你!我唯一改变的是使用 vagrant reload --provision 而不是 destroyup,以避免丢失我的数据库。 - Sygmoral

1

你应该先使用ssh登录Homestead服务器(可能你已经知道了 - "vagrant ssh")。

然后进入 "/etc/php/7.0/fpm/" 目录, 在此位置还有cli版本的 "/etc/php/7.0/cli/" 目录, 使用 "sudo vi php.ini" 命令编辑它(按esc键,然后输入:wq保存更改)。

之后你应该重启nginx:

sudo nginx -s reload"

然后,重新启动php-fpm:

sudo service php7.0-fpm restart" 

如果您不确定您的Homestead上是PHP 5.x还是7.x,请使用以下命令:
find / -name php.ini

查找 php.ini 文件,你可能会得到 2 或 3 个结果。


2
感谢您的时间。我知道如何手动启用扩展程序。但是,我不想每次执行“vagrant up”时都要这样做。我需要能够自动将扩展程序添加为配置过程的一部分,以便在执行“vagrant up --provision”时可以正确设置它。 - Wesley Smith

1

虽然准确,但这有点偏离了主题。最初的需求是特别针对在vagrant up时自动启用Homestead中的php扩展,而这只是手动安装相同的扩展。 - Wesley Smith
真的。我理解为“当我启动vagrant时使其可用”,而不是“在安装时准备好”。 - befabry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接