[PHP]composer diagnose 実行時に OpenSSL  のエラーが起きたら PHP のバージョンの問題かも

## Composer とは
PHPのパッケージ管理システムです。
詳しくはこちらの記事がわかりやすいです。
https://qiita.com/atwata/items/d6f1cf95ce96ebe58010

Composer本家サイト
https://getcomposer.org/

## composer diagnose とは
ざっくり説明すると診断用コマンドです。
https://getcomposer.org/doc/03-cli.md#diagnose

## 環境
Windows7 Professional SP1

## 経緯
ちょっと別件で必要になったので手元のパソコンに composer をインストールしました。
その後、`composer diagnose` コマンドを composer のインストール確認として実行してみたところ下記のようなメッセージが出力されました。

```bash:GitBash
$ composer diagnose
Checking composer.json: WARNING
No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.
Checking platform settings: WARNING
The OpenSSL library (0.9.8zb) used by PHP does not support TLSv1.2 or TLSv1.1.
If possible you should upgrade OpenSSL to version 1.0.1 or above.

Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: FAIL
[Composer\Downloader\TransportException] The "https://api.github.com/rate_limit" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
Failed to enable crypto
failed to open stream: operation failed
Checking disk free space: OK
Checking pubkeys:
Tags Public Key Fingerprint: ******* ******** ********
Dev Public Key Fingerprint: ******* ******** ********
OK
Checking composer version: OK
Composer version: 1.7.2
PHP version: 5.3.29
```


### エラー抜粋

> The OpenSSL library (0.9.8zb) used by PHP does not support TLSv1.2 or TLSv1.1.
> If possible you should upgrade OpenSSL to version 1.0.1 or above.

> (省略)

> [Composer\Downloader\TransportException] The "https://api.github.com/rate_limit" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
Failed to enable crypto
failed to open stream: operation failed

## 原因
2018年2月以降、github.com, api.github.com への接続が TLSv1/ TLSv1.1 ではできなくなったらしいです。
https://blog.github.com/2018-02-02-weak-cryptographic-standards-removal-notice/

なので `https://api.github.com/rate_limit` からファイルのダウンロードができんよ！って怒られているものと思われます。



## OpenSSLのバージョンが古いのかな？
と思ったので確認してみます。

```sh
$ openssl version
OpenSSL 1.0.2o  27 Mar 2018
```

OpenSSL のバージョンは足りているようです。`The OpenSSL library (0.9.8zb) used by PHP` ってエラーに書いてあるので PHP が使っている openssl のバイナリが古いって話ですかね、もしかして。

## PHP のバージョン
コマンド打つまでもなく `composer diagnose` 時のメッセージの最後に既にPHPのバージョンが出力されてました。

```sh
PHP version: 5.3.29
```

まさかの 5.3w
特に 5.3 にこだわっているわけではないのでこの際PHPのバージョンを上げてみることにします。

## 古いPHPのアンインストール
まず 5.3.29 の PHP はアンインストールします。
当方の環境ではインストーラで入れていたので、 `コントロール パネル > すべてのコントロール パネル項目 > プログラムと機能` からphp-5.3.29 をアンインストールしてサクッと終わりました。

なお、万が一 5.3.29 の環境を復活させたい場合は
こちらから php-5.3.29-win32-VC9-x86.msi をダウンロードして実行すれば可能です。
https://windows.php.net/downloads/releases/archives/


## 新しいPHPのインストール
世間では既に7系がリリースされていますが、ローカルのPHPは一応まだ5系にしておきたかったのでひとまず5.6を入れてみることします。
こちらから VC11 x64 Thread Safe の zip をダウンロードしました。
https://windows.php.net/download#php-5.6

当方の端末の場合はＣドライブ直下に解凍し、システム環境変数にパスを通しました。
`php -v` コマンドで確認したところ、うまくいってました。

```bash
$ php -v
PHP 5.6.37 (cli) (built: Jul 19 2018 18:17:53)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

## php.ini の準備
phpのインストールはできたので拡張機能の設定を行います。
php.ini-production をコピーして、php.ini にリネームします。

php.ini を編集してまず extension_dir の指定を行います。
パスはphpの場所に合わせて変更してください。

```ini
extension_dir = "C:\php-5.6.37\ext"
```

次に php_openssl.dll のコメントを解除して有効化します。

```ini
extension=php_openssl.dll
```

これから composer を実際に使う上で必要になると思われるので curl もついでにコメント解除して有効化しておきます。

```ini
extension=php_curl.dll
```

### ちなみに

php.ini を設定しないと `composer diagnose` でこんなエラーが出ます。(出ました)

```bash
$ composer diagnose
[Composer\Exception\NoSslException]
  The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at your own risk, by setting
   the 'disable-tls' option to true.
```


## 再度 composer diagnose 実行
```bash
$ composer diagnose
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys:
Tags Public Key Fingerprint: ******* ******** ********
Dev Public Key Fingerprint: ******* ******** ********
OK
Checking composer version: OK
Composer version: 1.7.2
PHP version: 5.6.37
PHP binary path: C:\php-5.6.37\php.exe
```

ようやくうまく動いてくれました。ということはやはりPHPのバージョンの問題だったということですかね。
なんとなく php 5.6.37 のフォルダから `php_openssl.dll` だけ持ってくれば5.3のままでも動きそう？な気はしますがなんとも言えないです。変なバグが出ても困るのでこれでよしとします。

## 残された疑問
あれ、ということは Composer は事実上動作要件が 5.3 では足りないってことなんですかね。
[公式では PHP 5.3.2 以上推奨](https://getcomposer.org/doc/00-intro.md#system-requirements) とされていますが、どうなんでしょう。

もしかしたら Windows に限った話かもしれないのでまだ断定はできないですね。これはまた別の機会にちょっと検証してみたいなと思います。