
本文介绍使用 php 的 scandir() 和 array_rand() 函数,从指定目录中安全、简洁地随机选取一个 php 文件并执行 include,适用于轮播脚本、动态模板或 a/b 测试等场景。
本文介绍使用 php 的 scandir() 和 array_rand() 函数,从指定目录中安全、简洁地随机选取一个 php 文件并执行 include,适用于轮播脚本、动态模板或 a/b 测试等场景。
要在 PHP 中实现“从某个文件夹中随机包含一个 .php 文件”,关键在于:获取目标目录下所有可读的 PHP 文件列表 → 随机选取其一 → 安全包含(include)。以下是一个健壮、易维护的实现方案:
<?php // ✅ 指定目标目录(支持相对路径或绝对路径)
$directory = './templates'; // 示例:存放 1.php, 2.php, 3.php 等的子目录
// ✅ 获取所有文件(排除 . 和 .. 及子目录),仅保留 .php 结尾的可读文件
$files = array_filter(
scandir($directory),
function ($filename) use ($directory) {
$path = $directory . '/' . $filename;
return is_file($path)
&& pathinfo($filename, PATHINFO_EXTENSION) === 'php'
&& is_readable($path);
}
);
// ✅ 检查是否存在至少一个有效文件,避免 array_rand() 报错
if (empty($files)) {
trigger_error("No readable PHP files found in directory: $directory", E_USER_WARNING);
exit;
}
// ✅ 随机选取一个文件名,并拼接完整路径
$randomFile = $directory . '/' . $files[array_rand($files)];
// ✅ 执行包含(注意:include 是语言结构,非函数,不加括号更规范)
include $randomFile;
?>
? 重要注意事项:
-
安全性优先:切勿直接
include $_GET['file']或未经验证地包含用户可控路径;本方案限定在固定目录且仅允许.php文件,大幅降低 LFI(本地文件包含)风险。 - 路径权限:确保 Web 服务器用户(如 www-data)对目标目录及其中 PHP 文件具有读取权限。
-
错误处理:添加了空文件列表检测,防止
array_rand()在空数组上调用导致警告。 -
性能考虑:
scandir()在小规模目录(数百文件内)效率优秀;若需高频调用,可结合 APCu 缓存文件列表。
? 进阶建议:
若需排除特定文件(如 _header.php),可在 array_filter 条件中追加 !str_starts_with($filename, '_');若需按权重随机(如 1.php 出现概率为 50%),则应改用加权随机算法而非 array_rand()。
该方法简洁、标准、无需额外扩展,兼容 PHP 7.4+(匿名函数语法),是生产环境中推荐的轻量级实现方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











