Windows に Chocolatey を使って PHP と Composer をインストールする・HTTPS 通信に失敗する時は認証局設定を行う

PHP のツールを動かしてみたくなったので、Windows に PHP 環境を構築する。Chocolatey をインストールしてあるので、コイツを使ってサクッと構築する。

目次

PHP のインストール

Chocolatey の公式ページを見ると、何やらパラメータを指定して ThreadSafe なバージョンをインストールできたりするみたい。

/ThreadSafe - Install the thread safe version of php that is compatible with Apache.

気になったので調べてみると、PHP を動かす Web サーバに Apache を使う場合はスレッドセーフ版、IIS を使う場合はノン・スレッドセーフ版を使うと良いらしい。スレッドセーフ版はマルチスレッド対応している。

というワケで以下のコマンドでインストールする。

$ choco install -y php --package-parameters='"/ThreadSafe"'

何か色々と一緒に入れる必要があったが、とにかく Yes で進んだ。どうも Visual C++ とかも必要らしいのう。

インストールできたらこんな感じで確認。

$ php -v
PHP 7.3.10 (cli) (built: Sep 24 2019 11:59:22) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies

Composer のインストール

さらに、PHP 向けのパッケージ管理システムである Composer も入れておく。

$ choco install -y composer

コチラは以下のようにバージョン確認。

$ composer --version
Composer version 1.9.0 2019-08-02 20:55:32

php.ini でタイムゾーン設定をする

Chocolatey で PHP をインストールすると、

というディレクトリにブツがインストールされた。

この中にある

というファイルを開くと、PHP のグローバルな設定が色々とイジれる。

この中から date.timezone という単語を検索すると、954行目あたりに次のような行が見つかると思う。

; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = UTC

この date.timezone = UTC 部分を、

date.timezone = "Asia/Tokyo"

と変更すると、PHP で扱うタイムゾーンが UTC から日本時間 (JST) になる。

ある PHP アプリを動かしてみる

今回動かしてみたかったのは、以下のコード。

次のように叩くと構築が完了する。

$ git clone https://github.com/kin29/ticket-hunter.git
$ cd ticket-hunter/
$ composer install

あとは ./example.php を実行すれば、ウェブページをスクレイピングして、そのデータを JSON 形式で出力してくれるというモノだ。

HTPS 通信時にエラーが出る

以下のように実行してみたところ、ネット通信が上手くいかないようだった。

$ php example.php
Error creating resource: [message] fopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
[file] C:\ticket-hunter\vendor\guzzlehttp\guzzle\src\Handler\StreamHandler.php
[line] 323
[message] fopen(): Failed to enable crypto
[file] C:\ticket-hunter\vendor\guzzlehttp\guzzle\src\Handler\StreamHandler.php
[line] 323
[message] fopen(https://eplus.jp/sf/search?keyword=%E9%9B%A8%E3%81%AE%E3%83%91%E3%83%AC%E3%83%BC%E3%83%89): failed to open stream: operation failed
[file] C:\ticket-hunter\vendor\guzzlehttp\guzzle\src\Handler\StreamHandler.php
[line] 323

どうやらコレは、PHP が HTTPS 通信を行う時の認証局情報が不足しているからだそうだ。

GitSDK をインストールしていれば、以下にある ca-bundle.cert が使える。通常の GitBash の場合も、ファイル名で検索すればどこかに ca-bundle.cert があるはず。

このファイルへのパスを php.iniopenssl.cafile プロパティに記載すれば良い。

; 1925行目あたりから

[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should   
; not specify a value for this directive as PHP will attempt to use the    
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context  
; option.
openssl.cafile=C:\git-sdk-64\usr\ssl\certs\ca-bundle.crt

コレで再度 example.php を実行すれば、正常に HTTPS 通信ができた。

日本語が Unicode 文字になっていたり文字化けしたりしていたので、jq で整形してから nkf でエンコードしてみた。

$ php example.php | jq '.' | nkf -w

コレで良い感じ。