pda/pheanstalk必须按PHP版本选v4.0(≥8.1)或v3.2(7.1–8.0),否则安装失败或类找不到;推荐唯一初始化方式Pheanstalk::create(),它内置握手校验,而new Pheanstalk()不校验连接且无自动重连,易致生产隐患。

pda/pheanstalk 必须按 PHP 版本选对版本号,否则安装失败或类找不到;Pheanstalk::create() 是唯一推荐的初始化方式,new Pheanstalk() 在生产环境极易引发连接隐患。
composer require pda/pheanstalk 为什么总报错
常见错误是版本与 PHP 不匹配,不是命令写错了:
-
Could not find package pda/pheanstalk:PHP 版本太低却试图装 v4(v4 要求 ≥ 8.1) -
Class 'Pheanstalk\Pheanstalk' not found:autoloader 没生效,或没require 'vendor/autoload.php'
正确做法是先确认 PHP 版本:php -v,再执行对应命令:
- PHP 8.1+:用
composer require pda/pheanstalk:^4.0 - PHP 7.1–8.0:必须显式指定
composer require pda/pheanstalk:^3.2
装完立刻验证:php -r "require 'vendor/autoload.php'; echo class_exists('Pheanstalk\Pheanstalk') ? 'OK' : 'FAIL';"
Pheanstalk::create() 和 new Pheanstalk() 的区别
两者行为完全不同,不能混用:
立即学习“PHP免费学习笔记(深入)”;
-
Pheanstalk::create('127.0.0.1')是工厂方法,内部会尝试握手并抛出Pheanstalk\Exception\ConnectionException,适合生产环境做健壮初始化 -
new Pheanstalk('127.0.0.1', 11300)是直连构造函数,不校验服务可用性,连接失败要等到第一次put()或reserve()才暴露,排查成本高 -
new Pheanstalk()不支持自动重连,且$persistent参数在 CLI 模式下基本无效
别传端口和超时参数给 create()——它默认端口 11300、超时 3 秒,足够健壮;如需改,才显式传第二、第三个参数。
putInTube() vs put():任务发到哪,由谁决定
这是最容易导致任务路由错乱的地方:
-
put($data)总是往当前useTube()设置的 tube 写入,状态是实例级的,不会自动重置 -
putInTube('my-tube', $data)绕过当前上下文,直接投递到指定 tube,语义更明确、隔离性更强
典型踩坑场景:A 模块调用 $pheanstalk->useTube('email')->put(...),B 模块紧接着调用 $pheanstalk->put(...),结果 B 的任务也进了 email tube。解决办法是统一用 putInTube(),或每次 put() 前确保 useTube() 正确。
Tubename 建议全小写、无空格、无特殊字符(如 user_signup ✅,User Signup! ❌);首次写入会自动创建 tube,但读取前必须先 watch('tube-name')。
消费者循环里 ignore('default') 是刚需
新装的 Beanstalkd 默认监听 default tube,如果你没显式 watch('mytube'),reserve() 就会从 default 取任务——而你根本没往那里塞过东西,结果就是无限阻塞或超时失败。
标准写法必须带 ignore('default'):
$pheanstalk->watch('mytube')->ignore('default');
while (true) {
$job = $pheanstalk->reserve(5); // 建议设超时,避免死等
if (!$job) continue;
try {
// 处理 $job->getData()
$pheanstalk->delete($job);
} catch (\Exception $e) {
$pheanstalk->release($job); // 处理失败要 release,别漏
}
}
注意:default_socket_timeout ini 设置必须调大(如 900),否则 reserve 长时间没 job 会直接 socket timeout 报错——很多脚本漏配这个,上线就崩。



















