Menggunakan Internet Explorer untuk memohon PHP / CURL untuk API data yang berjalan lama menyebabkan server Apache 2 membeku dan membutuhkan restart

10

Saya menjalankan program PHP yang berfungsi dengan baik selama tidak dipanggil oleh browser Microsoft Internet Explorer, setelah itu memunculkan proses di bawah ini, mengunci Apache 2 dan memerlukan restart server web (pada 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

Ini digunakan untuk mengunci seluruh server sampai saya mengubah beberapa parameter modul " mpm_ " menjadi sesuatu yang lebih masuk akal di /etc/spache2/apache2.conf .

Mengingat masalah dengan Internet Explorer, saya bahkan menambahkan baris ini:

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

dalam file host virtual yang ada di sini: / etc / apache2 / sites-available.

Ada sejumlah artikel yang ditulis tentang masalah ini, tetapi saya belum berhasil menerapkannya:

Apache Server 2 hang setelah menerima permintaan dari IE 10/11 :

Lebih banyak R&D: Internet Explorer 10 (Windows 8) menabrak Apache

Program PHP menggunakan cURL untuk mengambil daftar 25 item dan melakukan panggilan API (GET) untuk masing-masing ke server eksternal yang mengembalikan data JSON untuk diproses lebih lanjut. Ini adalah program data lama berjalan klasik.

Apa yang membuat mie saya berjalan dengan baik di setiap browser lain kecuali Internet Explorer - yang menyebabkan server web melakukan kesalahan.

Saya telah menginterogasi R&D yang terdaftar dan kemudian beberapa, menerapkan perbaikan yang disarankan, namun saya masih mendapatkan perilaku server yang dapat diprediksi, dapat diperbaiki, dan bermasalah.

Saya perlu mencari cara untuk melindungi server dari berperilaku buruk ketika bertemu dan browser Internet Explorer membuat permintaan khusus itu. Saya ingin memahami mengapa itu terjadi.

Bimbingan, perspektif, arahan atau solusi apa pun akan sangat dihargai ...

Berikut cuplikan kode CURL saya:

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

?>

Berikut adalah halaman informasi PHP: http://www.versaggi.net/phptest.phtml

ProfVersaggi
sumber
1
Saya pikir Anda perlu entah bagaimana mencatat permintaan HTTP masuk penuh dari IE dan beberapa peramban lain yang tidak memiliki masalah sehingga kami dapat membandingkannya dan mencari perbedaan. Silakan lihat pertanyaan ini untuk bagaimana Anda bisa melakukan itu. Pasti ada sesuatu yang dilakukan IE dengan permintaan HTTP (beberapa header tambahan atau tidak ada, dll?) Yang mengarahkan Apache untuk memperlakukannya secara berbeda. Entah itu, atau itu pada tingkat yang lebih rendah (paket IP), yang saya yakin tidak berharap.
Stijn de Witt
Saya beri hadiah untuk itu semoga membantu Anda mendapatkan perhatian untuk pertanyaan Anda.
Stijn de Witt
2
Memikirkannya lagi, Anda mungkin bisa melaporkan ini ke Apache sebagai bug ... Karena benar-benar tidak ada cara saya bisa menjelaskan hal ini karena bukan bug Apache. Itu mungkin juga membantu Anda mendapatkan beberapa guru Apache yang sangat berpengalaman untuk melihat masalah ini (dan semoga memperbaikinya). Jika Anda ingin pergi dengan rute itu mungkin membantu jika Anda menyusutkan halaman yang mengalami masalah dengan skenario sekecil mungkin yang masih memiliki masalah. Ini bisa membantu dalam dan dari dirinya sendiri.
Stijn de Witt
Tetapkan batas waktu dalam curl menggunakan setopt
user1050544
3
Apakah klien memiliki pengaruh pada URL mana yang sedang diakses oleh skrip php? Apakah permintaan CURL masih berlangsung saat Anda menemukan server dalam kondisi di atas? Mungkinkah IE sedang mencoba kembali permintaan ketika mereka merespons terlalu lambat? Jika setiap permintaan HTTP ke server web Anda dapat menyebabkannya melakukan 25 permintaan HTTP lain ke backend, itu dapat meningkat dengan cepat. Bisakah Anda menggunakan kembali respons yang Anda dapatkan dengan CURL untuk lebih dari satu klien?
kasperd

Jawaban:

5

Beberapa waktu yang lalu, saya melihat penguncian Apache yang dihasilkan dari proses Apache melakukan panggilan melalui HTTP ke URL lain yang dilayani oleh proses Apache pada server yang sama. Saya kadang-kadang berakhir dengan banyak proses menunggu panggilan seperti itu tanpa proses Apache yang tersedia untuk melayani mereka. Dalam kasus saya, saya memiliki lapisan terjemahan di depan beberapa halaman web, tetapi memanggil API di situs Anda sendiri adalah hal yang sama.

Karakteristik browser yang membuat panggilan asli dapat membuat ini lebih mungkin terjadi. Misalnya, tetap-hidup, perilaku batas waktu, dan sebagainya, tetapi ini pada dasarnya bukan kesalahan browser.

Jika itu seperti apa yang saya lihat, maka Anda ingin melihat perilaku batas waktu dalam penggunaan ikal Anda. Kode yang Anda sertakan menunjukkan bahwa Anda menyukainya, tetapi Anda mungkin perlu lebih memahami pemahaman Anda tentang apa sebenarnya maksud dari permintaan itu. Mungkin menarik untuk melihatnya dengan tcpdump (atau ngrep, Wireshark , atau apa pun). Juga bagus untuk mengetahui panggilan sistem apa yang sedang berlangsung saat proses panggilan hang. Yaitu, lihatlah bersama strace -p [PID].

Anda mungkin juga harus memikirkan apakah Anda dapat menghapus panggilan HTTP dari penggunaan API. Bisakah Anda menyimpan hal-hal dalam proses Apache yang sama dengan melakukan panggilan langsung ke kode yang sesuai yang menangani permintaan API?

Mungkin relevan untuk memberi tahu orang-orang bagaimana Anda menjalankan PHP (Misalnya mod_php, fpm, dll.). Itu mungkin menjadi bagian dari memahami mekanisme kode terkunci.

mc0e
sumber
Ini mungkin membantu dengan interogasi internal PHP ... versaggi.net/phptest.phtml
ProfVersaggi
Sebagai percobaan saya memang menonaktifkan panggilan API dari loop CURL dan menjalankan banyak tes. Itu mengisolasi masalah karena selama tes tersebut, Apache2 deamon tetap sehat.
ProfVersaggi