Syntax Error.

[Sy] 作業メモ 〜MacのHomebrewとPHPまわりの環境整備〜

2019/01/16

Mac で久々に PHP のプロジェクトを扱うことになったので、PHP まわりの環境整えようとした時の作業メモ。( phpenv は使わずに Homebrew から直接 PHP をインストールしています)

※このエントリーは、ぼくがどのように考えて作業したのかを残したものです。途中まわり道をしていたり、間違ったことをしてることもあるのでご注意ください。

とりあえず Homebrew を update

しばらく Homebrew を放置してたから update してみよう。

$ brew update
・
・
・
==> Deleted Formulae
php@5.6 ✔               cctools                 gradle@2.14             maven@3.0               pyexiv2
php@7.0 ✔               cctools-headers         gv                      maven@3.1               rock
apple-gcc42             ffmbc                   kibana@4.4              nethack4                ruby@2.2
aptly-completion        gnome-doc-utils         ld64                    pldebugger

え?PHPのパッケージ(フォーミュラ)が削除されてる・・・

ちょっと調べよう。

PHPの状態を確認

まず今インストール済みの PHP のパッケージを検索。

$ brew list | grep php
php@5.6
php@7.0

5.6と7.0があった。記憶の片隅にphp56というパッケージの名前が変わってphp@5.6になったりとかあった気がするけど、その時どうしたか細かく覚えてない。

とりあえず今有効なのは、7.0 だったはず。。。

$ php -version
PHP 7.0.31 (cli) (built: Jul 19 2018 23:41:03) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.31, Copyright (c) 1999-2017, by Zend Technologies

うん、合ってた。パスはどこ見てるのかな?

$ which php
/usr/local/opt/php@7.0/bin/php

あれ? Homebrew って /usr/local/Cellar/ 配下にインストールするんじゃなかったっけ?シンボリックリンクかな?

$ ls -l | grep php
lrwxr-xr-x  1 utano320  admin  26  5  3  2018 php56 -> ../Cellar/php@5.6/5.6.32_8
lrwxr-xr-x  1 utano320  admin  24  5 10  2018 php@5.6 -> ../Cellar/php@5.6/5.6.36
lrwxr-xr-x  1 utano320  admin  24  8  5 11:03 php@7.0 -> ../Cellar/php@7.0/7.0.31

なるほどなるほど。php56 ってのが残ってて気持ち悪いなぁ。

ひとまず現状は把握できた。

PHP7.3をインストールする

で、php@5.6php@7.0 が消えるわけだから、他のパッケージを入れる必要が出てくるのかな?何があるんだろう?

$ brew search php@7
==> Formulae
php@7.1    php@7.2    php@7.3

単純に古いバージョンは消していこうという方針なのかな?(元から?)

てことは php@7.3 を入れるとかになるのかな?

まずは 5.6 を削除してみよう。brew upgrade コマンドでいいのかな? Deleted Formulae になったパッケージの反映ってやったことなかったな。

$ brew upgrade php@5.6
Updating Homebrew...
Error: php@5.6 5.6.36 already installed

あ、こうじゃないのね。

んーググってみてもそれらしい方法は見つからない。

普通にバージョンを上げたいときと同じような手順でやってみるか。

まずは php@7.3 をインストールしてみよう。

$ brew install php@7.3
・
・
・
==> Installing php
==> Downloading https://homebrew.bintray.com/bottles/php-7.3.1.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Pouring php-7.3.1.mojave.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink sbin/php-fpm
/usr/local/sbin is not writable.

You can try again using:
  brew link php
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set php_ini /usr/local/etc/php/7.3/php.ini system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set php_dir /usr/local/share/pear system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set doc_dir /usr/local/share/pear/doc system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set ext_dir /usr/local/lib/php/pecl/20180731 system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set bin_dir /usr/local/opt/php/bin system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set data_dir /usr/local/share/pear/data system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set cfg_dir /usr/local/share/pear/cfg system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set www_dir /usr/local/share/pear/htdocs system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set man_dir /usr/local/share/man system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set test_dir /usr/local/share/pear/test system
==> /usr/local/Cellar/php/7.3.1/bin/pear config-set php_bin /usr/local/opt/php/bin/php system
==> /usr/local/Cellar/php/7.3.1/bin/pear update-channels
==> Caveats
To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

Finally, check DirectoryIndex includes index.php
    DirectoryIndex index.php index.html

The php.ini and php-fpm.ini file can be found in:
    /usr/local/etc/php/7.3/

To have launchd start php now and restart at login:
  brew services start php
Or, if you don't want/need a background service you can just run:
  php-fpm
