使用IE调用长时间运行的数据API的PHP / CURL会导致Apache2服务器冻结并要求重启

我正在运行一个PHP程序,只要它没有被微软的IE浏览器调用,然后它产生下面的进程,lockingApache2并且需要重新启动Web服务器(在Ubuntu 12.04LTS上)。

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 

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

鉴于与IE的问题,我甚至添加了这一行:

 **" SetEnvIf User-Agent ".*MSIE.*" nokeepalive "** 

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

关于这个问题写了很多文章,但是我还没有成功实现它们中的任何一个:

Apache Server2在收到来自IE 10/11的请求后挂起: http : //stijndewitt.wordpress.com/2014/01/10/apache-hangs-ie11/

更多的研发: https //stackoverflow.com/questions/13271234/ie10-windows-8-crashing-apache

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

我的面条烘烤的是,除IE以外的其他所有浏览器都能正常运行 – 这会导致Web服务器出现故障。

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

我需要做的是弄清楚如何保护服务器,当它遇到和IE浏览器做出这些特殊要求时,performance不好。 我想要做的是明白为什么发生在第一位。

任何指导,观点,方向或解决scheme将不胜感激….

编辑:

以下是我的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 SetOps, 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); ?> 

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

很久以前,我看到apachelocking导致apache进程通过http调用另一个由同一个服务器上的apache进程服务的URL。 有时候我有一堆进程正在等待这样的调用,没有可用的apache进程来处理它们。 在我的情况下,我在一些网页前面有一个翻译层,但是在你自己的网站上调用一个API也是一样的。

原来的电话浏览器的特点可能会使这种情况更容易发生。 例如保持活动状态,超时行为等等,但它不是根本上的浏览器故障。

如果它和我所看到的一样,那么你希望在使用curl时查看超时行为。 你所包含的代码表明你已经进入了这个领域,但是你可能需要更加细致的理解你的请求到底在哪个点上。 用tcpdump(或者ngrep,wireshark,或者其他)来看看它可能会很有趣。 当调用进程挂起时,知道系统调用正在进行中也是很好的。 即用strace -p [PID]查看它。

你也许应该考虑一下,你是否可以从你使用的API中删除http调用。 你可以通过直接调用处理API请求的适当代码来保持事物在同一个Apache进程中?

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