where(['send_result' => "0"])->limit(20)->groupBy('transfer_number')->orderBy('id')->asArray()->all(); if (empty($model)) { echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL; return 0; } foreach ($model as $val) { $isExist = CoinCrossChain::find() ->where(['transfer_number' => $val['transfer_number']]) ->andWhere(['<', 'id', (int)$val['id']]) ->orderBy('id desc') ->asArray() ->one(); //上一步发送成功,未查询 if ('success' != $isExist['query_result'] && !empty($isExist)) { continue; } //go(function () use ($val) { // \Co::sleep(0.5); $transfer_url = $val['transfer_url']; $transfer_url = explode(':', $transfer_url); $node_params = [ 'scheme' => $transfer_url[0], 'host' => str_replace('//', '', $transfer_url[1]), 'port' => isset($transfer_url[2]) ? $transfer_url[2] : '' ]; $service = new Chain33Service($node_params); $sign_str = $val['txhex']; $result = $service->sendTransaction($sign_str); if (0 != $result['code']) { $msg = $result['msg']; goto doEnd; } $send_result = $result['result']; doEnd : $currentModel = CoinCrossChain::findOne($val['id']); if (isset($msg)) { $currentModel->msg = $msg; } if (isset($send_result)) { $currentModel->send_result = $send_result; } $currentModel->save(); //}); } echo date('Y-m-d H:i:s') . '跨链交易成功' . PHP_EOL; return 0; } public function actionQueryTransaction() { $model = CoinCrossChain::find()->where(['<>', 'send_result', '0'])->andWhere(['msg' => '0'])->limit(20)->asArray()->all(); if (empty($model)) { echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL; return 0; } foreach ($model as $val) { $node_params = $val['transfer_url']; $node_params = explode(':', $node_params); $node_params = [ 'scheme' => $node_params[0], 'host' => str_replace('//', '', $node_params[1]), 'port' => isset($node_params[2]) ? $node_params[2] : '' ]; $service = new Chain33Service($node_params); $send_result = $val['send_result']; $result = $service->QueryTransaction($send_result); if (-1 == $result['code']) { if('tx not exist' == $result['msg']) continue; $msg = $result['msg']; $query_result = $result['code']; goto doEnd; // echo date('Y-m-d H:i:s') . 'ID:' . $val['id'] . '查询错误' . PHP_EOL; // continue; } if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) { $query_result = 'success'; $msg = 'success'; } else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) { $query_result = 'success'; $msg = 'success'; } else { $query_result = 'fail'; foreach ($result['result']['receipt']['logs'] as $log) { if (is_array($log['log'])) continue; $msg = isset($log['log']) ? $log['log'] : '查询错误'; } } doEnd : $currentModel = CoinCrossChain::findOne($val['id']); $currentModel->query_result = $query_result; $currentModel->msg = $msg; $currentModel->save(); $count = CoinCrossChain::find()->where(['transfer_number' => $val['transfer_number']])->andWhere(['query_result' => 'success'])->count(); if (3 == $count) { $redis = Yii::$app->redis; $key = $val['address'] . '_' . $val['is_with_draw']; if ($redis->exists($key)) { $redis->del($key); } } } echo date('Y-m-d H:i:s') . '查询完毕' . PHP_EOL; return 0; } }