uzullaがブログ

uzullaがブログです。

El capitan(OSX 10.11)に上げたらローカルのPHP環境移行で困ったことのいくつかメモ

Yosemiteがあまりにも不評だったので、お仕事マシンはMavericksでねばってたんですが、流石に二個以上前のバージョンのOSを使い続けるのも何だし各方面の悲鳴も比較的少ない感じだったので、メインマシンをEl capitanにのせかえました、やったー新しい!

iPhoneの連携が結構ふえててHands offとか面白いんですけど、なぜかAir drop連携だけはうまく動かなくて謎。

さておき、El capitanPHP

El capitanにするとPHPがどう変わるって、systemのPHP*1PHP 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

以下みたいな場合は、xcodecliツールがはいってない気がします。ググりましょう。

/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,curlSSL通信に厳格になった

とあるライブラリでcurlTwitterをたたいてたんですが、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追記

d.hatena.ne.jp

hnwさんのブログにて、どうやらOSXとの組み合わせで出るバグの模様、なるほど!

まとめ

まだまだ遭遇しそうですが、とりあえず今の所こんなかんじです。

いやー「まあ、そのまま同じPHP5.6だったらうごくじゃろ」って気軽にかんがえてたんですけど、結構ライブラリのバージョンが進んでてMavericksからの移行だと違いがありますね。

opensslとcurlはセキュアにする流れの仕様変更で、まあすでにLinuxで結構踏んでたんですけど、そうかーOSXにもきたかー、という感じですね。

ということで、いまのところEl capitanで潰れた時間はせいぜい数時間です。大部分はビルド時間な気がします(特に、brew upgradeの)。

App storeiPhotoがバグって永遠にアップデートできない病気にかかっている事以外は文句ありません。*5

こちらからは以上です。

*1:最初から入ってるPHP

*2:もしかして、Yosemiteではすでにそうだったのかもしれないが、私はMavericksだったので

*3:思い込み

*4:curlをつかったライブラリを書く人は、ちゃんとエラーを確認して、投げるなりerror_logに書くなりしてくれ頼む

*5:写真.appがあるんで、いいんだけど