与使用WebSockets / Node.js设置另一台服务器相比,使用只是 Apache / PHP的持久连接有什么替代方法吗?
目前,我正在使用Laravel应用程序运行典型的WAMP服务器。此laravel应用程序是一种仪表板应用程序,可以显示我们的网络服务器的详细信息(如CPU /网络使用情况)。这个应用程序一次只能由几个人使用(它是内部的),所以它让我在性能上非常灵活。
我在PHP中使用COM库通过WMI查询服务器以获取信息。我通过使用典型的GET路由进行设置,该路由以WMI的百分比形式返回CPU使用率的json字符串。这将使用setInterval()
每秒刷新一次。
虽然显然这对服务器来说是巨大的负担,但是当看到网络PC的使用时,CPU就会出现问题。
下面的图片展示了我的应用的样子。进度条将填充ajax请求完成时返回的百分比。它看起来很好并且运行良好,但我觉得每一秒运行ajax请求都是糟糕的设计,并且真的想要一些可以不断提供进度条而不是从服务器请求新值的东西。
如果您需要我目前进展的任何代码/示例,请与我们联系。谢谢!
所要求的代码:
我的路线:
Route::get('{machine_id}/{field?}', array('as'=>'admin.computer.view.detailed', 'uses'=>'ComputerController@getViewDetailed'));
我的控制器:
public function getViewDetailed($computer_id, $field = NULL){
$computer = $this->machine->find($computer_id);
if($computer){
if(!$computer->type->type_name == 'Servers'){
return Redirect::route('admin.computer.index');
} else{
if($field){
switch($field){
case 'cpu':
return Response::json(Network::get_cpu_info($computer->machine_name));
break;
case 'temp':
return Response::json(Network::get_temp_info($computer->machine_name));
break;
case 'tcp':
return Response::json(Network::get_tcp_info($computer->machine_name));
break;
}
}
$disks = Network::get_disk_info($computer->machine_name);
$memory = Network::get_memory_info($computer->machine_name);
$cpu = Network::get_cpu_info($computer->machine_name);
$tcp = Network::get_tcp_info($computer->machine_name);
$this->layout->title = 'Viewing Server Details for: '.$computer->machine_name;
$this->layout->content = View::make('computers.templates.view.detailed')
->with('computer', $computer)
->with('disks', $disks)
->with('memory', $memory)
->with('cpu', $cpu)
->with('tcp', $tcp);
}
} else{
return Redirect::route('admin.computer.index')
->with('message', Lang::get('custom.messages.computers.errors.exist'))
->with('color','danger');
}
}
我的班级要求WMI信息:
class Cpu {
public static $com_namespace = 'root\\cimv2';
private $query = 'SELECT Name, CurrentClockSpeed, LoadPercentage From Win32_Processor';
private $cpu = array();
public function info($service, $pc){
$this->cpu = $service->ExecQuery($this->query);
return $this->format($this->cpu);
}
public function format($cpu){
$formatted_cpu = array();
$i = 0;
foreach($cpu as $entry){
$formatted_cpu[$i]['name'] = $entry->Name;
$formatted_cpu[$i]['current_clock_speed'] = $entry->CurrentClockSpeed;
$formatted_cpu[$i]['load'] = $entry->LoadPercentage;
$i++;
}
return $formatted_cpu;
}
}
我的观点:
@if($cpu)
<script type='text/javascript'>
$(document).ready(function(e) {
function getCpu(){
$('.server').each(function(index, element) {
var server = $(this);
var url = $(this).attr('data-url');
var panel = $(this).find('.panel');
var progress_bar = $(this).find('.progress-bar');
$.ajax({
url: url,
type: 'GET',
dataType:"json",
success: function(response){
if(response){
$(progress_bar).html(response[0]['load']+"%").attr('aria-valuenow', response[0]['load']).css('width', response[0]['load']+"%");
if(response[0]['load'] > 50){
$(panel).removeClass('panel-default').addClass('panel-danger');
} else{
$(panel).removeClass('panel-danger').addClass('panel-default');
}
} else{
$(server).css('display', 'none');
}
}
});
});
}
setInterval(getCpu, 1000);
});
</script>
<div data-url="{{ route('admin.computer.view.detailed', array($computer->id, 'cpu')) }}" class="server">
<div class="panel panel-default">
<div class="panel-heading text-center">CPU Load</div>
<div class="panel-body">
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
</div>
</div>
</div>
</div>
</div>
@endif