Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 每秒请求JSON 1000次。它贵吗?_Php_Javascript_Jquery_Json - Fatal编程技术网

Php 每秒请求JSON 1000次。它贵吗?

Php 每秒请求JSON 1000次。它贵吗?,php,javascript,jquery,json,Php,Javascript,Jquery,Json,伪码: function getjson() { $.getJSON('link_in_my_server_unique_for_each_user_json', function(data) { if (data.variable) { do_something(); } });​ } setInterval(getjson(), every_second) 让1000名用户每秒在我的服务器中检索json文件并检查该文件是否有变量,这是否很

伪码:

function getjson() {
   $.getJSON('link_in_my_server_unique_for_each_user_json', function(data) {
     if (data.variable) {
        do_something();
     }
   });​ 
}

setInterval(getjson(), every_second)

让1000名用户每秒在我的服务器中检索json文件并检查该文件是否有变量,这是否很昂贵

很可能是的,这会杀死你的普通共享主机或小型VP


完全有可能在短~1秒的缓存过期时间内将大部分内容卸载到CloudFlare或AWS CloudFront之类的系统。大多数用户会直接从缓存中得到它,保存服务器的大部分工作。

< P>如果你不能缓存,也许考虑到彗星模式,所以你会有1000个长而非1000秒的呼叫,总体上服务较少的流量,但提供期望的结果。请参见

只要JSON文件是一个静态请求,Web服务器就直接按原样服务该文件,而无需将请求传递给某些php/ruby/java/etc。在这个过程中,您可以通过简单地对其进行基准测试来确定服务器是否可以接受该请求

对我来说,这看起来像是一个预缓存,需要请求的信息由服务器提前准备好,并以结构化响应的形式缓存。尝试对这些类型的请求使用nginx。它还有用于预gzip ur文件的可选模块。如果您更改原始文件,它将自动续订gzip缓存。这将给你额外的CPU和明显更多的带宽

由于您没有指定文件大小、可用带宽、CPU类型、内存等,因此没有人可以回答是/否,因为它是否昂贵?。在一个有足够带宽的健壮服务器上,相对于文件大小,它可能无关紧要,或者它可能会杀死共享主机或弱vps设置


更新:如果您使用长时间保持活动的持久HTTP TCP连接正确设置过期标头,您可以从HTTP响应代码304 Not Modified(未修改)中获益。服务器将只提供此状态和某些标头,而不会重新提供整个文件。不会涉及脚本,除非文件发生更改,否则不会涉及文件服务,不会发生TCP重新连接,不会发生磁盘读取。至少操作系统会缓存文件统计信息-nginx可能是静态文件检查/读取/服务原始性能的最佳选择。

因此,我们讨论的是每秒至少1k个请求。即使对于功能强大的机器,这也已经被认为是相当高的负载。那么,每个请求都必须做些什么呢

连接初始化 处理请求 执行服务器端逻辑 在这种情况下,您几乎要消耗所有可用资源,包括文件i/o。此外,您正在消耗大部分web服务器资源,以获得一些附加值,而这些附加值可能不是您最常用的功能

什么是更好的方法

您希望对更改做出反应,而不是轮询更改。因此,对于每个用户,我们都有一个包含其事件的通道,当事件发生时,我们希望服务器通知我们。不幸的是,正如在另一个答案中提到的,这不是PHPs最强的诉讼

对于客户端,您可以查看并将其与或配对。您可以免费获得所需的所有架构,而且设置起来并不困难。SockJS还附带了一组很好的协议测试,因此拥有自己的服务器端实现非常容易

通过这些更改,每个用户只能向SockJS提供程序发出一个请求,如果需要,您可以独立扩展它。主服务也不会被JSON调用中断。因此,我们以

向SockJS提供程序加载每页一个请求 每次更改,PHP向SockJS提供程序发出一个请求 它确实使身份验证变得有点棘手,但您可以拥有一个PHP应用程序和SockJS提供程序都知道的私钥,并使用它对一些cookie进行签名。然后,您可以将cookie与JSON请求一起传递。

您是否考虑过


这和堆栈溢出使用的主要方法是一样的。当变量实际更改时,可以将数据推送到用户。但是您的服务器需要正确设置才能执行此操作。

您不检查文件是否有变量,而是告诉您的前端已经创建了变量,怎么样?观察者模式在工作

有几个库可以执行PHPWebSocket类型的工作。它们通常涉及一些长轮询类型的策略


