【发布时间】:2017-01-06 22:37:02
【问题描述】:
我有一个自动同步,它向设备发送 CURL 请求,并且我对我拥有的每台设备(如 60 个)都执行此请求。问题是:
- 如果通信成功,一切正常。
- 但如果通信失败,网页将等到超时消失。所以客户端崩溃了 3-4 分钟...我有重要的网格在 3-4 分钟内停止加载数据。
自动同步是 javascript 中的一个函数,它执行 AJAX 请求来调用下面的 php 控制器。我怎样才能防止这种情况?我不知道还能尝试什么... AJAX 是异步的,所以我不明白为什么网页会停止。
控制器:
$list = $panels_repository->getNetwork();
$thread = new PollingThread($list);
$thread->start();
$thread->join();
$result = $thread->result;
$resultLength = sizeof($result);
//...
线程:
class PollingThread extends Thread {
private $panels_list;
private $alarm_status;
public $result;
public function __construct($list) {
$this->panels_list = $list;
}
public function run() {
$panels_list = $this->panels_list;
$alarmsUpdated = array();
$panels = array();
foreach($panels_list as $panel) {
$alarms_list = $panel->getAlarmsList();
//Get updated alarms status
$panel->getDiagnosticStatus($alarms_list);
//Save the results
array_push($alarmsUpdated, $alarms_list);
}
$this->result = $alarmsUpdated;
}
获取诊断状态
$input = "<?xml version='1.0' encoding='ISO-8859-1'?>
<?getParameters message?>
<displayMLRequest xmlns='http://www.peek.se/DisplayML/' version='1.12'
dateTime='2008-01-10T15:09:51+02:00'>
<getParameters/>
</displayMLRequest>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //Set IP to communicate
//Set POST XML Input
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $input);
//Return response as string & TimeOuts
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
//Execute
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
Javascript:
$('#stations_tree').on('changed.jstree', function (e, data) {
//....
var dataObject = {
type: "Selected",
childrenID: childrenID_array,
parentsID: parentsID_array
};
$.ajax({
type: "POST",
url: "controllers/PanelsController/",
data: dataObject,
cache: false,
success: function ()
{
$("#dg_selected_stops").jsGrid("loadData");
$("#dg_selected_pids").jsGrid("loadData");
}
});
}).jstree({
plugins: ["checkbox", "state", "types"],
"types": {
"default": {
"icon" : false
}
},
core: {
data: {
url: "json/stations.json",
dataType: "json",
success: function () {
//Save Panels Network as session variable
var dataObject = {
type: "Network"
};
$.ajax({
type: "POST",
url: "controllers/PanelsController/",
data: dataObject,
cache: false,
success: function() {
//Get EquipmentStatus for each panel
var dataType = {
type: "Save"
};
$.ajax({
type: "POST",
url: "controllers/EquipmentStatusController/",
data: dataType,
cache: false,
success: function () {
//Status Unknown
changeTreeIcons();
loadAlarmsData();
polling();
}
});
}
});
}
}
}
});
函数 polling() - JS 停止直到超时消失
function polling() {
var dataObject = {
type: "Polling",
};
$.ajax({
type: 'POST',
url: "controllers/DatabaseController/",
data: dataObject,
success: function(response) {
//loadAlarmsData();
//changeTreeIcons();
}
});
}
编辑:我已经检查过,如果我在轮询开始后尝试执行 AJAX 请求,网页只会在 php 脚本完成后执行该请求。所以阻塞的 JS 是使用 ajax 请求加载数据的表。我该如何解决这个问题?
【问题讨论】:
-
这些错误的 CURL 请求是否引发了任何错误?
-
@TheOneandOnlyChemistryBlob 不,如果我在 getDiagnosticStatus 中有回显“测试”,则网络打印 6-7 次。如果我在文件测试中只执行一个 curl 请求,则错误日志是: * 在 DNS 缓存中找到主机名 172.18.56.132 * 正在尝试 172.18.56.132 ... * 连接在 10000 毫秒后超时 * 正在关闭连接 0
-
如果问题在于网页停止,则发布 javascript,而不是 php
-
考虑不要在单个页面上发出 60 个请求,而是组合成一个更大的请求/响应。
-
已编辑后,现在使用 javascript。 @cale_b 问题是我使用了一个包含getDiagnosticStatus 方法的接口。所以每个面板都在实现该接口,因为每个面板都有不同的 IP 进行通信。我怎样才能结合所有?想象一下,第一个面板与成功沟通,但第二个没有。我将如何处理单个较大的请求?
标签: javascript php jquery ajax curl