Zend ServerでCLI

http://d.hatena.ne.jp/noopable/20090308/1236483530
xdebugのロードが確認できたので、設定を確認してやりなおしてみました。
php.iniでZendExtensionManager.dllのロードを抑止した時の動作ですが、ローカルユーザー(管理権限あり)で通常通り起動すると、なぜかそれでもZend Extension Managerが起動します。

C:\Users\myname>php -v
[Monitor Log 09.03.2009 12:36:09 SYSTEM] Failed to Start Monitor: Zend Monitor i
s disabled in CLI/CGI
PHP 5.2.8 (cli) (built: Feb 4 2009 17:55:55)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Zend Extension Manager v5.1.53, Copyright (c) 2003-2009, by Zend Techno
logies
C:\Users\myname>php -m
[Zend Modules]
Zend Data Cache
Zend Debugger
Zend Extension Manager
Zend Guard Loader
Zend Monitor
Zend Monitor UI extension
Zend Optimizer+
Zend Page Cache
Zend Utils

ところが、ターミナルを管理者権限で実行にすると、

C:\Windows\System32>php -v
PHP 5.2.8 (cli) (built: Feb 4 2009 17:55:55)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans
C:\Windows\System32>php -m
[Zend Modules]
Xdebug

Zend関係はロードされず、Xdebugが有効になる。
ユーザー毎の環境変数の設定かなにかの影響が出ているのかもしれない。これ、普通の挙動なんでしょうか。Windowsphpを扱うケースが少ないのでよくわかりません。
そこで、phpunitについては、管理者権限で実行でやってみました。

phpunit --report D:\tmp AllTests.php

PHPのログには出ないのですが、イベントビューアーでApplicationのログには出ました。

php.exe
5.2.8.8
4989ba8d
ntdll.dll
6.0.6001.18000
4791a7a6
c0000005
0006814c
d48
01c9a0663ad362a7

ntdll.dllですか。よくある奴ですね。Windows Vista SP1だし、これが怪しいです。UAC周りでしょうか。

というわけで、よくわからない点をまとめておきます。

  • なぜ実行権限によって環境が変わるのか
  • 管理者権限で実行したときにntdll.dllのエラーになるのか。

管理者権限でプロンプトを開くと、なぜPHPの環境が変わるのか。現状で確認した内容は下記です。

  • pathコマンドで確認する限り、pathに違いはない。
  • php --iniでiniファイルの場所を確認しても差異はない。
    • iniファイルへの変更はZend Extensionを除けば該当ファイルの内容が反映されている。
  • php --ri xdebugなどで確認すると、権限によって結果が違う。

UAC ON下ではコマンドプロンプト使用時も注意が必要

いろいろ調べていて、下記のサイトに答えがあった。

Windows VistaUAC(User Account Control)を有効にしている場合に、Program Filesフォルダに設定ファイルやデータファイルを保存する場合は注意が必要だ。Program Filesフォルダ内にインストールされたファイルの修正および保存に成功しても、実際にはProgram Filesフォルダ内のファイルは変更されておらず、たとえば C:\Users\UserName\AppData\Local\VirtualStore\Program Files\My Company\ といった不可視フォルダの中に同じ名前のファイルが作られてそこに保存されていることがある。

http://www.kanadea.com/top/columns/pathproperties.htm

これが、phpコマンドラインで使うときに影響したわけだ。Apache経由のときは、daemonアカウントで起動されるため、管理者権限で編集したiniファイルが使われる。Program Files以下のファイルの編集には管理者権限が必要というのは認識しているので、エディターを管理者権限で開いているので変更はApache経由では正しく反映される。ところが、UAC制御で管理者権限を持たずにコマンドプロンプトを使うと、C:\Users\[abstract]\AppData\Local\VirtualStore以下の設定ファイルが使われる。そのため、何らかの理由で管理者権限を持たずに保存したとすると、コマンドプロンプト経由では古い設定のまま起動されることになる。

管理ポリシーとしては、ログやら設定やら、書き換える可能性があるファイルはProgram Filesにはおくなというのが正解のような気がする。Zend Serverをインストールしなおしてみます。

Zend Serverとxdebugの相性は非常に悪い。

xdebugは優秀なツールだと思うんですが、Zend Serverとの相性は良くないということのようです。

phpunit --versionでもphpが落ちる件

xdebugを有効にするためにZend Extension関係をOFFにするとCLIではエラー処理に問題があるようで、上記のntdll.dll関係のエラーが発生してしまう。単純なエラーを含めたPHPコードをphp.exeで実行するだけでもアプリケーションエラーで落ちてしまう。つまり、まったくエラーがないコードの時だけxdebugが使えるという・・・
phpunit --versionによって呼ばれるコードにそれほど重大な問題があるとは思えないのだけれど、おそらくnoticeでもだめなんじゃないだろうか。
つまり、

  • Zend Server付属のZend Extensionとxdebugは併用できない。
  • xdebugを使うためには、Zend Extension ManagerをOFFにする方がよい。
  • Zend Extension ManagerをOFFにした状態では、エラーハンドリングその他に問題がありハングアップすることがある。
  • PHPUnitのコードカバレッジxdebugを使うのが標準
  • Zend Extension下でもxdebugを利用したコードカバレッジ以外ならPHPUnitは動作する。

ということで、Zend ServerでPHPUnitを使うときは、PHPUnitのレポート機能は諦める。