CodeIgniter 3.x 无官方 Pusher 库,$this->load->library('pusher') 会报 Class 'Pusher' not found;手动封装需处理 cURL SSL 验证、Composer 自动加载缺失及配置复用问题,推荐用 Composer 安装并显式引入 autoload.php。

CodeIgniter 本身不支持 Pusher,必须手动集成 SDK 并绕过框架生命周期限制——直接在控制器里 new Pusher() 可能会工作,但无法复用 CI 的配置、日志或数据库连接,且容易因环境差异(如 cURL SSL 验证)静默失败。
为什么不能直接用 $this->load->library('pusher')
CodeIgniter 没有官方 Pusher 库,load->library() 会报 Fatal error: Class 'Pusher' not found;即使你手动写个 Pusher.php 放进 application/libraries/,也面临两个硬伤:
- Pusher SDK 依赖
cURL和 TLS 支持,而很多共享主机禁用CURLOPT_SSL_VERIFYPEER,导致握手失败却无错误提示 - CI 的 autoloader 不自动加载 Composer 包,
require_once 'vendor/autoload.php'必须显式写在每个用到 Pusher 的文件头部,否则new Pusher()仍会失败
如何正确引入 Pusher PHP SDK
推荐用 Composer 管理依赖,避免手动下载 ZIP 或复制源码带来的版本混乱:
- 在项目根目录执行:
composer require pusher/pusher-php-server - 确保
vendor/autoload.php在入口或控制器中被加载(例如在application/controllers/Notify.php开头加:require_once FCPATH . 'vendor/autoload.php';) - 初始化时显式传入配置,不要依赖
.env—— CI 3.x 默认不读取.env,需用getenv()或硬编码调试
示例初始化代码:
$options = [
'cluster' => 'ap3',
'useTLS' => true,
'curl_options' => [
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
],
];
$pusher = new Pusher\Pusher(
'your_app_key',
'your_app_secret',
'your_app_id',
$options
);
广播事件时最容易忽略的三个点
Pusher 不是“发完就完”,它对数据结构、频道类型和触发时机很敏感:
-
trigger()的第一个参数必须是「频道名」,且要与前端pusher.subscribe('my-channel')完全一致;若频道名含空格或特殊字符,会静默丢弃 - 私有频道(
private-前缀)或存在频道(presence-前缀)需要后端提供认证接口(如/pusher/auth),而 CI 默认路由不处理该路径,需手动添加GET pusher/auth路由并返回 JSON 认证响应 - 消息体必须是可 JSON 编码的数组,不能含资源句柄(如
PDOStatement)、CI 对象(如$this->db)或闭包,否则trigger()抛出JSON encoding failed
前端订阅失败的典型现象和检查项
常见表现是:后端 trigger() 返回 true,但前端收不到事件。此时应逐项确认:
- 浏览器控制台是否报
WebSocket connection to 'wss://...' failed?说明 cluster 配置错(比如用了us2却填成us3)或网络策略拦截 wss - Pusher Debug Console(仪表盘 → App → Demo → Debug Console)里有没有新连接记录?没有则前端 JS 根本没连上
- 前端是否在
connection.bind('connected', ...)后才调用subscribe()?未连接就订阅会导致静默忽略 - 频道名是否拼错?比如后端
trigger('my-channel', ...),前端却写了pusher.subscribe('my_channel')(下划线 vs 短横线)
复杂点在于:Pusher 的「成功发送」不等于「客户端收到」,它只保证消息进了 Pusher 服务队列。真正触达取决于前端网络、频道权限、JS 执行时机——这些环节全在 CI 控制范围之外,调试时必须分段验证。


















