Mac使用brew安装多版本php

原创
2020/05/31 11:26
阅读数 1.4W

Mac 多版本php的安装


swingcoder

2020-05-31


因有些项目仍运行在已经废弃的php5的版本,有些运行在php7,所以需要配置多版本的php开发运行环境,下面是成功实践的安装步骤。

下面的敏感词数字会替换成英文six four,看官脑回路自动替换啊


环境说明

$ brew config

HOMEBREW_VERSION: 2.3.0 ORIGIN: https://github.com/Homebrew/brew HEAD: 77e09fc166f5fb7197b239d5e2727ddc0791c121 Last commit: 33 hours ago Core tap ORIGIN: https://github.com/Homebrew/homebrew-core Core tap HEAD: 999f520b4d5b204989eaab7ae0927f24d9973e57 Core tap last commit: 3 hours ago HOMEBREW_PREFIX: /usr/local HOMEBREW_MAKE_JOBS: 16 HOMEBREW_NO_INSTALL_CLEANUP: set CPU: 16-core 64-bit kabylake Homebrew Ruby: 2.6.3 => /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby Clang: 11.0 build 1103 Git: 2.24.3 => /Library/Developer/CommandLineTools/usr/bin/git Curl: 7.64.1 => /usr/bin/curl macOS: 10.15.5-x86_64 CLT: 1103.0.32.62 Xcode: 11.5

安装php7

此步骤比较简单,因为homebrew默认的就是php7.4版本了,php5的安装脚本已经没有了。

$ brew install php

正常情况,这一条命令就可以了。然后是配置成开机自动启动服务

$ brew services restart php

如果提示services没安装,则要先添加仓库再执行上述命令

$ brew tap homebrew/services

安装php5

php5的formula已经从官方渠道删除了,要寻找第三方仓库提供的formula,如

$ brew tap exolnet/homebrew-deprecated

$ brew install php@5.6

不幸的事,安装到最后,发生了类似以下的错误

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib Referenced from: /usr/local/Cellar/php@5.6/5.6.40/bin/php Reason: image not found

libicu是一个字符国际化的类库icu4c,php5依赖icu4c的【six four】之前的版本,php7依赖66以上版本,所以必须要安装多版本icu4c。我们先来查看一下有哪些历史版本

$ brew log icu4c$ git log -S '64' --follow icu4c.rb

按空格翻页,按q退出

已经废弃 brew tap homebrew/versions

可以发现【six four】的版本号放到bottle的是这次提交

commit 896d1018c7a4906f2c3fa1386aaf283497db60a2 Author: BrewTestBot homebrew-test-bot@lists.sfconservancy.org Date: Sat Sep 28 13:49:39 2019 +0000 icu4c: update 64.2 bottle.

接下来我们签出这个版本的forumla

$ cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

$ git checkout -b icu4c-64 896d1018c7a4906f2c3fa1386aaf283497db60a2

现在还不能直接安装这个版本的icu4c,因为同一个forumla名称安装后只能保存一个版本,也就是说如果你直接安装【six four】的,66、67的将删自动删除,反过来也一样,详情讨论在这里,似乎官方比较坚持这种默认行为,虽然给某些系统运维的人带来了一些风险,不过,大部分只是普通使用,不存在像开发人员、运维人员要求需要兼容旧版本的问题似乎问题不大。官方FAQ的说明,可以使用全局变量export HOMEBREW_NO_INSTALL_CLEANUP=1来禁止自动删除,好像并没有生效

这里我们新创建一个formual来避免这种自动删除其他版本的问题

$ cp icu4c.rb icu4c@64.2.rb

$ vi icu4c@64.2.rb

修改class名称 class Icu4cAT642,保存退出,然后安装

$ brew install icu4c@64.2

完成后会安装到/usr/local/opt/icu4c@64.2/,为方便php找到正确的文件,还需要复制一份lib到正确的地方,创建符号链接也可以,手工修改比较麻烦一些

