小話です。phpenv
でインストールした composer
が curl のエラーを吐いていた。
1 2 [Composer\Downloader\TransportException] curl error 77 while downloading https://repo.packagist.org/p2/phpunit/phpunit.json: Problem with the SSL CA cert (path? access rights?)
解決策 気の短い人は、下記の手順を参照。要するに libcurl-nss-dev
だとコンパイルは通るけど curl 系の関数が TLS での接続でエラーを出してしまう。なので、 libcurl-openssl-dev
をインストールして、PHP をコンパイルし直せばOK
細かいバージョン番号とか、パッケージ名はそれぞれのディストリビューションに合わせてください。
1 2 3 4 $ phpenv uninstall 8.0.3 $ sudo apt remove libcurl3-nss $ sudo apt install libcurl4-openssl-dev $ phpenv install 8.0.3
解決に至るまでのデバッグ composer の verbose 出力 1 $ composer -vvv self-update
verbose
だけど、PHPの stacktorace がいっぱい出ただけなので原因が分からなかった。
curl のサンプルコードを書いてデバッグ CURLOPT_VERBOSE
がポイント。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://getcomposer.org/versions"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); $output = curl_exec($ch); if(curl_errno($ch)) { $error = curl_strerror(curl_errno($ch)); echo 'Curl error: ' . $error; } curl_close($ch);
これを実行すると、下記のような curl の詳細なエラー出力がでるので、問題がすぐわかりました。
1 2 3 4 5 6 7 8 9 10 11 12 $ php test.php * Trying 54.36.53.46:443... * TCP_NODELAY set * Trying 2001:41d0:302:1100::8:104f:443... * TCP_NODELAY set * Immediate connect fail for 2001:41d0:302:1100::8:104f: Network is unreachable * Connected to getcomposer.org (54.36.53.46) port 443 (#0) * Initializing NSS with certpath: none * WARNING: failed to load NSS PEM library libnsspem.so. Using OpenSSL PEM certificates will not work. * CAfile: none CApath: none * loaded libnssckbi.so
WARNING
のところに書いてありますが、 libnsspem.so
を使う場合は、OpenSSL の PEM certificates は動かないよと書いてあります。
nssで動かないなら、configure でコケてくれよという気もする。