我正在开发一个用php,jquery编写的游戏面板,并在服务器上使用BASH脚本(ubuntu)。我可以创建,停止,启动,重启和删除多种类型的游戏服务器。到目前为止一切都很好。
在过去的两天里,我一直在努力解决另一个问题,显示每个托管游戏服务器的控制台。在Ubuntu服务器上,我创建了一个BASH脚本,通过每次用户单击按钮时检索ID来启动和停止屏幕。在screen
上,我使用-L
命令创建了一个screenlog文件。从该日志文件我使用tail
检索数据,然后我使用下面的代码每隔几秒更新一次文件:
function Ajax()
{
var
$http,
$self = arguments.callee;
if (window.XMLHttpRequest) {
$http = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
$http = new ActiveXObject('Msxml2.XMLHTTP');
} catch(e) {
$http = new ActiveXObject('Microsoft.XMLHTTP');
}
}
if ($http) {
$http.onreadystatechange = function()
{
if (/4|^complete$/.test($http.readyState)) {
document.getElementById('ReloadThis').innerHTML = $http.responseText;
setTimeout(function(){$self();}, 1000);
}
};
$http.open('GET', 'loadtxt.php' + '?' + new Date().getTime(), true);
$http.send(null);
}
}
PHP代码:
<?php
include "SSH/Net/SSH2.php";
include "SSH/Net/ANSI.php";
include "dbconn.php";
echo $service = intval($_POST['pid']);
$ssh = new Net_SSH2("137.xxx.xxx.xxx");
@$ansi = new File_ANSI();
if (!$ssh->login('xxxxx', 'xxxxx')) {
exit('Login Failed');
}else{
echo "Connected To Server!";
$ssh->setTimeout(1);
@$ansi->appendString($ssh->read());
}
$filename = "/home/$service/screenlog.0";
$output = $ssh->exec('exec tail -n10 ' . $filename);
echo str_replace(PHP_EOL, ' ', $output);
$ssh->disconnect()
?>
我的问题从这里开始:每次用户点击一个名为“Console”的按钮时,我想使用模态窗口来显示控制台(如上所述)。这是我用于模态窗口的HTML代码:
<div class="dialog" title="Basic dialog">
<p><div id="console">
<script type="text/javascript">
setTimeout(function() {Ajax();}, 1000);
</script>
<div id="ReloadThis">Loading..</div>
</div></p>
</div>
和jquery代码:
$( function() {
$( ".dialog" ).dialog({
autoOpen: false,
show: {
effect: "blind",
duration: 1000
},
hide: {
effect: "explode",
duration: 1000
}
});
$( ".consolebtn" ).on( "click", function() {
var pid = $(this).data('pid');
$.post( "loadtxt.php", { pid: pid });
$( ".dialog" ).dialog( "open" );
});
} );
我正在使用这段代码来显示所创建的每个游戏服务器。
<?php
if($query->rowCount()):
foreach($rows as $row){ ?>
<tr>
<td><?php echo $row['serviceID']; ?></td>
<td><?php echo $row['clientID']; ?></td>
<td><?php echo $row['serviceName']; ?></td>
<td><?php echo $row['serviceType']; ?></td>
<td><a data-pid = <?php echo $row['serviceID']; ?> class='startbtn' href= 'javascript:void(0)'><button>Start</button></a>
<a class='stopbtn' data-pid=<?php echo $row['serviceID']; ?> href='javascript:void(0)'><button>Stop</button></a>
<a data-pid = <?php echo $row['serviceID']; ?> class='restartbtn' href= 'javascript:void(0)'><button>Restart</button></a>
<a data-pid = <?php echo $row['serviceID']; ?> class="consolebtn" href= 'javascript:void(0)'><button>Console</button></a> </td>
</tr>
<?php } ?>
<?php endif; ?>
数据库中的每条记录都显示在页面上,有4个按钮:启动,停止,重启和控制台。 serviceID存储在每个按钮中,因此值通过PHP代码传输到服务器上的BASH脚本。但是,当jquery代码使用serviceID发送pid
时,模式会显示一个错误,表示pid
中的echo $service = intval($_POST['pid']);
变量是一个未识别的索引。但变量实际上是发送的?我写了一个查询来测试它并且它有效:
try {
$sql = "DELETE FROM services WHERE serviceID = :service";
$query = $conn->prepare($sql);
$query->bindParam(':service', $service);
$query->execute();
} catch (PDOException $e) {
echo 'Error delete';
exit();
}
现在,当按下控制台按钮时,记录将被删除,并且模式窗口会出现与未识别索引相同的问题。使其工作的唯一方法是将实际ID放在loadtxt.php文件中,但这意味着它将永远不会自动为每个游戏服务器工作:
Modal window with the game console and pid error
我真的不知道如何解决这个问题。谁能给我一些建议?我刚开始使用PHP和Jquery,到目前为止,互联网是我最好的知识来源。
编辑:(因为我不确定我是否可以发布有关相关问题的其他帖子)
控制台显示效果很好。但我也想在模态中使用提交表单来引入命令。 html代码,在模态显示代码中:
<form id="my_form_id">
Command: <input type="text" name="screen_input" id="screen_input">
<input type="submit" />
<form>
这是我用来将用户输入传递到php文件的javascript代码:
$(document).ready(function(){
$('#my_form_id').on('submit', function(e){
e.preventDefault();
var screen_input = $('#screen_input').val();
$.ajax({
type: "POST",
url: 'insert.php',
data: {screen_input: screen_input},
success: function(data){
alert(data);
}
});
});
});
这是接收输入并将其发送到服务器上的游戏控制台的PHP:
<?php
//Extra Libs
include "SSH/Net/SSH2.php";
include "SSH/Net/ANSI.php";
$command = $_POST['screen_input'];
$ssh = new Net_SSH2("137.74.106.13");
@$ansi = new File_ANSI();
if (!$ssh->login('test', 'Irefutabil1,.@')) {
exit('Login Failed');
}else{
echo "Connected To Server!";
$ssh->setTimeout(5);
$ansi->appendString($ssh->read());
}
$command = preg_replace('/\s+/', '\ ', $command);
echo $ssh->exec("screen -S service253 -p 0 -X stuff " . $command . "'^M'");
$ssh->disconnect();
?>
如果我使用实际的serviceID,我可以轻松地向控制台发送输入。但是,我需要它为每个控制台窗口自动获取ID。我如何将serviceID和输入命令都发送到php文件,以便我可以运行BASH命令?
答案 0 :(得分:1)
每隔几秒钟就会运行一次:
$http.open('GET', 'loadtxt.php' + '?' + new Date().getTime
对包含此内容的文件发出GET
请求:
echo $service = intval($_POST['pid']);
每次执行此操作$_POST['pid']
未定义并抛出错误。
你应该把它包装成条件:
if (!empty($_POST['pid'])) {
echo $service = intval($_POST['pid']);
}
或者将其更改为echo $service = intval($_REQUEST['pid']);
,以便可以使用GET
或POST
请求设置您的变量,然后在您的javascript中,在任何函数之外,将pid声明为全局变量像这样var pid;
现在pid
全局可用,因此您的所有代码都可用。在您的onclick函数中,这将设置为服务ID的值,因此您可以更改此行以包含它:
$http.open('GET', 'loadtxt.php' + '?' + new Date().getTime(), true);
像这样:
$http.open('GET', 'loadtxt.php' + '?pid='+pid+'&s=' + new Date().getTime(), true);
现在,您的服务ID将通过您的设置和更新请求传递给服务器。