1 回答
TA贡献1872条经验 获得超3个赞
最终,我处理了 RCON 命令的输出。缺点是它特别静态。我必须围绕诸如使用 SQL 语句选择的列并将结果调整为适当的类型等内容进行构建。
我正在使用https://github.com/gorcon/rcon-cli并围绕它包装了一个查询类:
class RconDatabase
{
const RCON_EXECUTABLE = __DIR__ . '/../bin/rcon';
public function __construct()
{
}
public function query($sql)
{
if (!is_executable(self::RCON_EXECUTABLE)) throw new FilePermissionException('Unable to execute RCON');
$cmd = self::RCON_EXECUTABLE.' -a '.Config::get('rcon.host').':'.Config::get('rcon.port').' -p '.Config::get('rcon.password').' -c "sql '. $sql .'"';
$output = shell_exec($cmd);
if ($output == null) throw new RconConnectionException('No response from RCON server');
if (strpos($output, 'authentication failed') !== false) throw new RconAuthenticationException();
if (strpos($output, 'dial tcp') !== false) throw new RconNetworkException();
$lines = preg_split("/((\r?\n)|(\r\n?))/", $output);
$results = array();
$last_column = 0;
for ($i = 0; $i < count($lines); $i++) {
if (empty($lines[$i])) continue;
$columns = str_getcsv($lines[$i], '|');
for ($x = 0; $x < count($columns); $x++) {
if ($i == 0 && empty($columns[$x])) {
$last_column = $x;
continue;
}
if ($x == 0 && preg_match('/^#[0-9]+\s+(\S+)/', $columns[0], $match))
$columns[$x] = $match[1];
$columns[$x] = trim($columns[$x]);
}
if ($i == 0) continue;
if ($last_column > 0) unset($columns[$last_column]);
array_push($results, $columns);
}
return $results;
}
}
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报