月別アーカイブ: 2017年9月

ci-phpunit-testが動かない理由がphp7ccだった話

Composerで導入できる kenjis/ci-phpunit-test は Codeigniter 3.x で快適にPHPUnitによるテストが書ける便利なツールです。

その ci-phpunit-test にはクラスのメソッド、PHP標準の関数、定数などを書き換える事が出来る、モンキーパッチ機能が有るのですが。なぜか動かなくなり悪戦苦闘していました。

原因はComposerでグローバルにインストールしたphp7ccでした。

sstalle/php7cc はそのPHPアプリケーションが PHP 7.0 で動作するうえで問題が無いかを静的解析するツールなのですが、どちらも nikic/php-parser というPHPで書かれたPHPパーサに依存しており、違うバージョンが入ってしまうことが原因のようです。

nikic/php-parser v1.2.1 の composer.json の記述(抜粋)
nikic/php-parser: ~1.4,

kenjis/ci-phpunit-test v0.15.0 の composer.json の記述(抜粋)
nikic/php-parser: ^2.1|^3.0

とりあえずグローバルに入っている古いバージョンをremoveする事で、問題なく動くようになりました。

なお、php7cc の代わりになりそうな物としては wimg/PHPCompatibility があります。php7cc でカバーしていた範囲をすべてチェック出来るかはまだ分からないのですが、チェックのターゲットとして、PHP 5.6 以前のバージョンであったり、PHP 7.1 にも対応してるようです。

Windows環境のComposerを複数PHPバージョンで使い分ける

Windows環境におけるPHP複数バージョン導入は比較的簡単です。例えばCドライブ配下に複数のPHPをzip展開、php.iniの設定を行うだけでOKです。

c:\php\php56\php.exe
c:\php\php70\php.exe
c:\php\php71\php.exe

実際に使う際はこの中からデフォルトとして使うバージョンに環境変数を通しておきます。

c:\php\php56\php.exe
c:\php\php70\php.exe ←環境変数を通してデフォルトで使われるPHPにしておく。
c:\php\php71\php.exe

例えばPHPのビルトインWebサーバーを使う際、デフォルトで使うバージョン以外を使いたいプロジェクトではフルパスで別パスのphpを起動してやればいいです。

c:\php\php71\php.exe -S localhost:8080

ここで、Composerが問題になってきます。WindowsにインストールしたComposerは環境変数に設定されたデフォルトのPHPで実行されるので、PHP 7.1を使っているプロジェクトでPHP 7.1を求めるライブラリを導入したい場合などに、ComposerのチェックでPHPのバージョンが足りないと言われエラーになってしまいます。また、適切にcomposer.jsonが設定されていなければPHP 5.6のプロジェクトで7.0が必須のライブラリをインストールしてしまうかもしれません。

このComposerコマンドの実行ファイルは実際にはバッチファイルになっています。このファイルはインストール時に設定を変えていなければ

C:\ProgramData\ComposerSetup\bin

にインストールされています。
(コマンドプロンプトであれば where コマンドでコマンドのインストール先が分かります)

中に記載されているのは

@ECHO OFF
php “%~dp0composer.phar” %*

だけですので、このファイルを複製し

@ECHO OFF
c:\php\php71\php.exe “%~dp0composer.phar” %*

のようにしてあげれば、PHP 7.1で起動するComposerコマンドを作る事が出来ます。

PHP 7.1のプロジェクト上でComposerコマンドを利用する際はcomposerコマンドではなく

composer_php71.bat install

のように利用すればOKです。

なお、Composerがプロジェクトごとではなくグローバルにインストールするパッケージについては全てのプロジェクトに影響が及びますので、その点はご注意ください。

ちなみに phpunit コマンドも同様にバッチファイルになっているので、同様に複数PHPバージョンのバージョンを用意しておくことができます。

USBコントローラドライバの更新でUSB DACが死んだ場合の対処

USB DACはホスト側のUSBコントーラのドライバ更新やWindows Update等によって、なぜか認識はされているものの音が鳴らない、一瞬だけ鳴るもののその後鳴らなくなる、といった状態に陥る事が有ります。何かしらの条件が有るのかもしれませんが、特定のメーカーの製品で起きるという訳ではないようです。OS側、もしくは利用しているUSBコントローラチップの問題なのかもしれません。

Amulech AL-9628D:私の環境で再現

TEAC UD-503
https://teac.jp/jp/product/ud-503/faq

2017年6月2日現在、Windows10 Creators Updateに対して全ての更新プログラムを当てた最新の状態にすると、ドライバーのインストールが正常にできないという現象が報告されています。 このため、共有モードで動作するアプリケーションの音声再生が行えなかったり、Windowsのサウンド設定が出来ない等の現象が発生するとの情報がございます。

他にもAmazon.co.jpのレビューでWindows Updateと共に認識しなくなった製品のレビューを見かけたりします。

Soundfort DS-100+ ハイレゾ USB DAC(96kHz/24bit, DSD64対応)ヘッドフォンアンプ搭載
https://www.amazon.co.jp/dp/B0070J4K4G

私の場合任意にUSBコントローラのドライバを更新した際に発生したのですが、「システムの復元」を行う事で復旧する事が出来ました。PCの環境によってはシステムの復元機能が無効化されている場合も有りますが、基本的に様々なトラブルがこれで解決できますので有効にしておくといいでしょう。