我在这里的第一篇文章,所以我希望我的要求很明确: - )
我有一个从远程网站读取JSON的php页面。 这个JSON包含一个名称列表,对于每个名称,我需要读取另一个包含这些ppl详细信息的JSON页面。
整个事情运行得很好但是很慢。在第一页中有大约100条记录,总共页面大约需要一分半钟。
我真的不认为有办法让它更快,我可以缓存数据,但第一次运行它仍然很慢。
我在想,如果我能以某种方式将整个过程放在后台,让用户在获取数据时继续做他的事情。
另外,如果我有更多用户做同样的事情(c的不同jsons页面),我想知道是否可以创建一个进程队列。
我的网站在linux服务器上运行,我不能把手放在服务器上,除了上传文件:( 该网站是用php + bootstrap编写的,我有一个mysql数据库。
提前感谢您提供任何可能的帮助:)
答案 0 :(得分:0)
我在想,如果我能以某种方式将整个过程放在后台,让用户在获取数据时继续做他的事情。
在使用网络服务器时无法做到这一点,没有请求就无法发送数据。
或者@nerdylist说你可以使用ajax从服务器获取数据,同时向用户显示内容。
另外,如果我有更多的用户做同样的事情(c的不同jsons页面)我想知道是否以某种方式创建一个进程队列。
你可以做到这一点,但我认为用PHP不可能。然而,对我来说这似乎很难,因为你应该进行一些进程间的沟通。
最好的答案是使用线程+缓存系统,因为这里的瓶颈是用于获取json文件的I / O.线程允许您同时加载它们而不是顺序加载它们。但PHP在线程方面非常糟糕(没有内置支持),但有library这样做,但我不确定如果你无法访问服务器就可以使用它。
也许您可以将使用JSON的代码移植到客户端,方法是将其移植到javascript,这样您就不会因请求而浪费服务器的badwidth ...
Anoter解决方案是将JSON请求委托给另一个进程(用另一种支持线程的语言编写脚本并同时加载JSON)并通过exec或其他一些subprocess-call-magic调用它,然后读取输出那个过程......
答案 1 :(得分:0)
如果您正在获取JSON数据,我会完全从解决方案中删除PHP中间人,并使用来自Javascript的Ajax请求将数据直接导入网页。这些可以异步执行,因此如果花费一点时间就无所谓了。
当然,假设您可以安全地使用Javascript对您正在访问的任何服务进行身份验证(例如,如果您不能/不会向最终用户公开凭据,则可能会出现问题)。
答案 2 :(得分:0)
我不能公开我用来检索json的身份验证密钥,不幸的是......
您可以在此页面查看=> http://www.guyonwow.eu/grm/test.php 获取json并将其打印在屏幕上的速度有多慢。
以上是上述页面的超级简单代码:
<pre>
<?
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
@$json = file_get_contents("https://json.url");
if($json == false) {
die('Error!');
}
$decode = json_decode($json, true);
print_r($decode);
$mtime = explode(' ', microtime());
$totaltime = $mtime[0] + $mtime[1] - $starttime;
printf('<center>Page loaded in %.3f seconds.</center><br />', $totaltime);
?>
</pre>
如果我至少可以启动请求并让用户执行其他操作,并且在完成所有json的提取后,在他的通知框中显示一条消息,该消息也可以修复它。 关键是我不知道我怎么能让ajax在后台处理它。我想我可以尝试这样的东西(见另一篇文章)
$('.button').on('click', function() {
$.ajax({
url: "import.php",
data: { id: $('#json_id').val(), param_2: $('#param_2').val() }
}).done(function() {
alert('Done importing');
});
});
这会成功吗?