PHP 利用yield from获取目录里的 全部文件

想要获取一个目录下的全部文件,一般都是利用递归函数

例如:

function readFile($path, &$res)
{
    $content = scandir($path);
    foreach ($content as $v) {
        if ($v == '.' || $v == '..') continue;
        if (is_dir($path . '/' . $v)) {
            readFile($path . '/' . $v, $res);
        } else {
            $res[] = $path . '/' . $v;
        }
    }
}

/**
 * 获取route目录下的所有路由文件,返回所有路由组成的数组
 */
$path = __DIR__ . '/../../route';
$result_path = array();
readFileOne($path, $result_path);
$result = [];
foreach ($result_path as $v) {
    $result = array_merge($result, (include($v . '')) ?: []);
}
return $result;

但是如果$path目录下的文件或者文件夹非常多,$content$res两个变量可能会导致内存溢出。

$content变量溢出问题,可以利用opendir、readdir、closedir等函数逐步取出$path目录下的内容

function readFile($path, &$res)
{
    $open = opendir($path);
    while (($v = readdir($open)) !== false) {
        if ('.' == $v || '..' == $v) {
            continue;
        }
        if (is_file($path . '/' . $v)) {
            $res[] = $path . '/' . $v;
            continue;
        }
        readFile($path . '/' . $v, $res);
    }
    closedir($open);
}

$res变量溢出问题,可以利用yield语法生成器

function readFile($path, &$res)
{
    $open = opendir($path);
    while (($v = readdir($open)) !== false) {
        if ('.' == $v || '..' == $v) {
            continue;
        }
        if (is_file($path . '/' . $v)) {
            yield $path . '/' . $v;
            continue;
        }
        readFile($path . '/' . $v,$res);
    }
    closedir($open);
}

运行会发现并不能实现,查找资料后发现递归中需要用到语法yield from(才知道还有这种 O(∩_∩)O)

/**
 * 获取目录里的文件
 * @param string $path
 * @return Generator
 */
function getFile(string $path)
{
    $open = opendir($path);
    while (($v = readdir($open)) !== false) {
        if ('.' == $v || '..' == $v) {
            continue;
        }
        if (is_file($path . '/' . $v)) {
            yield $path . '/' . $v;
            continue;
        }
        yield from getFile($path . '/' . $v);
    }
    closedir($open);
}

该函数返回的是个Generator生成器,一个可遍历的对象

$common = getFile(BASE_PATH . '/common');
var_dump($common);
foreach ($common as $item) {
    var_dump($item);
}
object(Generator)#19 (0) {
}
string(50) "C:\Work\Work\PHP\project/common/constant/constant.php"
string(55) "C:\Work\Work\PHP\project/common/exception/ApiException.php"
string(52) "C:\Work\Work\PHP\project/common/exception/Exception.php"
string(40) "C:\Work\Work\PHP\project/common/helpers.php"
string(52) "C:\Work\Work\PHP\project/common/service/BaseService.php"
string(53) "C:\Work\Work\PHP\project/common/traits/InstanceTrait.php"
string(51) "C:\Work\Work\PHP\project/common/traits/SingleTrait.php"
string(43) "C:\Work\Work\PHP\project/common/util/db/DB.php"
string(44) "C:\Work\Work\PHP\project/common/util/db/SQL.php"
string(44) "C:\Work\Work\PHP\project/common/util/Facade.php"
string(45) "C:\Work\Work\PHP\project/common/util/log/Log.php"
string(48) "C:\Work\Work\PHP\project/common/util/log/Logger.php"
string(48) "C:\Work\Work\PHP\project/common/util/redis/Lock.php"
string(53) "C:\Work\Work\PHP\project/common/util/redis/LuaScript.php"
string(49) "C:\Work\Work\PHP\project/common/util/redis/Redis.php"
string(53) "C:\Work\Work\PHP\project/common/util/request/Request.php"
string(55) "C:\Work\Work\PHP\project/common/util/request/Requester.php"
string(49) "C:\Work\Work\PHP\project/common/util/token/Token.php"
string(50) "C:\Work\Work\PHP\project/common/util/token/Tokens.php"
string(47) "C:\Work\Work\PHP\project/common/util/Validator.php"

参考文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值