====== PHP RFC: Support linking in stream wrappers ======
* Version: 0.9
* Date: 2014-10-25
* Author: Timm Friebe, thekid@php.net
* Contributor: Frank Kleine, https://github.com/mikey179/
* Status: Inactive
* First Published at: https://wiki.php.net/rfc/linking_in_stream_wrappers
===== Introduction =====
This RFC suggests adding support for links in stream wrappers by adding appropriate hooks.
===== Proposal =====
Userland stream wrappers must be able to hook into:
1. Creating links
2. Testing for links' existance
3. Returning file type
4. Resolving links
Currently, #2 and #3 are already supported by [[http://php.net/manual/en/streamwrapper.url-stat.php|streamWrapper::url_stat()]]. With this accomplished, frameworks such as [[http://vfs.bovigo.org/|vfsStream]] can support testability of symlinking correctly.
Use case #1 - **new functionality**:
class wrapper {
/**
* Creates a hard link to the existing target with the specified name link.
*
* @param string $target
* @param string $link
* @return bool Whether the operation succeeded or not.
*/
function url_link($target, $link) {
// ...
}
/**
* Creates a symbolic link to the existing target with the specified name link.
*
* @param string $target
* @param string $link
* @return bool Whether the operation succeeded or not.
*/
function url_symlink($target, $link) {
// ...
}
}
Use cases #2 and #3 - //already possible today//:
class wrapper {
/**
* See http://php.net/manual/en/streamwrapper.url-stat.php
*
* @param string $url
* @param int $flags
* @return array or FALSE on error
*/
function url_stat($url, $flags) {
if ($flags & STREAM_URL_STAT_LINK) {
// Stat the link, not the file it points to
}
// ...
return [
// ...
'mode' => $permissions & 0120000 // S_ISLINK
];
}
}
Use case #4 - **new functionality**:
class wrapper {
/**
* Reads a link and returns the target
*
* @param string $link
* @return string The link target or FALSE if the does not exist
*/
function url_readlink($link) {
// ...
}
}
* When url_readlink() returns a string, it will be used as readlink()'s return value.
* When url_readlink() returns FALSE, readlink() quietly returns FALSE
* For all other return values of url_readlink(), a warning is raised and readlink() returns FALSE
* When url_readlink() is not implemented, a warning is raised an readlink() returns FALSE.
==== Limitations ====
It will not be possible to create links between two different stream wrappers like this:
symlink('foo://some/resource', 'bar://another/resource'); // will yield a PHP_WARNING and return false
===== Backward Incompatible Changes =====
This RFC introduces no BC breaks.
===== Proposed PHP Version(s) =====
The next PHP 5.x version, or PHP 7.
===== RFC Impact =====
==== To SAPIs ====
No impact.
==== To Existing Extensions ====
No impact.
==== To Opcache ====
No impact.
==== New Constants ====
No new constants are introduced.
===== Open Issues =====
TODO: Check whether realpath() can be hooked into easily. Maybe it needs to be omitted...
===== Unaffected PHP Functionality =====
TODO:
===== Future Scope =====
This sections details areas where the feature might be improved in future, but that are not currently proposed in this RFC.
===== Proposed Voting Choices =====
This RFC requires a 50%+1 majority
===== Patches and Tests =====
TODO: Implement and submit GitHub pull request.
https://github.com/thekid/php-src/compare/rfc/linking_in_stream_wrappers
===== References =====
* http://php.net/manual/en/class.streamwrapper.php
* [[https://github.com/mikey179/vfsStream/wiki/Known-Issues|List of known issues in vfsStream]]
* [[https://github.com/mikey179/vfsStream/tree/linking|vfsStream reference userland implementation]]