本文目录导读:

- 如果你用的是主流框架(Laravel、ThinkPHP、Symfony等)
- 如果你是原生PHP项目(无框架)
- 按脚本类型细分建议
- 必须避免的反例(危险操作)
- 如果是命令行工具(Composer包或独立CLI脚本)
- 总结建议
在PHP项目里,脚本的存放位置没有绝对的标准,主要取决于你的项目类型(是框架项目还是原生PHP)、部署方式以及脚本的用途(是Web入口、定时任务还是命令行工具)。
下面分场景给出最合理的建议:
如果你用的是主流框架(Laravel、ThinkPHP、Symfony等)
框架有严格的路由和目录结构,请遵守框架约定:
- Web入口脚本(控制器/路由):放在框架规定的控制器目录。
- Laravel:
app/Http/Controllers/ - ThinkPHP:
app/controller/ - Symfony:
src/Controller/
- Laravel:
- 命令行脚本(CLI/定时任务):不要放进Web根目录,建议放在框架的
app/Console/或app/Command/目录。- 这类脚本通过
php artisan schedule:run或框架的CLI命令执行(如php think),而不是通过浏览器访问。
- 这类脚本通过
如果你是原生PHP项目(无框架)
推荐采用分离架构,将公开访问的入口和内部业务逻辑分开:
你的项目根目录/ ├── public/ # Web服务器根目录 (Apache/Nginx指向这里) │ ├── index.php # 唯一对外入口(前端控制器) │ ├── css/js/images/ │ └── .htaccess ├── app/ # 核心业务逻辑(禁止浏览器直接访问) │ ├── controllers/ # 控制器(处理请求) │ ├── models/ # 数据模型 │ ├── views/ # 视图模板 │ └── helpers/ # 自定义函数 ├── scripts/ # 命令行脚本(CLI) │ ├── cron_jobs.php # 定时任务 │ ├── send_emails.php │ └── clean_cache.php ├── config/ # 数据库配置等 └── vendor/ # Composer依赖
按脚本类型细分建议
| 脚本类型 | 推荐存放位置 | 注意事项 |
|---|---|---|
| 定时任务/队列 | 项目根目录/scripts/ 或 项目根目录/app/Console/ |
设置为 chmod +x,并在crontab中指定全路径 |
| Web页面/接口 | public/ 或框架的 Controller |
必须有严格的输入过滤和权限验证 |
| 数据库迁移脚本 | database/migrations/ (Laravel) 或 db/ |
建议使用版本控制工具管理 |
| 一次性修复脚本 | 项目根目录/tmp_scripts/ 或直接放临时目录 |
执行完后务必删除,防止被恶意访问 |
| 包含敏感配置的脚本 | config/ 或 app/ 目录 |
禁止放在 public 下,否则可能泄露数据库密码 |
必须避免的反例(危险操作)
⚠️ 千万不要把任何脚本直接放到Web根目录(如
htdocs根下),除非它是唯一入口index.php。
- 错误做法:将
db_connection.php直接放在public文件夹中。- 后果:用户可以直接访问
http://yourdomain.com/db_connection.php看到源代码。
- 后果:用户可以直接访问
- 错误做法:把包含业务逻辑的
admin.php放在根目录。- 后果:一旦漏掉权限验证,攻击者可远程执行代码。
如果是命令行工具(Composer包或独立CLI脚本)
建议单独建立 bin/ 目录:
你的项目/ ├── bin/ │ ├── my-script.php # 主脚本,首行写 #!/usr/bin/env php │ └── (其他辅助脚本) ├── composer.json # 配置 "bin": ["bin/my-script.php"]
在 composer.json 中关联后,执行 composer install 时会自动把 bin 下的脚本软链接到 vendor/bin/ 目录,方便全局调用。
总结建议
- 所有对外暴露的脚本 → 只保留
index.php在公共目录,其他都放到app/或src/下。 - 命令行脚本 → 统一放入
scripts/或bin/,并加上#!/usr/bin/env php头。 - 安全底线 → 确保除了
public目录,其他目录的权限设置为755或644,且Apache/Nginx禁止访问.php文件。
如果你能告诉我具体的项目结构(比如是WordPress、ThinkPHP还是自己写的),我可以给你更精确的目录建议。