0

什么时候选择服务器端或客户端最好?我有一个 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

4 回答 4

0

如果我理解正确,您的服务器仍然需要完成所有工作,因此您不能使用客户端计算机来减少服务器所需的功率,因此您可以选择以下选项:

  1. 让客户端向服务器询问 500 次。这将很容易让您向客户展示流程,让他满意地了解正在发生的事情,或者

  2. 让服务器做任何事情来跳过 500 个额外的往返时间,以及处理 500 个请求所需的额外开销。

如果客户不要早早放弃并不重要,我可能会选择 1,或者如果工作一直完成很重要,我可能会选择 2,因为客户可能会在 300 之后停止请求。

编辑:关于您的评论,我建议在客户端上有一个“开始工作”按钮,告诉服务器开始工作。然后,您的服务器会告诉后台服务(可以在 php 中创建)来完成这项工作。它可以将其进程更新为文件或数据库或其他内容。然后客户端和php服务器可以自由超时并退出而没有问题。然后你可以更新页面,看看工作是否在后台完成,可以从数据库或文件或其他任何东西中收集。然后,您可以最大限度地减少时间和依赖性。

于 2015-04-21T09:40:59.677 回答
0

您没有为您要实现的目标提供任何上下文 - 这里的关键是性能以及是否应将一组值视为单个事务。

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

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

事务进行中的时间长度将决定事务失败的可能性——因此,更快的方法将比 Ajax 方法更可靠数千倍。

正如 Krycke 建议的那样,使用客户端执行某些工作不会节省系统上的资源——网络服务器、PHP 实例和 DBMS 连接会产生额外的开销。虽然这些相对较小,但它们加起来很快。如果您测试这两种方法,您会发现在 PHP 或数据库中使用循环将显着减少工作量,从而提高服务器的容量。

于 2015-04-21T11:13:06.130 回答
0

一旦我有了运行数十分钟的脚本。我的解决方案是通过 AJAX 发出长请求,超时 1 秒,并在另一个 AJAX 线程中检查结果。用户体验比等待太久没有 ajax 的 php 响应要好。

$.ajax({
  ...
  timeout: 1000
})

于 2015-04-21T15:55:19.920 回答
0

所以最后我得到了这个。

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

b) 如果您几乎可以肯定服务器不会在两者之间关闭它并且希望减少客户端的负载,请使用服务器端脚本。

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

于 2015-04-22T17:46:46.773 回答