不能直接 php your_script.php 运行,因 hyperf 常驻内存且依赖容器初始化;须注册为 command 命令或使用 shell 交互式调试,确保 di、config、db 等组件就绪。

Hyperf 项目里怎么运行一个 PHP 脚本
不能直接 php your_script.php 运行——Hyperf 是基于 Swoole 的常驻内存框架,脚本没加载容器、没初始化上下文,Di、Config、数据库连接这些全不可用,会报 Container is not initialized 或 Call to a member function get() on null。
正确做法是把脚本注册为命令(Command),走 Hyperf 的命令生命周期:
- 在
app/Command下新建类,继承Hyperf\Command\Command - 实现
configure()设置命令名和描述,handle()写主逻辑 - 在
config/autoload/commands.php中注册该命令(或使用注解@Command) - 执行:
php bin/hyperf.php your:command
为什么不能用传统 CLI 方式调用 Hyperf 类
因为 Hyperf 启动时才构建 DI 容器、加载配置、初始化组件(如 Redis、DB、AMQP)。普通脚本启动时这些全为空——比如你写 $container->get(Redis::class),$container 根本没被赋值。
常见错误现象:
Fatal error: Uncaught RuntimeException: Container is not initializedCall to a member function make() on null- 数据库查询返回空结果,但日志里没报错(其实是 PDO 实例根本没创建)
哪怕只用 var_dump(config('app.name')),也得先确保 ConfigProvider 已加载——只有命令模式或 HTTP 请求才能触发完整引导流程。
临时调试:用 php bin/hyperf.php shell 快速执行代码
开发期想快速验证某段逻辑(比如查一条数据、发个消息),不用写完整命令,直接进交互式 Shell:
php bin/hyperf.php shell
进去后就能用完整的 Hyperf 环境:
$container = \Hyperf\Utils\ApplicationContext::getContainer();$db = $container->get(\Hyperf\Database\Connection::class);$db->table('users')->first();
注意:Shell 不支持协程调度器(go、co 会失败),异步任务、Redis pub/sub、HTTP client 等依赖协程的组件无法正常工作。
需要定时执行?别手写 cron + php 脚本
直接用 Hyperf 自带的 hyperf/crontab 组件。它本质也是命令封装,但由框架统一调度,能保证容器、配置、数据库连接全部就绪。
步骤很简单:
- 安装:
composer require hyperf/crontab - 写一个命令类(同上),再加
@Cron注解,比如@Cron("0 * * * *") - 启动
php bin/hyperf.php start后,定时任务自动运行
如果硬要用系统 cron 调用 php bin/hyperf.php your:command,没问题——只要它是合法 Hyperf 命令就行;但千万别绕过 bin/hyperf.php 直接调 PHP 文件。
真正容易被忽略的是:命令里用到的任何服务(比如自定义的 UserExportService),必须已通过 @Inject 或 $container->get() 正确获取,不能 new 实例——否则 DI 容器管理的单例、AOP 切面、连接池等全失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











