メンテしていく中でハマった問題の中には、curlの挙動によるものがいくつかありました。細かすぎて伝わらないやつです。消えてしまったソースコードもあるけど、なにかの役に立つかもしれないしメモを残しておきます。hirak/prestissimoダウンロードの進捗を取ってプログレスバーを表示するのに使う、CURLOPT_PROGRESSFUNCTIONというオプションがあります。ここで設定した関数に渡される引数がPHP5.5で変わっていて、そのままだとPHP5.4以前ではエラーになっていました。PHP5.4のサポートを捨てるわけにも行かず、仕方ないのでPHP_VERSION_IDでバージョン別の可変長引数を取ることにしました。'callback');prestissimo-0.2ではComposer\Util\RemoteFilesystemの置き換え自体を諦めることにしたので、このソースコードは消滅しています。ちなみに、PHP自体でバージョン判定を行うとき、PHP_VERSIONを使うと`version_compare()`を使う必要が出てきますが、PHP_VERSION_IDを使えば関数を使う必要が無いので最速だと思います。CURLOPT_USERPWDがリセットできないprestissimoでは接続を再利用するために、極力curl_init()をせず、一度作ったcurlリソースを使い回すようにしています。使いまわされた2回目の通信は、同じオプションとは限りません。curl_reset()が導入されるのはPHP5.5からです。composerプラグインではcomposerのターゲットになっているPHP5.3でも動くようにする必要があったため、毎回curl_setoptを全件やり直すことで、curl_reset()相当のことをやろうと思いました。一部のオプションはfalseやnullをセットしても無かったことにできませんでした。PHPのバージョンによっては改善されているのですが、、。この中で問題になったのがCURLOPT_USERPWDです。composerはBASIC認証がかかったリポジトリに対応しているので、場合によってはこれをセットする必要がありました。"$user:$pass");nullを渡してもリセットできないことがあり、このオプションの利用は諦めることにしました。BASIC認証を表現するときはこのオプションで書くのが一番美しいんですが。Authorizationヘッダを手動で作ることで対処しました。base64_encode("$this->username:$this->password");));NSS版のcurlは楕円曲線暗号を使ってくれないlibcurlは暗号化のライブラリを差し替えられるようになっています。何となくopensslと組み合わせるイメージがありましたが、そうとも限らないようです。手元のMacに入っているcurlはこんな感じでした。opensslではなくSecureTransportが使われています。UnixSocketsCentOSでcurlをインストールするとNSSが組み合わさった状態になっていました。libzこのNSSなcurlは、ECC系の暗号化スイートを標準で無効化しているようです。特許問題が気になるのでしょうか?何が問題になったかというと、これも拙作のpackagist.jpが使っているCloudFlareのhttpsと相性が悪いのです。そのままだと対応暗号スイートがなくて接続できない。errorただ、明示的に暗号スイートを使わせるようにすれば、接続できるようです。Manchester,C=GB...これも仕方ないので、暗号スイートを全部列挙することで対処しました。対応していないものを列挙すると動かなくなるので、何か非互換の問題が起きないか心配でしたが、今のところ報告は上がってきていません。$ciphers));マニュアルに書いてないのですが、CURLOPT_SSL_CIPHER_LISTの列挙方式は','区切りの文字列です。":"でも区切れるとか書いてあるマニュアルもありましたが、少なくともNSS版のcurlでは','区切り以外認識しませんでした。あとは私がやらかしたポカばっかりですね。NAKANOSeesaaブログ×この広告は180日以上新しい記事の投稿がないブログに表示されております。