通过循环AJAX或服务器端调用繁重的PHP函数

时间:2015-04-21 09:10:42

标签: php mysql ajax client-side-scripting server-side-scripting

哪一个最适合从服务器端或客户端选择? 我有一个PHP函数,如:

function insert(argument)
{
   //do some heavy MySQL work such as sp_call
   // that takes near about 1.5 seconds  

}

我必须调用此函数大约500次。

for(i=1;i<=500;i++)
{
  insert(argument);
}

我有两个选择:

a) call through loop in PHP(server-side)-->server may timed out 
b) call through loop in JavaScript(AJAX)-->takes a long time.

如果有第三个,请建议最好的一个。

4 个答案:

答案 0 :(得分:0)

如果我理解正确,您的服务器仍需要完成所有工作,那么您就无法使用客户端计算机来减少服务器所需的电量,因此您可以选择以下内容:

  1. 让客户端询问服务器500次。这将很容易让您向客户展示流程,让他获得令人满意的知识,或者

  2. 让服务器尽一切努力跳过额外的500次往返时间,以及处理500个请求所需的额外开销。

  3. 如果客户端不提前放弃是重要的话,我可能会选择1,或者如果工作一直完成,那么我可能会选择2,因为客户端可能会在300之后停止请求。 / p>

    编辑:关于你的评论,我会建议在客户端上有一个“开始工作”按钮,告诉服务器启动工作。然后,您的服务器会告诉后台服务(可以在php中创建)来完成工作。它可以将其进程更新为文件或数据库或其他内容。然后客户端和PHP服务器可以自由超时并注销而不会出现问题。然后,您可以更新页面以查看工作是否在后台完成,可以从数据库或文件或其他任何方式收集。然后,最小化时间和依赖性。

答案 1 :(得分:0)

你没有给出你想要实现的目标的任何背景 - 这里的关键重要性是性能以及是否应该将一组值视为单个事务。

循环来自物理存储(不仅仅是DBMS),性能影响越大。对于大多数Web应用程序而言,最大的性能瓶颈是客户端和Web服务器之间的网络延迟 - 即使您距离相对较近......比如50毫秒之后......并且让keeaplives正常工作,那么它将需要至少25秒对500个数据项执行此操作。

为获得最佳性能,您应该使用最少数量的DML语句将数据发送到DBMS - 您已经提到了支持multiple row inserts的MySQL,如果您使用的是MySQLi,您还可以提交multiple DML statements在同一个数据库调用中(虽然后者只是消除了PHP和DBMS之间的聊天,而插入多行的单个DML也减少了DBMS和存储之间的聊天)。根据数据结构和优化,这应该在10毫秒的范围内插入数百行 - 两种方法都比在客户端中运行循环要快得多,即使延迟为0。

正在进行的事务将确定事务失败的可能性的时间长度 - 因此,更快的方法将比Ajax方法的可靠性提高数千倍。

正如Krycke建议的那样,使用客户端完成一些工作不会节省系统资源 - Web服务器,PHP实例和DBMS连接会产生额外的开销。虽然它们相对较小,但它们很快就会增加。如果您测试这两种方法,您会发现在PHP或数据库中使用循环将导致更少的工作量,从而提高服务器的容量。

答案 2 :(得分:0)

我的脚本运行了几十分钟。我的解决方案是通过AJAX执行长请求,超时1秒,并在另一个AJAX线程中检查结果。对于没有ajax的php的响应,等待用户的经验要好得多。

&#13;
&#13;
$.ajax({
  ...
  timeout: 1000
})
&#13;
&#13;
&#13;

答案 3 :(得分:0)

所以最后我得到了这个。

a)如果你想确定它会完成,请使用AJAX。它也是用户友好的,因为他在AJAX调用之间得到了常规的响应。

b)使用服务器端脚本,如果您几乎确定服务器不会在服务器端脚本之间将其关闭并且希望在客户端上减少负载。

现在我正在使用服务器端脚本为用户提供等待消息窗口,用户等待成功提交消息,否则他必须再试一次。 有可能在第一次尝试中成功的概率是90-95%。

相关问题