I just installed PHP and PEAR on my Mac OSX using MacPorts and then installed PHPUnit using PEAR. When I try to run PHPUnit, I get the following error message:
$ phpunit StackTest.php
PHP Warning: require_once(File/Iterator/Autoload.php): failed to open stream: No such file or directory in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
Warning: require_once(File/Iterator/Autoload.php): failed to open stream: No such file or directory in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
PHP Fatal error: require_once(): Failed opening required 'File/Iterator/Autoload.php' (include_path='.:/php/includes:/usr/local/php5/lib/php:/opt/local/lib/php/pear') in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
Fatal error: require_once(): Failed opening required 'File/Iterator/Autoload.php' (include_path='.:/php/includes:/usr/local/php5/lib/php:/opt/local/lib/php/pear') in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
Okay, so the file File/Iterator/Autoload.php
isn't in my include_path
, so I tried
$ ls -l /opt/local/lib/php/File/Iterator/Autoload.php
-rw-r--r-- 1 root admin 2682 May 23 14:38 /opt/local/lib/php/File/Iterator/Autoload.php
$ phpunit --include-path /opt/local/lib/php StackTest.php
PHP Warning: require_once(File/Iterator/Autoload.php): failed to open stream: No such file or directory in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
Warning: require_once(File/Iterator/Autoload.php): failed to open stream: No such file or directory in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
PHP Fatal error: require_once(): Failed opening required 'File/Iterator/Autoload.php' (include_path='.:/php/includes:/usr/local/php5/lib/php:/opt/local/lib/php/pear') in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
Fatal error: require_once(): Failed opening required 'File/Iterator/Autoload.php' (include_path='.:/php/includes:/usr/local/php5/lib/php:/opt/local/lib/php/pear') in /opt/local/lib/php/PHPUnit/Autoload.php on line 45
It's still not working, and the it's not including the new path that it should be. Does anybody know what I can do about this? (I'd rather not modify my php.ini
file if I can help it because it's read-only and I'm fairly new to PHP and don't want to mangle it in ways I don't understand.) Thanks.
Still don't have an answer for why --include-path
on the command line isn't working, so here's what I did:
$ which phpunit
/opt/local/bin/phpunit
$ sudo emacs /opt/local/bin/phpunit
The plan is to modify the php.ini
file, so first I had to figure out which php.ini
was initializing phpunit
. If anyone has a better way to do this, I'm happy to hear it. I added the following line to the phpunit
code right after the <?php
opening tag:
echo php_ini_loaded_file();
Now, when I ran phpunit
, I got the following (here truncated) output:
/opt/local/etc/php5/php.iniPHP Warning: require_once(File/Iterator/Autoload.php): failed to open stream: No such file or directory in /opt/local/lib/php/PHPUnit/Autoload.php on line 45...
Then:
$ sudo emacs /opt/local/etc/php5/php.ini
I searched for the include_path
directive and appended :/opt/local/lib/php
to the end. So now, phpunit
works, although I have no idea if I broke anything else in terms of my setup.
I had a similar problem with a Windows install, but I am not sure that it is the same problem on OSX. I found the that the PEAR install created the wrong path in the batch file used to launch the program.
The standard install causes the installed batch files to have errors. The final script line of the pear.bat batch file needs to have the include_path wrapped in single quotes ("include_path='%VARIABLE%'").
The change I made is:
"%PHP_PEAR_PHP_BIN%" -C -d memory_limit="-1" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" -d variables_order=EGPCS -d open_basedir="" -d output_buffering=1 -d "include_path='%PHP_PEAR_INSTALL_DIR%'" -f "%PHP_PEAR_INSTALL_DIR%\pearcmd.php" -- %1 %2 %3 %4 %5 %6 %7 %8 %9
I am not sure if you have a similar problem to the one above for your install.
Failing that, my batch file for PHPUnit on Windows 7 is
if "%PHPBIN%" == "" set PHPBIN=C:\Program Files (x86)\PHP\php.exe
if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
GOTO RUN
:USE_PEAR_PATH
set PHPBIN=%PHP_PEAR_PHP_BIN%
:RUN
"%PHPBIN%" "C:\Program Files (x86)\PHP\phpunit" %*
A less invasive way (without changing the php.ini permanently) is to include the following line in the script that fails: set_include_path("/opt/local/lib/php/");
The location you are including might be slightly different. If this doesn't work, search for a file called Autoload.php that is in a folder structure like this: File/Iterator/Autoload.php and use the path to File as the path in set_include_path()
.