【问题标题】:league/flysystem - RecursiveDirectoryIterator::__construct(/proc/tty/driver): failed to open dir: Permission denied联赛/flysystem - RecursiveDirectoryIterator::__construct(/proc/tty/driver):未能打开目录:权限被拒绝
【发布时间】:2018-01-07 01:49:37
【问题描述】:

是否有可能避免此异常(可能通过排除由于缺少权限而无法被 PHP 进程读取的目录?)。我在文档中找不到它。

RecursiveDirectoryIterator::__construct(/proc/tty/driver): 
failed to open dir: Permission denied

我的代码:

$filesystem = new Filesystem(new Local('/proc', LOCK_EX, Local::SKIP_LINKS));
$filesystem->listContents('.', true);

【问题讨论】:

  • 我建议不要尝试在 PHP 中解决这个问题,而是找出权限不正确的原因。此外,Flysystem 的目标是为存储提供文件系统抽象。看来您正在尝试做一些只会在本地进行的事情。我建议不要为此使用 Flysystem,它似乎不是该工作的工具。
  • @FrankdeJonge 我明白了,所以你的库是为网络设计的(我们通常可以控制文件权限),而不是像 /proc 这样的目录。对我来说,这就是我的问题的答案。谢谢!
  • /proc 目录已收紧权限,这与 PHP 在某些情况下处理操作的方式相冲突。每个 linux 发行版都有一个像 wheel 或 admin 或 root 这样的组,它拥有这些目录,您大多只能读取它们。但是,某些读取操作(例如列出内容)需要的不仅仅是读取权限。这对于网络和非网络是一样的,尽管在网络情况下您更有可能拥有正确的权限。所以解决的办法就是弄清楚如何为这些操作获取正确的权限。
  • @FrankdeJonge 非常感谢您的澄清!

标签: php flysystem


【解决方案1】:

请参阅:https://github.com/thephpleague/flysystem/issues/831 本质上是相同的问题。

要解决此问题,您需要扩展类并覆盖方法 getRecursiveDirectoryIterator,因为无法更改 RecursiveIteratorIterator 模式。

将默认模式更改为RecursiveIteratorIterator::CATCH_GET_CHILD,尝试打开时不会失败。

例如:

<?php
class LocalSkipError extends Local {
    protected function getRecursiveDirectoryIterator($path, $mode = RecursiveIteratorIterator::CATCH_GET_CHILD)
    {
        return new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
            $mode
        );
    }
}

$filesystem = new Filesystem(new LocalSkipError('/proc', LOCK_EX, Local::SKIP_LINKS));
$filesystem->listContents('.', true);

但不推荐:

【讨论】:

  • 预计final 会在未来的版本中添加;p
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
相关资源
最近更新 更多