使用 Internet Explorer 为长时间运行的数据 API 调用 PHP/CURL 导致 Apache 2 服务器冻结并需要重新启动

Pro*_*ggi 10 php internet-explorer curl apache-2.2

我正在运行一个 PHP 程序,只要它不被 Microsoft Internet Explorer 浏览器调用,它就可以正常工作,之后它会生成以下进程,锁定 Apache 2 并需要重新启动 Web 服务器(在 Ubuntu 12.04 LTS 上)。

bob@drools:/etc/php5/apache2# ps auxwww | grep apache2
root      8737  0.1  2.5 369164 25800 ?        Ssl  12:41   0:00 /usr/sbin/apache2 -k start
www-data  8743  0.0  3.2 393748 33268 ?        Sl   12:41   0:00 /usr/sbin/apache2 -k start
www-data  8755  0.1  3.3 393856 33904 ?        Sl   12:41   0:00 /usr/sbin/apache2 -k start
www-data  8779  0.1  3.2 393724 33252 ?        Sl   12:45   0:00 /usr/sbin/apache2 -k start
www-data  8782  0.1  3.2 393716 33236 ?        Sl   12:45   0:00 /usr/sbin/apache2 -k start
www-data  8785  0.1  3.2 393684 33204 ?        Sl   12:45   0:00 /usr/sbin/apache2 -k start
www-data  8812  1.1  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8815  1.3  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8818  1.3  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8821  1.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8824  1.4  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8827  1.4  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8830  1.4  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8835  2.5  3.2 393684 33256 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8838  2.8  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8841  2.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8844  2.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8847  3.2  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8850  3.0  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8853  3.2  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8856  3.2  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8861  3.3  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8864  3.6  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8867  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8870  3.6  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8873  3.6  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8876  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8879  3.3  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8881  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8883  3.6  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8886  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8891  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8894  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8896  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8900  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8901  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8904  3.5  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8909  3.8  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8912  3.8  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8915  3.8  3.2 393684 33264 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
www-data  8918  3.6  3.2 393684 33260 ?        Sl   12:47   0:00 /usr/sbin/apache2 -k start
root      8922  0.0  0.1   9396  2000 pts/0    S+   12:47   0:00 grep --color=auto apache2
Run Code Online (Sandbox Code Playgroud)

它曾经锁定整个服务器,直到我在/etc/spache2/apache2.conf 中将一些“ mpm_ ”模块参数更改为更合理的参数

鉴于 Internet Explorer 的问题,我什至添加了这一行:

**" SetEnvIf User-Agent ".*MSIE.*"   nokeepalive "**
Run Code Online (Sandbox Code Playgroud)

在位于此处的虚拟主机文件中:/etc/apache2/sites-available。

有很多关于这个问题的文章,但我没有成功实现其中的任何一篇:

Apache Server 2 在收到来自 IE 10/11 的请求后挂起

更多研发: Internet Explorer 10 (Windows 8) 导致 Apache 崩溃

PHP 程序使用cURL获取 25 个项目的列表,并对每个项目执行 (GET) API 调用到外部服务器,该外部服务器返回 JSON 数据以供进一步处理。这是一个经典的长时间运行的数据程序。

让我感到惊讶的是,它在除 Internet Explorer 之外的所有其他浏览器中都能正常运行——这会导致 Web 服务器行为异常。

我询问了列出的 R&D,然后一些,实施了建议的修复程序,但我仍然得到相同的可预测、可重新创建、有问题的服务器行为。

我需要弄清楚如何保护服务器在遇到和 Internet Explorer 浏览器发出这些特定请求时的不良行为。我想首先了解为什么会发生这种情况。

任何指导、观点、方向或解决方案将不胜感激......

这是我的 cURL 代码的快照:

<?php

// *** CURL Init, SetOps, and Execution Statements ****
$ch = curl_init();


// *** Execute the  API call for each part number and store in the Associative Array ****
$index=0;
foreach ($partNumbersArray as $partNum) {

    $MyValue = $partNum;

    $MyUrl = $MyNiinjaBaseURL."/".$APICmd1."/".$MyDataSet."/".$MyValue."?key=".$MyKey."&$"."filter=substringof('".$MyValue."',PartNumbers)";


    // *** cURL SetOpts, and Execution Statements ****
    curl_setopt($ch, CURLOPT_URL, $MyUrl);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    // curl_setopt($ch, CURLOPT_TIMEOUT, 15);       // <= THIS *never* worked with any reliability ....
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);   // <= THIS executes the cURL call and stores the resulting JSON object in the variable '$server_output'

    $niinjaResultsJsonArray[$MyValue] = $server_output;        // Add the JSON object to the Array and index to PartNumber
    $index++;                                                // Increment the index

} // End Execution of NIINJA API Calls

// ** Close the CURL Object and release resources
curl_close ($ch);

?>
Run Code Online (Sandbox Code Playgroud)

这是 PHP 信息页面:http : //www.versaggi.net/phptest.phtml

mc0*_*c0e 5

很久以前,我看到 Apache 锁定是由 Apache 进程通过 HTTP 调用同一服务器上的 Apache 进程服务的另一个 URL 导致的。我有时会遇到一堆等待此类调用的进程,而没有可用的 Apache 进程来为它们提供服务。在我的例子中,我在一些网页前面有一个翻译层,但是在你自己的网站上调用 API 是一样的。

进行原始调用的浏览器的特性可能会使这种情况更容易发生。例如,保持活动、超时行为等,但从根本上说,这不是浏览器的问题。

如果它与我所看到的类似,那么您希望查看使用 curl 时的超时行为。您所包含的代码表明您对此有所了解,但您可能需要更细粒度地理解它到达请求中的确切位置。使用tcpdump(或 ngrep、Wireshark或其他)查看它可能会很有趣。此外,当调用进程挂起时,最好知道正在进行什么系统调用。也就是说,用strace -p [PID].

您可能还应该考虑是否可以从 API 的使用中删除 HTTP 调用。您能否通过直接调用处理 API 请求的适当代码来将事情保留在同一个 Apache 进程中?

告诉人们您如何运行 PHP(例如 mod_php、fpm 等)可能是相关的。这可能是理解代码锁定机制的一部分。