为什么HTTP请求在Chrome中等待挂起?

时间:2018-04-09 13:02:13

标签: php angular apache google-chrome cors

语言/工具版本:

  1. @ angular / cli:1.2.0
  2. PHP 7.0.8
  3. Zend Expressive 2
  4. Apache 2.4.23
  5. Chrome 65.0.3325.181
  6. Windows 7
  7. 问题:

    我有一个Angular2应用程序,它使用PHP应用程序作为所有XHR请求的API。该应用程序运行正常但在Chrome中启用Use a prediction service to load pages more quickly选项时,以及重新加载应用程序时,在组件的ngOnInit()内发送的HTTP请求会被卡住很长时间。请求将在10s-2-3mins之后自行解决,或者如果我发送另一个请求(例如,对DOM上的单击事件发出请求),请求也将解析

    我尝试的事情:

    1. 我经历过多个帖子(例如123等)但问题很严重,但没有一个非常 有用,我读到如果我有多个HTTP请求,可能会发生这种情况。在我的情况下,我尝试隔离请求,现在我在组件初始化时只发送一个请求。甚至一个请求也会被卡住。我的控制台将显示失败的GET请求,然后一直等待,一旦解决,将会有一个成功的OPTIONS请求,然后成功GET
    2. 我不确定这是我的前端Angular的问题 应用程序或后端PHP应用程序,因此在初始化时 在组件中,我称之为随机API端点: http://api.randomuser.me/而不是请求我的API端点。 在这种情况下,请求成功,没有任何延迟(尽管它 显示CORS错误)。所以我认为问题在于我的问题 后端API或Apache Web服务器。
    3. 我试图查看某些内容是否导致API延迟,但在请求从浏览器成功之前,应用程序的入口点本身不会被命中。
    4. 我还想分享我的虚拟主机配置。如果您发现任何问题:

      <VirtualHost *:80>
      ServerName someName.api
      DocumentRoot path_to_public_dir
      SetEnv APPLICATION_ENV development
      <Directory path_to_public_dir>
      
          SetEnvIf Origin "http(s)?://(www\.)?(local\.)?(localhost:4200|someDomain.com)$" AccessControlAllowOrigin=$0
          Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
      
          RewriteEngine On 
      
          RewriteCond %{REQUEST_FILENAME} -s [OR]
          RewriteCond %{REQUEST_FILENAME} -l [OR]
          RewriteCond %{REQUEST_FILENAME} –d
          RewriteRule ^.*$ - [NC,L]
          RewriteRule ^.*$ index.php [NC,L]
          Options -Indexes +MultiViews +FollowSymLinks
          AllowOverride none
          Order Allow,Deny
          Allow from all
      </Directory>
      

      请注意:

      • 我也试过设置Access-Control-Allow-Origin 应用程序本身内部的标题,但仍然没有运气。
      • 该应用程序在Mozilla或Chrome上运行时效果很好 预测服务未启用

      您对这种行为的可能原因的建议/答案将非常有帮助。

2 个答案:

答案 0 :(得分:6)

嗯,我认为,做以下操作已经消除了我机器的延迟。

在解决方案之前,这是我的假设:

  1. 只要“预测服务到”,Chrome就会执行并行请求 快速加载页面“
  2. 我的Apache Web服务器没有处理这些并行请求。
  3. 解决方案:

    1. 我为apache包含了mpm模块文件。你可以找到 httpd.conf文件中的以下行:

      #Include conf/extra/httpd-mpm.conf并取消注释。

      Windows将mpm_winnt_module用于mpm。

        

      此多处理模块(MPM)是Windows NT操作系统的默认设置。它使用单一的控制过程   启动一个子进程,然后创建线程   处理请求

    2. 找到以下行并取消注释:

      EnableMMAP off        
      EnableSendfile on
      
      AcceptFilter http none
      AcceptFilter https none
      
      #Extra Notes
      #mmap is memory map by apache, don't know I have uncommented this, had read about
      this somewhere, but anyway its Off so should not be a Burden on OS
      #EnableSendFile:Delivering static files? This link may help:
      https://groups.drupal.org/node/68333
      #AcceptFilter: windows mpm module, suggests to keep it as none. 
      I went through this : https://httpd.apache.org/docs/2.4/mod/core.html
      and have set AcceptFilter http/https as "connect", it works fine for me. 
      Please note: I am using Apache 2.4.23
      
    3. 重启你的apache
    4. 就是这样!

      我将此问题视为未接受,因为:

      1. 我不知道我做的是对的。
      2. 虽然我启用了winnt模块,但我找不到该模块 我的apache目录中的任何位置的文件,虽然在 ThreadsPerChild反映出来,我猜apache不需要了 外部winnt模块。
      3. 虽然我可以观察到页面加载速度增加了 请求不再卡住,我仍然可以看到交错 failed and finshed请求我的Chrome中的每个请求 控制台。
      4. 你的答案非常有价值,可以让事情变得更加清晰。

答案 1 :(得分:0)

由于您的网速较慢,会出现此问题。 当onInit()调用它时,它会侵入所有的web服务和放大器。等待第一个webservice的完成。当第一个服务的执行结束时,第二个服务将开始执行但仍然处于Pending状态,因此它在Network的状态列中显示'Pending'