$ cp /usr/local/opt/icu4c@64.2/lib/*.64.dylib /usr/local/opt/icu4c/lib/

或者使用link方式复制(没验证过)

brew link icu4c@64.2

然后再执行php后续的任务

$ brew postinstall exolnet/deprecated/php@5.6

执行后发现又报了一个新的错误

dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

如何解决这个问题呢,方法是类似的,因为导致问题的原因:都是类库版本不一致,解决的方案就是找到新、旧两个版本都安装进去。

找到openssl 最后一个1.0 bottle(预编译)的版本

$ brew log openssl (2020.10.19 此命令已经列不出1.0版本的提交了,可能提交太多有数量限制,有需要旧版openssl@1.0的留言打包提供,也是可以直接使用的。2020.11.17 还是可以打到旧版的提交记录,可能是之前没按空格翻页,找到的1.0.1版本提交id commit d4998f92a33ce92fba56c56c4afa723f32797f17)

commit dd056d5e42d24529e935ca0f03f4f29c8d7504e8 Author: BrewTestBot brew-test-bot@googlegroups.com Date: Thu May 12 02:09:47 2016 +0100 openssl: update 1.0.2h_1 bottle.

按操作icu4c的类似方法编译此版本

cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

git checkout -b openssl-1.0 dd056d5e42d24529e935ca0f03f4f29c8d7504e8

如果已经有此分支,则切换分支 git checkout openssl-1.0

安装openssl 1.0版本不用复制一个新的formula,因为官方提供的openssl 1.1是安装在一个独立的目录的,不是在/usr/local/Cellar/openssl/目录下,而是安装在/usr/local/Cellar/openssl@1.1/目录下,所以不会冲突,可以直接安装

$ brew install ./openssl.rb

$ git checkout master

上面是官方brew源的安装方法,无意中我发现了一个第三方的formula,也可以直接安装,如下。不过这种方式会有告警,提示不安全。

$ brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb

Warning: Calling Non-checksummed download of openssl formula file from an arbitrary URL is deprecated! Use 'brew extract' or 'brew create' and 'brew tap-new' to create a formula file in a tap on GitHub instead.

或者采用以下方式安装第三方formula

brew install hub

brew update

cd $(brew --repository)

hub pull someone_else

brew pull https://github.com/Homebrew/homebrew-core/pull/1234

安装完成后再次执行php收尾脚本

brew postinstall exolnet/deprecated/php@5.6

** 一切正常!**

因为现在系统有两套php,一些log和配置、端口文件有可能会共用导致冲突,所以还需要一些定制,比如php5用端口9090,php7用9000等。

  • 修改服务配置

$ vi $(brew --prefix)/Homebrew/Library/Taps/exolnet/homebrew-deprecated/Formula/php@5.6.rb

#找到--nodaemonize,复制一行,替换--nodaemonize为--fpm-config=/usr/local/etc/php/5.6/php-fpm.conf

#保存退出,重装安装一次php

$ brew reinstall exolnet/deprecated/php@5.6

  • 修改端口、日志文件名、进程pid等

$ vi /usr/local/etc/php/5.6/php-fpm.conf

pid = run/php-fpm-56.pid

error_log = log/php-fpm-56.log

listen = 127.0.0.1:9090

php_admin_value[error_log] = /var/log/fpm-php-56.www.log

此时可以启动php5.6进程

$ brew services restart php@5.6

启动成功后查看进程和端口是否正常,并核实在目录/Users/your_name/Library/LaunchAgents 下有没有安装自动启动脚本,下次电脑开机会自动启动。

总结

旧版php相关依赖库逐步废弃淘汰,要安装成功,就是解决这些旧类库的依赖问题,而解决的方法就是用brew log the_formula找到旧版本的预编译bottle版本,再重新安装,同时,为避免brew的默认版本不能共存的问题,还需要对formula进行定制再安装,然后php再重新指定这些依赖库或复制这些依赖库到目标地址。

过程有点啰嗦,还是要多研究homebrew官方手册教程自建formula的方法,应该还有更加方便的方法。

👉👉👉 更多最佳实践来这里 http://blog.wukun.info/ 👽👽👽

后记:

2020.11.19 系统升级后无意中又把libssl.1.0.0.dylib删除了,依赖此文件的php@5.6又启动不了了,系统默认的openssl变成1.1版本了,而且要命的是,big sur系统比较新,brew 并不能像上述从本地安装forumlae,如brew install ./openssl.rb会报错,找不到./openssl.rb,见鬼了。

最后是直接从源代码安装解决了此问题,不依赖brew命令安装的方式,下面是具体过程:

#首先找到1.0版本的下载包
cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
git checkout -b openssl-1.0 dd056d5e42d24529e935ca0f03f4f29c8d7504e8
#如何已经创建了分支用 git checkout openssl-1.0
cat openssl.rb
#找到tar.gz下载url,下载到本地,如
cd /tmp
wget http://www.openssl.org/source/openssl-1.0.0-beta3.tar.gz
tar xzvf openssl-1.0.0-beta3.tar.gz
cd openssl-1.0.0-beta3
./Configure darwin64-x86_64-cc shared zlib-dynamic --prefix=/usr/local/Cellar/openssl --openssldir=/usr/local/Cellar/openssl
make
#make此过程如果过错,只能更换不同的tar版本包了,我试过1.0.1的包make不了,出现各种异常
sudo make install
#make install如出错,我遇到是man文件安装失败,则不安装man,使用sudo make install_sw只安装类库即可
#然后创建两个symbol link
ln -s /usr/local/Cellar/openssl/lib/libcrypto.1.0.0.dylib /usr/local/opt/openssl/lib/
ln -s /usr/local/Cellar/openssl/lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/
#此时再启动php@5.6一般会成功,如果不成功,考虑重新安装php@5.6
brew tap exolnet/homebrew-deprecated
brew reinstall php@5.6
#启动服务
brew services restart php@5.6
#检查是否启动
brew services list
展开阅读全文
打赏
2
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
2
分享
返回顶部
顶部