==> Summary
🍺  /usr/local/Cellar/php/7.3.1: 521 files, 76.4MB
・
・
・

一応インストールはできたみたいだけど、エラー出た。この部分。

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink sbin/php-fpm
/usr/local/sbin is not writable.

なになに、 brew link で失敗してる。 /usr/local/sbin がないからっぽい。

調べてみるとたしかにない。

$ ls -al /usr/local/ | grep sbin
(出力なし)

うん、実は知ってた。brew doctor してみたら警告出てた。エラーじゃないから大丈夫だろって思ってた。ごめんなさい。

Homebrewの状態確認

改めて・・・

$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories do not exist:
/usr/local/sbin

You should create these directories and change their ownership to your account.
  sudo mkdir -p /usr/local/sbin
  sudo chown -R $(whoami) /usr/local/sbin

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
  /Users/utano320/.pyenv/shims/python3.5m-config
  /Users/utano320/.pyenv/shims/python2-config
  /Users/utano320/.pyenv/shims/icu-config
  /Users/utano320/.pyenv/shims/libpng16-config
  /Users/utano320/.pyenv/shims/python3.6m-config
  /Users/utano320/.pyenv/shims/python2.7-config
  /Users/utano320/.pyenv/shims/python3.5-config
  /Users/utano320/.pyenv/shims/python-config
  /Users/utano320/.pyenv/shims/python3-config
  /Users/utano320/.pyenv/shims/ncursesw6-config
  /Users/utano320/.pyenv/shims/pcre-config
  /Users/utano320/.pyenv/shims/python3.6-config

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  php

Warning: Broken symlinks were found. Remove them with `brew cleanup`:
  /usr/local/bin/docker-credential-osxkeychain.backup
  /usr/local/bin/hyperkit.backup
  /usr/local/bin/notary.backup
  /usr/local/bin/vpnkit.backup
  /usr/local/etc/bash_completion.d/_brew_services
  /usr/local/opt/php56

Warning: Some installed formulae are missing dependencies.
You should `brew install` the missing dependencies:
  brew install ncurses

Run `brew missing` for more details.

冒頭に「警告は心配しなくていいよ、無視していいよ」って書いてあるんだけどなぁ。。。まぁいいやおとなしく対応していこう。

ついでに全部警告消したい。

まずはこれから。今回問題になったやつだな。

Warning: The following directories do not exist:
/usr/local/sbin

You should create these directories and change their ownership to your account.
  sudo mkdir -p /usr/local/sbin
  sudo chown -R $(whoami) /usr/local/sbin

親切にコマンド書いてあるのでそのとおりやってみよう。/usr/local/sbin を作って、自分をオーナーにする。

$ sudo mkdir -p /usr/local/sbin
$ sudo chown -R $(whoami) /usr/local/sbin
$ ls -al /usr/local | grep sbin
drwxr-xr-x    2 utano320  wheel     64  1 11 11:15 sbin

できた。警告も1つ消えた。

次はこれ。

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
  /Users/utano320/.pyenv/shims/python3.5m-config
  /Users/utano320/.pyenv/shims/python2-config
  /Users/utano320/.pyenv/shims/icu-config
  /Users/utano320/.pyenv/shims/libpng16-config
  /Users/utano320/.pyenv/shims/python3.6m-config
  /Users/utano320/.pyenv/shims/python2.7-config
  /Users/utano320/.pyenv/shims/python3.5-config
  /Users/utano320/.pyenv/shims/python-config
  /Users/utano320/.pyenv/shims/python3-config
  /Users/utano320/.pyenv/shims/ncursesw6-config
  /Users/utano320/.pyenv/shims/pcre-config
  /Users/utano320/.pyenv/shims/python3.6-config

ここを参考に対応

⇒ 【Homebrew】brew doctorのWarning対処方法 (その3) + envコマンドについて - TASK NOTES
$ echo 'alias brew="env PATH=${PATH/\/Users\/utano320\/.pyenv\/shims:/} brew"'

消えた。

次はこれ。

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  php

ちょっと先ほどのPHPのインストールにコケたやつに付随してるかもしれないので、一旦パス。次へ。

Warning: Broken symlinks were found. Remove them with `brew cleanup`:
  /usr/local/bin/docker-credential-osxkeychain.backup
  /usr/local/bin/hyperkit.backup
  /usr/local/bin/notary.backup
  /usr/local/bin/vpnkit.backup
  /usr/local/etc/bash_completion.d/_brew_services
  /usr/local/opt/php56

シンボリックリンクが壊れてるやつ。brew cleanup すれば良いみたいなのでやってみる。

