10 votos

Usando IE para invocar PHP/CURL de larga ejecución de API de datos de causas servidor Apache2 para congelar y requieren reiniciar

Estoy corriendo un PHP programa que funciona bien siempre y cuando no se invoca por una IE de Microsoft navegador, después de lo cual se genera la continuación de los procesos, se bloquea Apache2 y requiere un reinicio del servidor web (en 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

Se utiliza para el bloqueo de seguridad de todo el servidor hasta que he cambiado algunos de los "mpm_" parámetros del módulo a algo más razonable en /etc/spache2/apache2.conf.

Dados los problemas con IE, incluso he añadido esta línea:

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

en los hosts virtuales archivo ubicado en: /etc/apache2/sites-available.

Hay una serie de artículos escritos sobre el tema, pero no he tenido ningún éxito en la aplicación de cualquiera de ellos:

Apache Server2 se Bloquea después de la recepción de solicitudes de IE 10/11: http://stijndewitt.wordpress.com/2014/01/10/apache-hangs-ie11/

Más R&D: http://stackoverflow.com/questions/13271234/ie10-windows-8-crashing-apache

El programa de PHP utiliza cURL para tomar una lista de 25 elementos y realizar una (GET) llamada a la API para cada uno a un servidor externo que devuelve JSON de datos para su posterior procesamiento. Es un clásico largo de datos de ejecución del programa.

Lo que se cuece en mi fideos es que funciona muy bien en cualquier otro navegador, excepto IE - lo que provoca que el servidor web se portan mal.

He interrogado a la lista de R&D y, a continuación, algunos, implementado la propuesta de soluciones, sin embargo, me sigue apareciendo el mismo predecible, recreatable, problemas de comportamiento de servidor.

Lo que tengo que hacer es averiguar cómo proteger el servidor de comportarse mal cuando se encuentra y el navegador IE, haciendo de estas solicitudes particulares de la misma. Lo que me gustaría hacer es entender por qué sucede en el primer lugar.

Cualquier orientación, perspectivas, de la dirección o de las soluciones sería muy apreciada....

EDITAR:

He aquí una instantánea de mi CURL código:

<?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); 

?>

Aquí está la Página de INFORMACIÓN de PHP: http://www.versaggi.net/phptest.phtml

5voto

mc0e Puntos 2661

Hace mucho tiempo, vi apache lock-ups resultante de un proceso de apache hacer una llamada a través de http a otra URL atendida por un proceso de apache en el mismo servidor. Yo a veces la herida con un montón de procesos en espera en este tipo de llamadas no apache procesos para el servicio de ellos. En mi caso, yo tenía una capa de traducción en la parte frontal de algunas páginas web, pero llamar a una API en su propio sitio web es la misma cosa.

Las características del navegador de hacer la llamada original podría hacer que esto sea más probable que ocurra. por ejemplo keep-alive, tiempo de espera de comportamiento y así sucesivamente, pero no es fundamentalmente el navegador de la culpa.

Si es algo como lo que vi, entonces usted quiere mirar el tiempo de espera de comportamiento en el uso de curl. El código que has incluido sugiere estás en eso, pero usted puede ser que necesite para ser más finos en su comprensión de exactamente qué momento de la solicitud es llegar a. Puede ser interesante observar que con tcpdump (o ngrep, wireshark, o lo que sea). También sería bueno saber qué sistema de llamada en curso cuando el proceso de llamada se bloquea. es decir mire con strace -p [PID].

Probablemente, usted debe también estar pensando en si se puede quitar el http de la llamada de su uso de la API. Puede mantener las cosas dentro del mismo proceso de apache por hacer una llamada directa a la correspondiente código que se encarga de la solicitud de la API?

Probablemente relevantes para decirle a la gente cómo se está ejecutando PHP (por ejemplo, mod_php, fpm, etc). Que puede ser parte de la comprensión del mecanismo por el cual el código se bloquea.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: