如何使异步ajax请求真的异步?

时间:2014-03-23 11:57:31

标签: javascript php jquery ajax asynchronous

我在我的网站上添加了新功能。管理员使用一些图片(租用接收)上传存档,这些图片正在发送给用户。我的网站上有50-100个用户。最大用户为700-1000。

我正在发送带有mail()功能的电子邮件。这需要时间。通过mail()发送1条消息大约需要3.5秒。我需要发送至少100条消息。

我有下一个代码结构:

Main script

  1. 输入类型=文件
  2. 的绘图表单
  3. 使用此文件上传档案 表格
  4. 检查存档名称,存档内容。所有文件必须是 某种格式
  5. 向脚本发出ajax请求 send_rent_receipts.php。月份和年份作为参数发送
  6. send_rent_receipts.php(获得月份和年份):

    1. 将文件解压缩到目录.../$year/$month
    2. 目录.../$year/$month中的foreach文件执行:
      • 获取文件名(名称类似于774.pdf,772.pff - 文件名将此文件连接到用户
      • 收到用户的电子邮件
      • 发送带附件的电子邮件(当前文件)
    3. 此方法使用10个文件工作约35秒。 1个文件~3.5秒。

      我的托管服务提供商在max_execution_time 30中设置php.ini,因此此脚本失败(因为它的工作时间超过30秒。

      我尝试了另一种方法:

      main script

      1. 输入类型=文件
      2. 的绘图表单
      3. 使用此表单上传档案
      4. 检查存档名称,存档内容。所有文件必须是特定格式
      5. 解压缩归档到目录.../$year/$month
      6. 目录.../$year/$month中的foreach文件
        • 获取文件名
        • 向脚本send_rent_receipts.php发出ajax请求(文件名,月份,年份正在发送)
      7. send_php_script.php

        1. 获取用户数据/电子邮件
        2. 将文件.../$year/$month/$filename发送给此 邮件
        3. 我认为这种方法是我需要的。服务器不会发出1个ajax请求,而是发出XX ajax请求(取决于文件数量)。每个请求将工作3.5秒。 Ajax请求是异步的(我想。它们必须是)所以所有进程(XX ajax请求)都将工作3.5秒。

          但是......我看到了什么?有3个图像,包含不同数量的文件(1,3,10个文件):

          发送1封电子邮件:
          1 e-mail

          发送3封电子邮件:
          3 e-mails

          发送10封电子邮件:
          10 e-mails

          为什么ajax请求(async: true为默认值)不是异步请求。这个图像显示,发送1封电子邮件的10个ajax请求与发送10封电子邮件的脚本的1个请求相同。

          为什么会这样?我认为他们必须是异步的,所有订阅都需要3.5秒。

          如何减少脚本执行时间?什么方法让它运行得更快

          P.S。:文件不相等,所以我不能向10个收件人发送1封电子邮件。

1 个答案:

答案 0 :(得分:0)

您可以异步发送请求,但等待在第一条消息完成之前发送下一条消息。

当您一次执行多个请求时,您的请求需要更长时间的原因是因为每个请求都访问磁盘,这是一个原子操作,因此一次只有一个请求可以进行磁盘操作,所以如果你正在进行多个访问磁盘的请求,那么现在不处理磁盘操作的请求需要等待那个请求。

并且您不应该使用sync ajax请求,因为它们将阻止请求进行的javascript线程,因此如果您发送请求,等待回调并发送下一个请求,您将模拟同步请求,不会阻止javascript线程,并且您不会获得请求超时,因为访问磁盘时只有一个请求,因此没有请求等待另一个请求完成磁盘工作。