今天使用Thinkphp5做非同步任務傳遞where引數時遇到一個問題:
有一段如下程式碼:
$where['jst.supplier'] = ['exp', Db::raw('>0 or jst.is_supplier=1')];
在使用swoole做非同步任務時需要把where引數傳遞給非同步任務處理,因為無法傳遞陣列和物件只能傳遞字串,所以需要把where陣列轉換成字串;
以前一直是使用json_encode函式轉換json字串,結果在今天使用發現報錯:
進一步追查發現,swoole_client傳遞的引數就有問題
原始引數是這樣的:
結果使用json_encode生成之後是這樣的:
網上找了很多辦法都不太好,
最後嘗試使用 serialize 函式對陣列進行序列化,然後swoole服務端使用 unserialize 轉換回陣列,結果發現Db物件完全保留未發生丟失。
serialize方法雖然不json格式可讀性高、佔用字元少;但還是有可取之處。