如果我提供的信息超出了此问题的要求,请原谅我。 :d
我正在构建一个从远程计算机中提取大型JSON数据集的应用程序。但是,我在一个安全的环境中工作,将应用程序服务器与防火墙等分开。因此,我不得不做一些捏造(使用SSH)来获取我需要的数据。我已经请求打开其他端口,以便我可以绕过SSH但被拒绝。
以下是通过SSH获取数据的物理路径:我的应用服务器 - > 具有卷曲的安全服务器 - > 具有JSON数据的多个唯一应用程序服务器。
遵守安全规则;我在我的应用服务器上编写了下面的CFML代码。 (服务器运行Linux,Lucee 4.5,MySQL和Apache)
<cfset secure_server = "secure_server.my.example.com">
<cftry>
<cfexecute
name="/usr/bin/ssh"
arguments="#secure_server# ./RemoteDirectory/server_list.sh"
timeout="10"
variable="server_list">
</cfexecute>
<cfcatch type="any">
<cfoutput>
#cfcatch.message#<br>#cfcatch.detail#<br>
</cfoutput>
</cfcatch>
</cftry>
上面的代码只是SSH连接到安全服务器并运行一个名为server_list.sh的脚本。脚本的重要部分如下:
curl -s -k -b cookie.jar -c cookie.jar https://unique_application_server/Path/To/Server/list -H "Accept:application/json"
该curl脚本返回一个看起来类似(但有更多数据)的JSON字符串:
{
"os" : "Linux ",
"fqdn" : "server1.my.example.com",
"disk_status" : "OK",
"system_model" : "HP",
"type" : "Server"
},
{
"os" : "Linux ",
"fqdn" : "server2.my.example.com",
"disk_status" : "OK",
"system_model" : "Dell",
"type" : "Server"
},
此时发送的JSON数据量约为3MB。但是,该数据将随着时间的推移呈指数级增长。
一旦我将JSON带回我的应用服务器;我使用CF的deserializeJSON函数然后抓住我需要的字段。在这种情况下,它是FQDN字段。由于来自JSON的数据是一个完整的域,我需要只选择主机名。 &#34; new_label&#34;代码负责这一点。可能有比我正在使用的更好的REGEX或更好的方法,但这可行。
<cfset arrayOfStructs = deserializeJson(server_list)>
<select multiple="multiple" class="searchable" name="searchable[]">
<cfloop array="#arrayOfStructs#" index="PARENT">
<cfset new_label = ReReplace(PARENT.fqdn, "(.[^.]*)$", "")>
<cfset new_label = ReReplace(new_label, "(.[^.]*)$", "")>
<cfset new_label = ReReplace(new_label, "(.[^.]*)$", "")>
<cfoutput><option value="#PARENT.fqdn#">#new_label#</option></cfoutput>
</cfloop>
</select>
上面的代码使用JSON中的服务器主机名填充该字段。 OPTION字段看起来像这样:
<option value="server1.my.example.com">server1</option>
可能(或可能不)帮助的一些注意事项。我正在使用jQuery和multi-select.js将SELECT转换为并排字段。多选从这里开始:http://loudev.com/
其次,路径中的所有服务器都相当强大,并且都通过10GB连接。所以除了之间的防火墙之外,不应该有任何瓶颈。
无论我使用哪种浏览器,上面的代码都有效,但填充主机名字段时速度相当慢。因为JSON数据我每分钟都会提取更新,所以我无法将其长期存储在应用服务器上的数据库中。
知道这一切,我的问题是:我如何加快表单字段,以便用户不必等待页面加载2500+服务器名称?
我可以利用jQuery或MySQL数据库来加快速度而不会遇到过时的数据吗?它可以只是我从FQDN获取主机名的方法吗?我应该废弃这种方法并尝试别的吗?我有没有在Stack上忽略一些有我答案的东西? (我花了很多时间在这里搜索Q / A,但一无所获。也许我看起来不够努力。)
你们所有人需要的其他信息吗?谢谢! :d
更新 -
@Alex。我现在非常考验。代码如下。不错的建议!
<cfset tickBegin = GetTickCount()>
<!--- THE CODE THAT RUNS THE JSON QUERY ABOVE --->
<cfset tickEnd = GetTickCount()>
<cfset testTime = tickEnd - tickBegin>
<cfoutput>Page(#testTime#ms)</cfoutput>
就缓存数据而言,这是我的问题的一部分。如何缓存?使用什么方法?如何在不显示陈旧数据的情况下缓存JSON?这是一个AJAX有用的实例吗?
更新2 -
我能以错误的方式解决这个问题吗?我知道有时您需要向用户显示大量数据。只需添加一个BlockUI和一个进度条,请等待成为一个好的解决方案?我更愿意诚实地找出更好的解决方案,但我肯定会接受建议!想法?