Internet Explorer를 사용하여 오래 실행되는 데이터 API에 대해 PHP / CURL을 호출하면 Apache 2 서버가 정지되고 다시 시작해야합니다.


10

Microsoft Internet Explorer 브라우저에서 호출하지 않는 한 PHP 프로그램을 실행 중입니다.이 프로그램은 아래 프로세스를 생성하고 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 에있는 가상 호스트 파일에서

이 문제에 대해 작성된 많은 기사가 있지만 기사를 성공적으로 구현하지 못했습니다.

IE 10/11에서 요청을받은 후 Apache Server 2가 정지됩니다 .

추가 R & D : Internet Explorer 10 (Windows 8)에서 Apache 충돌

PHP 프로그램은 cURL 을 사용하여 25 개의 항목 목록을 가져오고 추가 처리를 위해 JSON 데이터를 리턴하는 외부 서버에 대해 각각에 대해 (GET) API 호출을 수행합니다. 그것은 오래 지속되는 고전적인 데이터 프로그램입니다.

내 국수를 굽는 이유는 Internet Explorer를 제외한 다른 모든 브라우저에서 제대로 작동하여 웹 서버가 오작동한다는 것입니다.

나열된 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);

?>

PHP 정보 페이지는 다음과 같습니다. http://www.versaggi.net/phptest.phtml


1
IE와 문제가없는 다른 브라우저에서 들어오는 HTTP 요청을 어떻게 든 기록해야하므로 비교하고 차이점을 찾을 수 있습니다. 한 번 봐 제발 이 질문에 당신이 할 수있는 방법에 대한합니다. Apache가 HTTP 요청을 다르게 취급하도록하는 HTTP 요청 (일부 추가 또는 누락 된 헤더 등)으로 IE가 수행해야하는 작업이 있어야합니다. 그 중 하나이거나 더 낮은 (IP 패킷) 수준이므로 확실하지 않습니다.
Stijn de Witt

나는 당신이 당신의 질문에 관심을 갖도록 돕기 위해 현상금을 바쳤습니다.
Stijn de Witt

2
좀 더 생각해 보면 아마도 이것을 아파치에 버그로보고 할 수있을 것입니다. 아파치 버그가 아닌 것으로 설명 할 수있는 방법이 없기 때문입니다. 또한 경험 많은 Apache 전문가가 문제를 살펴보고 해결할 수 있도록 도와줍니다. 해당 경로로 이동하려면 문제가 발생한 페이지를 여전히 문제가있는 가장 작은 시나리오로 축소하면 도움이 될 수 있습니다. 어쨌든 도움이 될 수 있습니다.
Stijn de Witt

setopt를 사용하여 컬 타임 아웃 설정
user1050544

3
클라이언트가 PHP 스크립트가 액세스하는 URL에 영향을 미칩니 까? 위의 상태에서 서버를 찾을 때 cURL 요청이 계속 진행됩니까? IE가 너무 느리게 응답 할 때 요청을 다시 시도하고있을 수 있습니까? 웹 서버에 대한 각 HTTP 요청으로 인해 백엔드에 대한 또 다른 25 개의 HTTP 요청이 시작되면 상당히 빠르게 확대 될 수 있습니다. cURL로받은 응답을 둘 이상의 클라이언트에 재사용 할 수 있습니까?
kasperd

답변:


5

오래 전에, Apache 프로세스가 HTTP를 통해 동일한 서버의 Apache 프로세스가 서비스하는 다른 URL을 호출하여 Apache 잠금이 발생하는 것을 보았습니다. 때로는 사용 가능한 Apache 프로세스가없는 서비스를 처리하기 위해 이러한 호출을 기다리는 많은 프로세스가 발생했습니다. 필자의 경우 일부 웹 페이지 앞에 번역 레이어가 있지만 자신의 사이트에서 API를 호출하는 것은 거의 같습니다.

원래 전화를 거는 브라우저의 특성으로 인해이 문제가 발생할 가능성이 높아질 수 있습니다. 예를 들어 연결 유지, 시간 초과 동작 등은 기본적으로 브라우저 결함이 아닙니다.

내가 본 것과 비슷한 것이라면 컬을 사용할 때 시간 초과 동작을보고 싶습니다. 포함 된 코드는 이에 대한 제안이지만 요청의 어떤 시점을 정확히 이해하는지에 대해보다 세분화해야 할 수도 있습니다. tcpdump (또는 ngrep, Wireshark 등) 로 보는 것이 흥미로울 수 있습니다 . 또한 호출 프로세스가 정지 될 때 어떤 시스템 호출이 진행 중인지 아는 것이 좋습니다. 즉,로보십시오 strace -p [PID].

API 사용에서 HTTP 호출을 제거 할 수 있는지 여부도 고려해야합니다. API 요청을 처리하는 적절한 코드를 직접 호출하여 동일한 Apache 프로세스 내에서 작업을 유지할 수 있습니까?

PHP를 어떻게 운영하고 있는지 사람들에게 알려주는 것이 적절할 것입니다 (예 : mod_php, fpm 등). 코드가 잠기는 메커니즘을 이해하는 데 도움이 될 수 있습니다.


이것은 PHP 내부의 심문에 도움이 될 것입니다 ... versaggi.net/phptest.phtml
ProfVersaggi

실험으로 CURL 루프에서 API 호출을 비활성화하고 여러 테스트를 실행했습니다. 테스트 중에 Apache2 데몬이 건강하게 유지되면서 문제가 해결되었습니다.
ProfVersaggi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.