swoole,swoole_timer_tick() must be callable, array given 報錯異常

報錯提示

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方法)