swoole,swoole_timer_tick() must be callable, array given 報錯異常
- 2020 年 3 月 6 日
- 筆記
報錯提示
Fatal error: Uncaught TypeError: Argument 2 passed to SwooleTimer::swoole_timer_tick() must be callable, array given
觸發場景
在easyswoole舊版的Component組件中的Pool抽象方法(用於實現通用連接池),有一行程式碼是
if ($conf->getIntervalCheckTime() > 0) { swoole_timer_tick($conf->getIntervalCheckTime(), [$this, 'intervalCheck']); }
定時觸發這個檢查方法,來完成最小連接池保持、掉線檢測
等操作。
於是就在這裡產生了這個異常
解決問題
搜索了php官方對於callable的定義, 是允許數組這種形式傳遞的 https://www.php.net/manual/zh/language.types.callable.php
諮詢swoole開發組的成員twosee,也回饋這個類型判斷是調用zendapi完成的,理論不應該出問題
給出的解決方案是使用php推薦新增的Closure
if ($conf->getIntervalCheckTime() > 0) { swoole_timer_tick($conf->getIntervalCheckTime(), Closure::fromCallable([$this, 'intervalCheck'])); }
easyswoole框架內部交流後也說明這個問題是由於swoole版本變動,很早以前就在新版做了兼容(將intervalCheck改為public方法)