web-dev-qa-db-ja.com

InternetExplorerを使用して長時間実行されるデータAPIのPHP / CURLを呼び出すと、Apache 2サーバーがフリーズし、再起動が必要になります

PHPプログラムを実行していますが、Microsoft Internet Explorerブラウザによって呼び出されない限り正常に動作します。その後、以下のプロセスが生成され、Apache 2がロックされ、再起動が必要になります。ウェブサーバー(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

mpm _」モジュールパラメータの一部をでより合理的なものに変更するまで、サーバー全体をロックしていました。 )/etc/spache2/Apache2.conf

Internet Explorerの問題を考慮して、次の行を追加しました。

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

ここにある仮想ホストファイル内:/ etc/Apache2/sites-available。

この問題について書かれた記事はたくさんありますが、それらのいずれかを実装することに成功していません。

Apache Server 2は、IE 10/11 からリクエストを受信した後にハングします:

その他の研究開発:Internet Explorer 10(Windows 8)がApacheをクラッシュさせる

PHPプログラムは cURL を使用して25項目のリストを取得し、さらに処理するためにJSONデータを返す外部サーバーに対してそれぞれに対して(GET)API呼び出しを実行します。これは、古典的な長時間実行データプログラムです。

私のヌードルを焼くのは、Internet Explorerを除く他のすべてのブラウザで正常に動作することです。これにより、ウェブサーバーが誤動作します。

リストされているR&Dに問い合わせてから、提案された修正を実装したものもありますが、それでも同じ予測可能、再現可能、問題のあるサーバーの動作が得られます。

サーバーが検出され、InternetExplorerブラウザがこれらの特定のリクエストを行ったときにサーバーが不正に動作するのを防ぐ方法を理解する必要があります。そもそもなぜそれが起こるのか理解したい。

ガイダンス、視点、方向性、または解決策をいただければ幸いです...

これが私の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);

?>

これがPHP情報ページです: http://www.versaggi.net/phptest.phtml

10
ProfVersaggi

ずっと前に、Apacheプロセスが同じサーバー上のApacheプロセスによってサービスされている別のURLにHTTP経由で呼び出しを行った結果としてApacheがロックアップするのを見ました。私は時々、それらを処理するために利用可能なApacheプロセスがない状態で、そのような呼び出しを待機している一連のプロセスに行き着きました。私の場合、いくつかのWebページの前に翻訳レイヤーがありましたが、自分のサイトでAPIを呼び出すことはほとんど同じです。

元の呼び出しを行うブラウザの特性により、これが発生する可能性が高くなります。たとえば、キープアライブ、タイムアウト動作などですが、基本的にブラウザに問題があるわけではありません。

私が見たようなものであれば、curlを使用する際のタイムアウト動作を確認する必要があります。あなたが含めたコードはあなたがそれに取り組んでいることを示唆していますが、それが到達しているリクエストの正確なポイントを正確に理解するためにもっときめ細かくする必要があるかもしれません。 tcpdump (またはngrep、 Wireshark など)でそれを見るのは興味深いかもしれません。また、呼び出しプロセスがハングしたときに、どのシステムコールが進行中であるかを知っておくとよいでしょう。つまり、strace -p [PID]で見てください。

APIの使用からHTTP呼び出しを削除できるかどうかについても検討する必要があります。 APIリクエストを処理する適切なコードを直接呼び出すことで、同じApacheプロセス内に物事を維持できますか?

PHP(mod_php、fpmなど)を実行している方法を人々に伝えることはおそらく適切です。これは、コードがロックされるメカニズムを理解することの一部かもしれません。

5
mc0e