El capitan(OSX 10.11)に上げたらローカルのPHP環境移行で困ったことのいくつかメモ
Yosemiteがあまりにも不評だったので、お仕事マシンはMavericksでねばってたんですが、流石に二個以上前のバージョンのOSを使い続けるのも何だし各方面の悲鳴も比較的少ない感じだったので、メインマシンをEl capitanにのせかえました、やったー新しい!
iPhoneの連携が結構ふえててHands offとか面白いんですけど、なぜかAir drop連携だけはうまく動かなくて謎。
さておき、El capitanとPHP
El capitanにするとPHPがどう変わるって、systemのPHP*1がPHP 5.5.27ですよ!やったね!
最近のPHPの足は速いので、5.5といってもすでにPHPUnitの最新版では切り捨てられた感じではありますが、not bad感ですよ。
あと、Interactive Shellが有効でビルドされているのもポイント高いですよね!*2 いやーちゃんとPHPの事考えてもらえてますね〜*3。
さて、困った事その1、OpenSSL
私はphpenv+php-buildでPHPの環境を作っているのですが、最初php-buildが通らなくて困りましたね。
具体的にはこんなの
Undefined symbols for architecture x86_64: "_PKCS5_PBKDF2_HMAC", referenced from: _zif_openssl_pbkdf2 in openssl.o "_TLSv1_1_client_method", referenced from: _php_openssl_setup_crypto in xp_ssl.o "_TLSv1_1_server_method", referenced from: _php_openssl_setup_crypto in xp_ssl.o "_TLSv1_2_client_method", referenced from: _php_openssl_setup_crypto in xp_ssl.o "_TLSv1_2_server_method", referenced from: _php_openssl_setup_crypto in xp_ssl.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
フム、opensslの文句ですね。
オチからいえば、これはbrewでopensslとlibxml2をいれた後、--linkし、ビルド時にbrewのopensslを指定してあげる事で解決できました。
$ brew upgrade openssl $ brew link openssl --force $ brew upgrade libxml2 $ brew link libxml2 --force
PHP_BUILD_CONFIGURE_OPTS='--with-openssl=/usr/local/Cellar/openssl/1.0.2d_1' phpenv install 5.6.16
「なんでlibxml2?」
って思うかもしれませんね、そういうものなのです…。
どうしてもビルドがこけるときは /var/tmp/php-build/source/x.x.x/Makefile
もみてみましょう。INCLUDESで、openssl(とlibxml2)がシステムの物をみているかもしれませんよ…?
'openssl/evp.h' file not found
以下みたいな場合は、xcodeのcliツールがはいってない気がします。ググりましょう。
/var/tmp/php-build/source/7.0.0RC4/ext/openssl/openssl.c:44:10: fatal error: 'openssl/evp.h' file not found #include <openssl/evp.h>
困ったその2、libxml2とcurl(?)
(困ったその1に統合したので、削除)
困ったその3、DOMDocumentがちょっとかわった
DOMDocument::importNode(): ID prev already defined
こんな感じのエラーがでます。ユルいHTMLを嫌がるようになったんでしょうか。
ちなみに、これがでたのはGoutteのSymfony\Component\DomCrawler\Crawlerの都合でして、これはGoutteのバージョンをあげたらなおりました。つまりcomposer udpate fabpot/goutte
でなおりました。
が、つまりはDOMDocumentをつかってるコードには影響がでるかもしれん、というやつであり、一種の地雷かもしれません、皆さん気をつけましょう。
困ったその4,curlのSSL通信に厳格になった
とあるライブラリでcurlでTwitterをたたいてたんですが、CURLOPT_SSL_VERIFYPEERがFALSEだったので、curlが以下のようなエラーを吐いてました。
SSL: CA certificate set, but certificate verification is disabled # エラーコードは35
libcurlのバージョンが上がって厳格になったからだとおもうんですが、まあやっていくしかないですね。
FALSEだととってこれなくて、ステータスコードも0になってて結構直すのが面倒でした。
いつも思うけれど、とにかくcurlは正しくあつかうのが面倒なので、どうにかなってほしい所です。curlを上手く扱えるようになってPHPは上級者の仲間入りという感じがしないでもない(?) とはいえ「面倒だから…」といってcurlを素手で触るのを嫌がって、謎のwrapperをつかっていると、こういうときに何もエラーが見れなくて詰むので、皆さん我慢してcurl_*関数をつかっていきましょう…。*4
さておき、ついでに以下もでるかもですね。
SSL: CA certificate set, but certificate verification is disabled # エラーコードは77
以下みたいな感じの指定をすればよいでしょう、cacert.pemは http://curl.haxx.se/ca/cacert.pem 、あるいは https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt からおとせます。
(後者のほうがSSLサイトなんで良いと思う(前者は、平文かよ!って思う)んですけど、なんか日付が前者のほうが新しいんですよねえ…)
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($c, CURLOPT_CAINFO, __DIR__.'cacert.pem');
面倒ですが世界平和の為にがんばりましょう。
困ったその5、PHP 7.0.0のopcacheがなんか文句言う
普通にphp7.0.0RC4のビルドは通るんですが、実行するときにdyldが文句言う。
dyld: lazy symbol binding failed: Symbol not found: _accel_move_code_to_huge_pages Referenced from: /path/to/7.0.0RC4/lib/php/extensions/no-debug-non-zts-20141001/opcache.so Expected in: flat namespace dyld: Symbol not found: _accel_move_code_to_huge_pages Referenced from: /path/to/7.0.0RC4/lib/php/extensions/no-debug-non-zts-20141001/opcache.so Expected in: flat namespace Trace/BPT trap: 5
めんどいし、手元のは開発環境なんで、opcacheをはずしちゃいました。(解決してない)
;zend_extension=/path/to/7.0.0RC4/lib/php/extensions/no-debug-non-zts-20141001/opcache.so
20151016追記
hnwさんのブログにて、どうやらOSXとの組み合わせで出るバグの模様、なるほど!
まとめ
まだまだ遭遇しそうですが、とりあえず今の所こんなかんじです。
いやー「まあ、そのまま同じPHP5.6だったらうごくじゃろ」って気軽にかんがえてたんですけど、結構ライブラリのバージョンが進んでてMavericksからの移行だと違いがありますね。
opensslとcurlはセキュアにする流れの仕様変更で、まあすでにLinuxで結構踏んでたんですけど、そうかーOSXにもきたかー、という感じですね。
ということで、いまのところEl capitanで潰れた時間はせいぜい数時間です。大部分はビルド時間な気がします(特に、brew upgradeの)。
App storeのiPhotoがバグって永遠にアップデートできない病気にかかっている事以外は文句ありません。*5
こちらからは以上です。