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 を使う場合はノン・スレッドセーフ版を使うと良いらしい。スレッドセーフ版はマルチスレッド対応している。
- 参考 : 【超初心者向け】PHPをインストールする方法(Windows 7) - Qiita
- 参考 : https://www.php.net/manual/ja/faq.obtaining.php#faq.obtaining.threadsafety
というワケで以下のコマンドでインストールする。
$ 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 をインストールすると、
C:\Tools\php73\
というディレクトリにブツがインストールされた。
この中にある
C:\Tools\php73\php.ini
というファイルを開くと、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
があるはず。
C:\git-sdk-64\usr\ssl\certs\ca-bundle.crt
このファイルへのパスを php.ini
の openssl.cafile
プロパティに記載すれば良い。
C:\Tools\php73\php.ini
; 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
コレで良い感じ。