不能只装 enqueue/enqueue,因其仅为抽象接口层,不含任何传输实现;必须按消息代理类型安装对应 transport 包(如 enqueue/amqp-lib 或 enqueue/redis),否则 new amqpfactory() 等调用会因类未找到而报错。

直接结论:不要装 php-enqueue/enqueue-dev 或 enqueue/enqueue 单独包,必须按 transport 分层安装,否则会缺核心 transport 类、报 Class not found。
为什么不能只 composer require enqueue/enqueue
这个包只是 Enqueue 的抽象层(PSR-14 兼容的接口定义),不含任何实际传输实现。你执行 new AmqpFactory() 或 createContext('amqp://...') 时,底层需要 enqueue/amqp-ext 或 enqueue/amqp-lib 提供 transport 实例——而它们不会被自动拉取。
- 常见错误现象:
Fatal error: Uncaught Error: Class 'Enqueue\AmqpExt\AmqpFactory' not found,即使你写了use Enqueue\AmqpExt\AmqpFactory; - 根本原因:Composer 没装对应 transport 包,autoloader 根本找不到类文件
- 正确做法是:先决定用哪种 broker(RabbitMQ / Redis / SQS),再装对应 transport + client(可选)
该装哪些包?按场景选 transport
不同消息代理对应不同 transport 包,不能混用;enqueue/client 是可选的高级封装,用于命令/事件模式,非必需。
- RabbitMQ(推荐 AMQP 协议):
composer require enqueue/amqp-lib:^0.10(纯 PHP 实现,兼容 PHP 7.4–8.3,无需 amqp.so 扩展) - Redis(轻量级队列):
composer require enqueue/redis:^0.10 - AWS SQS:
composer require enqueue/sqs:^0.10 - 如果你用 Laravel/Symfony,还要加:
composer require enqueue/laravel-queue或enqueue/symfony-client-bundle
注意:enqueue/amqp-ext 是基于 PHP amqp 扩展的,Windows 下难编译、PHP 8.1+ 兼容差,2026 年已不建议使用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
createContext() 的协议字符串怎么写?
协议字符串不是随便拼的,它决定了用哪个 transport factory,也影响后续连接行为。
- RabbitMQ(AMQP):
amqp://guest:guest@localhost:5672/%2F(%2F是 URL 编码后的 vhost '/',漏掉会报ACCESS_REFUSED) - Redis:
redis://127.0.0.1:6379(默认 db=0;如需指定 db,写成redis://127.0.0.1:6379?database=2) - SQS:
aws-sqs://key:secret@us-east-1(但更安全的做法是通过环境变量或 IAM 角色传凭证,不硬编码) - 错误写法:
amqp://localhost(缺用户/密码/vhost)、redis://localhost(部分版本解析失败,必须用127.0.0.1)
autoload.php 加载顺序和 CLI 工作目录陷阱
很多报错不是代码逻辑问题,而是 autoloader 没生效或路径错了。
-
require_once 'vendor/autoload.php'必须出现在脚本最顶部,不能包在if、函数或try/catch里 - CLI 运行时,确保当前工作目录是项目根目录(即含
vendor/的目录);否则autoload.php路径会错 - 错误示例:
php src/consumer.php—— 此时src/consumer.php里写require_once 'vendor/autoload.php'会失败,因为相对路径不对 - 修复方式:改用
require_once __DIR__.'/../vendor/autoload.php';,或统一cd到项目根再运行
跨平台通用接口的“通用”不在于代码写得有多抽象,而在于 transport 层彻底解耦——你换 Redis 或 RabbitMQ,只需改一行协议字符串和 composer install 命令,业务代码几乎不用动。但前提是 transport 包装对、autoload 加对、vhost 和端口这些细节没踩坑。










