phpstan: PHPStan does not work with UNC paths on Windows

Bug report

PHPStan version: 0.12.32

I am running a CentOS 7 instance using Windows Subsystem for Linux (WSL) on my Windows 10 PC. I accesses the CentOS 7 files using a UNC:

\wsl$\CentOS7\my\files\here (which provides access to /my/files/here in the Linux file system)

It seems that UNC paths are unsupported. See next section.

Code snippet that reproduces the problem

I tested by running the following at a command prompt in my C:\Users\me folder:

phpstan analyze \\wsl$\CentOS7\my\files\here\blah.php

Which provided the following error message:

Path C:\Users\me\wsl$\CentOS7\my\files\here\blah.php does not exist

I tested to ensure it does exist with our favorite built-in Windows command:

dir \\wsl$\CentOS7\my\files\here\

Which provided the list of files:

 Volume in drive \\wsl$\CentOS7 has no label.
 Volume Serial Number is 0000-0000

 Directory of \\wsl$\CentOS7\var\www\TDEV\import\shared

07/01/2020  10:26 AM    <DIR>          .
07/01/2020  10:26 AM    <DIR>          ..
07/01/2020  10:51 AM             4,284 blah.php
               1 File(s)         4,284 bytes
               2 Dir(s)  107,505,917,952 bytes free

Expected output

I would have expected that phpstan would have happily analyzed blah.php just as it would have if the file was on a local drive such as C:.

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 38 (11 by maintainers)

Most upvoted comments

This has nothing to do with " or ' or \\\. The problem is that PHPStan doesn’t know that path starting with \\ is an absolute path, and tries to expand it to an absolute path, that’s why it shows the message: Path C:\Users\me\wsl$\CentOS7\my\files\here\blah.php does not exist described in the OP. And there might be other assumptions that wouldn’t work with these paths.

This might be a code bug due to the way PHP handles strings in quotes vs. double-quotes, but I have no idea why it only occurs on mapped drives rather than local drives like C:.

Here’s a test PHP script called tryfile.php:

<?php
  $astuff = file_get_contents("T:\x\test.php");
  $bstuff = file_get_contents("Z:\var\www\TDEV\import\shared\post_process_event.php");
  echo ($astuff);
  echo ("\n");
  echo ($bstuff);
?>

It bombs because of the way the backslashes are handled in double-quoted strings:

C:\Temp\x>php tryfile.php
PHP Warning:  file_get_contents(T:\x    est.php): failed to open stream: No such file or directory in C:\Temp\x\tryfile.php on line 2
PHP Warning:  file_get_contents(Z:
ar\www\TDEV\import\shared\post_process_event.php): failed to open stream: No such file or directory in C:\Temp\x\tryfile.php on line 3

I swapped out the double quotes for single quotes:

<?php
  $astuff = file_get_contents('T:\x\test.php');
  $bstuff = file_get_contents('Z:\var\www\TDEV\import\shared\post_process_event.php');
  echo ($astuff);
  echo ("\n");
  echo ($bstuff);
?>

And it works fine: C:\Temp\x>php tryfile.php

<?php

phpinfo();

?>
<?php
require_once('post_process_init.php');
$recs_processed = $db->event->post_process($startDate);
logPostProcessEnd($import_name, $recs_processed);