

Show HN: Virtual File System in PHP - adlawson
https://github.com/adlawson/vfs.php

======
adlawson
I know PHP isn't the "coolest" of languages around, but I thought I'd just
show my project I started a few years ago and never really got around to
finishing.

It's been used before as part of a mustache template runtime evaluator and in
test suites.

Current issues:

\- Test coverage is okay but could definitely be improved (currently ~60%)

\- Symlinks

\- Proper support for perms/ACL

If anyone's got any feedback or wants to contribute, go ahead.

~~~
Gigablah
Hm, I wonder if I can marry this with Flysystem
([https://github.com/thephpleague/flysystem](https://github.com/thephpleague/flysystem))
so I can use PHP builtin functions rather than being tied to their API.

Maybe I'll give it shot!

~~~
jlogsdon
You _can_ use PHP built-in functions. Check out the readme. The API is shown
alongside using functions like file_put_contents and require.

~~~
Gigablah
I know, I'm referring to using those built-in functions in place of
Flysystem's API. Basically a proxy.

------
noonespecial
I don't much care for PHP, always using perl in the old days when given the
choice, but I sure do wish the PHP I've had to work with over the years looked
like this.

I don't even care how it works yet, just looking at how well its laid out
makes me feel like I can figure it out without much trouble. The comments and
variable names alone start to draw me into the "story" as soon as I pop open a
file.

We don't say it enough to each other. Well done.

~~~
adlawson
Thanks very much :)

------
nubs
How does this compare to vfsStream[1]? I've used that in the past for mocking
in unit tests. Does this offer anything more than vfsStream?

[1]:
[https://github.com/mikey179/vfsStream](https://github.com/mikey179/vfsStream)

~~~
adlawson
On the surface of it, there is no real difference. You can use them both with
your usual `fopen` and `file_get_contents` builtins.

I believe that the implementation is truer to the behaviour of how these
builtin functions behave with a unix FS. Amongst some other subtleties, here's
some examples:

\- vfsStream simply ignores handle modifiers (except for +)[1]

\- some effort has gone into showing where errors were triggered in userland
code[2]

\- node types are represented as `fstat` would see them[3] rather than using
simple types[4]

vfsStream works perfectly fine, but if you want to use it more with testing
file system operations; the closer you are to a true environment the better.
Obviously this project isn't quite there yet, but it should be once a few
issues have been ironed out.

[1]:
[https://github.com/mikey179/vfsStream/blob/master/src/main/p...](https://github.com/mikey179/vfsStream/blob/master/src/main/php/org/bovigo/vfs/vfsStreamWrapper.php#L253-L254)

[2]:
[https://github.com/adlawson/vfs.php/blob/master/src/Logger/P...](https://github.com/adlawson/vfs.php/blob/master/src/Logger/PhpErrorLogger.php#L53)

[3]:
[https://github.com/adlawson/vfs.php/blob/master/src/Node/Sta...](https://github.com/adlawson/vfs.php/blob/master/src/Node/StatInterface.php#L17-L29)

[4]:
[https://github.com/mikey179/vfsStream/blob/master/src/main/p...](https://github.com/mikey179/vfsStream/blob/master/src/main/php/org/bovigo/vfs/vfsStreamContent.php#L21-L27)

------
michaelbuckbee
I'm curious if this would be performant enough to use in something like
Heroku. For example a big challenge to running Wordpress on Heroku is that
some plugins write out some files, etc

~~~
adlawson
I don't see why not. It only loads a few objects into memory so the footprint
would be tiny, especially when you compare it to running WP.

If you can configure the paths these plugins write to, then you can use VFS.
Unless the plugin explicitly uses `file://` or they strip the scheme, but I
doubt they would.

------
blueflow
PHP may be an ugly language, but these kind of projects are fascinating even
if i doubt that i would ever need such a thing. And +1 for that gif.

------
thornag
I made one some time ago too

[https://github.com/thornag/php-vfs](https://github.com/thornag/php-vfs)

Similarly, I've been trying to make it behave just like the native functions
under unix environment. Think the basic assumptions are the same.

------
canadev
I am curious, what is the point of using something like this?

~~~
olso
[https://github.com/adlawson/vfs.php#example-use-
cases](https://github.com/adlawson/vfs.php#example-use-cases)

~~~
zapt02
How exactly do you perform runtime php evaluation using this?

~~~
adlawson
You write your php to a file in the vfs, then you `require` it back out.
There's an example of it in the documentation[1] but a simple example could
be:

```

<?php

FileSystem::factory('vfs://');

file_put_contents('vfs://foo.php', '<?php echo "Hello, World!";');

require 'vfs://foo.php'; // Hello, World!

```

[1]:
[https://github.com/adlawson/vfs.php#documentation](https://github.com/adlawson/vfs.php#documentation)

------
mkoryak
What is that gif from?

~~~
adlawson
[https://github.com/adlawson/vfs.php/issues/7](https://github.com/adlawson/vfs.php/issues/7)

------
benatkin
That animated GIF is awesome.

~~~
utmishra
I am tempted to see similar GIFs in other repos, but then it would be so
mainstream.

