This library does not work when invoking a Phar via a relative path #46
Description
When the phar is invoked manually (e.g. php -d zend_extension=xdebug.so build/phan.phar
), xdebug-handler fails to detect that the file exists.
Adding debugging statements, I see that the Phar path (i.e. $args[0]) gets replaced by '--' (EDIT: Because it fails to detect that the file exists, xdebug-handler attempts to pass the phar (I assume) over stdin, which doesn't work. That causes the phar to hang after the restart, with no output)
Patching getCommand() to use the following check would make it not replace the relative path with --
: if (!file_exists($args[0]) && !file_exists(getcwd() . '/' . $args[0])) {
- Obviously, you'd have to check if something is an absolute path, the above snippet is not what you'd really want to use. Something more like the below would make sense. I'm not sure if that's 100% correct -- You may wish to limit this to Phars only for now via https://secure.php.net/manual/en/phar.running.php (Feel free to use the below helper)
public static function absScriptPath(string $relative_path)
{
// Make sure its actually relative
if (\DIRECTORY_SEPARATOR === \substr($relative_path, 0, 1)) {
return $relative_path;
}
// Check for absolute path in windows, e.g. C:\ (https://en.wikipedia.org/wiki/Drive_letter_assignment)
if (\DIRECTORY_SEPARATOR === "\\" &&
\strlen($relative_path) > 3 &&
\ctype_alpha($relative_path[0]) &&
$relative_path[1] === ':' &&
\strspn($relative_path, '/\\', 2, 1)) {
return $relative_path;
}
return getcwd() . DIRECTORY_SEPARATOR . $relative_path;
}
https://stackoverflow.com/a/18378785 sounds like it describes the generic problem for Phars:
Working with file paths and Phar archives in PHP can be tricky. The PHP code inside of a Phar file will treat relative paths as being relative to the Phar archive, not relative to the current working directory.
My use case is building phars for https://github.com/phan/phan/releases