想要获取一个目录下的全部文件,一般都是利用递归函数
例如:
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"