签出:

除非变量是唯一的且与特定用户相关,否则我建议以下解决方案之一:

使用云服务缓存它 使用Web套接字连接将其推送给用户 使用javascript将工作卸载到客户端 使用长轮询而不是间隔轮询
对数据进行轮询的时代已经过去,通常会有更好、更具成本效益的解决方案。

首先,你不需要猜测。你可以测量

使用适用于Firefox的Firebug浏览器、适用于Chrome的开发者工具等,观察请求并查看每个请求需要多长时间。 观察服务器上的负载。如果不是 0%,您永远不会看到1000个会话同时运行。 重复上述步骤,但打开一堆浏览器。打开并运行20个浏览器窗口应该很容易。 请记住,随着服务器负载超过50%,您的性能将变得越来越非线性。一旦你的系统阻塞了很多,你就不能指望有收益地添加更多的客户端了。 一旦你有了一个基线测量,你可以考虑优化——你需要它吗?你手上有多大的问题?一些常见的解决方案:

如果可能,从APC缓存中提供一个静态文件或一段数据。 如果您的数据是可缓存的,但您有多个Web服务器,请考虑一个解决方案,如MimCask、MunGDB或其他集中式非常快的基于密钥的检索系统。 如果从数据库动态检索数据,请考虑使用持久性数据库连接。 如果每个请求的CPU负载很高,那么代码路径中可能会有一些昂贵的东西。尝试优化该特定请求的代码路径,即使您必须为它手工制作一个特殊的控制器并绕过您的常规框架。 如果每个请求的网络延迟很高,请使用HTTP头尝试说服客户端和服务器保持连接打开。
最后,如果你想要的性能似乎是遥不可及的,你需要考虑架构改变。使用WebSocket可能是一种非常不同的代码路径,但可以想象会产生更好的性能。我需要更多地了解您如何使用“我的服务器”中的“每个用户的唯一链接”\u json。

这看起来您解决了错误的问题

我想问一下,为什么你觉得有必要让每一个浏览器在每一秒钟浏览你的网站。也许一些背景知识会有所帮助



现在,如果你真的需要这种能力,那么是的,你可以做到。然而,这一切都与成本有关。您需要通过对话来测试它,以确定负载平衡配置中需要多少web服务器。然后回到提出需求的人那里,让他们知道与该功能相关的成本。

你必须问自己一些问题:这是本地网络查询吗?这个json是由脚本生成的吗?如果是,这个脚本是否很轻?它使用数据库吗?查询是否容易缓存?您需要;也许有其他更好的办法来解决你的问题。可能会问一个关于另一个问题而不是这个问题的问题?它是一个静态文件还是一个通过服务器端脚本生成的资源,可能是在数据库查询之后生成的?在第二种情况下,您应该认真考虑某种服务器端cachingIf,它是一个变量,那么服务器上只有var的文本文件呢?这样一来,处理过程非常少,而且很容易覆盖……@creejayoz:如果可能的话,你能给我举个例子吗?谢谢。另外,要多少钱?CloudFlare是免费的。CloudFront为每个请求和每GB带宽付费。举一个简单的例子,如果您有时间,我将如何在PHP中使用它?只要伪代码就足够了。谢谢。@hakre没有必要将其更改为我的答案中的内容,谢谢,您关于跟踪的行是不正确的-完全可以使用CloudFront提供的日志通过CDN进行跟踪。@hey,所以不要在COMET部分使用PHP。@ceejayoz:您对使用PHP替代PHP有什么建议?任何支持长轮询的东西都可以。若你们知道这个节点,那个就试试吧。文件的大小最多只有几KB。简单的VPS托管。这就是我所说的:。它将为您节省大量带宽,而无需使用额外的CPU电源。你不能从你的VPS中挤出更多,也许,只是也许,如果你也使用ramdisk来存储这些缓存文件的话。您可以在Windows和Linux上轻松创建ramdisk。此外,你真的必须自己对这个设置进行基准测试。@Tiberiu IonuțStan:请检查链接。简言之,每24小时:数据量(单位:某物)*3600*24*days(单位:月)主机(单位:某物)流量(单位:流量)我感觉他在提供静态内容,就像在某个进程准备的JSON文件中一样,然后是静态的。如果它是静态的,你为什么要投票呢?没有意义。如果[非web]进程每隔几分钟更新一次,则如果每秒请求100000次,则该文件将被视为静态文件。