$ brew cleanup
・
・
・
Pruned 6 symbolic links and 25 directories from /usr/local
==> This operation has freed approximately 765.8MB of disk space.

警告消えた。そしてめっちゃディスク空いたw

次はこれ。

Warning: Some installed formulae are missing dependencies.
You should `brew install` the missing dependencies:
  brew install ncurses

依存してるパッケージがうまく入ってないみたい。インストールする。

$ brew install ncurses
・
・
・
🍺  /usr/local/Cellar/ncurses/6.1: 3,869 files, 8.3MB

消えた。

ここでPHP7.3を一応再インストールしてみる。

$ brew install php@7.3
Updating Homebrew...
Warning: php 7.3.1 is already installed, it's just not linked
You can use `brew link php` to link this version.

あ、やっぱりインストールはできてるのね。シンプルに brew link php でさっきの警告も一緒に解決できそう。

$ brew link php
Linking /usr/local/Cellar/php/7.3.1... 24 symlinks created

これで全部警告消えたかな?

$ brew doctor
Warning: Homebrew's sbin was not found in your PATH but you have installed
formulae that put executables in /usr/local/sbin.
Consider setting the PATH for example like so
  echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc

お、新しいの出てきた。 /usr/local/sbin をPATHの先頭に入れないといけない様子。

.zshrc に追記しよう。先程追記したalias brew=...の前に入れる必要がある。

$ vim ~/.zshrc
(.zshrc)
・
・
・
export PATH="/usr/local/sbin:$PATH"  <--追記
alias brew="env PATH=${PATH/\/Users\/utano320\/.pyenv\/shims:/} brew"

ようやく brew doctor で警告でなくなった。

PHP7.0を見てる・・・

しかしまだPHPは終わってなさそう。

$ php --version
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
  Referenced from: /usr/local/opt/php@7.0/bin/php
  Reason: image not found
zsh: abort      php --version

なんかphp@7.0からライブラリの読み込みに失敗してる。というか7.0まだ見てるやん。

$ which php
/usr/local/opt/php@7.0/bin/php

うーん、一度5.6と7.0と7.3すべてアンインストールしちゃおう。

$ brew remove php@5.6
Uninstalling /usr/local/Cellar/php@5.6/5.6.36... (499 files, 63.9MB)

$ brew remove php@7.0
Uninstalling /usr/local/Cellar/php@7.0/7.0.31... (503 files, 65.6MB)

$ brew remove php@7.3
Uninstalling /usr/local/Cellar/php/7.3.1... (522 files, 76.4MB)

MacのデフォルトのPHPを見るようになった。

$ php --version
PHP 7.1.19 (cli) (built: Aug 17 2018 20:10:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

$ which php
/usr/bin/php

Homebrewも問題ない。

$ brew doctor
Your system is ready to brew.

改めてphp@7.3をインストール

$ brew install php@7.3
・
・
・
🍺  /usr/local/Cellar/php/7.3.1: 521 files, 76.4MB
==> Caveats
・
・
・
To have launchd start php now and restart at login:
  brew services start php
Or, if you don't want/need a background service you can just run:
  php-fpm

エラーもなく無事インストールできた。動作確認してみる。

$ php --version
PHP 7.3.1 (cli) (built: Jan 10 2019 13:15:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies

うん、7.3になってる。

インタラクティブシェルも問題ない。

$ php -a
Interactive shell

php > $a = 3;
php > $b = 2;
php > echo $a + $b;
5
php > exit

nginx と php-fpm の状態をチェック

$ sudo lsof -i:80
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
nginx      67     root    6u  IPv4 0x7b0258cff04cba53      0t0  TCP *:http (LISTEN)
nginx     211   nobody    6u  IPv4 0x7b0258cff04cba53      0t0  TCP *:http (LISTEN)
Google    372 utano320  185u  IPv4 0x7b0258cffada6753      0t0  TCP localhost:55120->localhost:http (CLOSE_WAIT)
$ sudo lsof -i:9000
(出力なし)

nginx は起動してる、 php-fpm は起動してない。

php@7.3 インストール時に出てたメッセージを参考に php-fpm を起動。

$ brew services start php
==> Successfully started `php` (label: homebrew.mxcl.php)

起動したっぽい。再確認。

$ sudo lsof -i:9000
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
php-fpm 44712 utano320    8u  IPv4 0x7b0258d001c753d3      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 44716 utano320    9u  IPv4 0x7b0258d001c753d3      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 44717 utano320    9u  IPv4 0x7b0258d001c753d3      0t0  TCP localhost:cslistener (LISTEN)

PHP(ついでにHomebrew)の環境がきれいになりましたー。