การใช้ Internet Explorer เพื่อเรียกใช้ PHP / CURL สำหรับ API ข้อมูลที่รันเป็นเวลานานทำให้เซิร์ฟเวอร์ Apache 2 หยุดทำงานและต้องรีสตาร์ท


10

ฉันใช้งานโปรแกรม 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 :

R&D เพิ่มเติม: Internet Explorer 10 (Windows 8) ขัดข้อง Apache

โปรแกรม PHP ใช้cURLเพื่อรับรายการ 25 รายการและทำการเรียก API (GET) สำหรับแต่ละเซิร์ฟเวอร์ภายนอกที่ส่งคืนข้อมูล JSON สำหรับการประมวลผลเพิ่มเติม มันเป็นโปรแกรมดาต้าที่ใช้เวลานาน

สิ่งที่ทำให้บะหมี่ของฉันคือมันทำงานได้ดีในเบราว์เซอร์อื่น ๆ ยกเว้น Internet Explorer ซึ่งทำให้เว็บเซิร์ฟเวอร์ทำงานผิดปกติ

ฉันได้ทำการสอบสวนรายการวิจัยและพัฒนาแล้วบางส่วนได้ดำเนินการแก้ไขตามที่แนะนำ แต่ฉันยังคงได้รับพฤติกรรมการทำงานของเซิร์ฟเวอร์ที่มีปัญหาแบบคาดเดาได้

ฉันต้องหาวิธีป้องกันเซิร์ฟเวอร์จากการทำงานที่ไม่ดีเมื่อพบและเบราว์เซอร์ 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
ฉันคิดว่าคุณต้องบันทึกคำขอ HTTP ขาเข้าเต็มรูปแบบจากทั้ง IE และเบราว์เซอร์อื่น ๆ ที่ไม่มีปัญหาเพื่อให้เราสามารถเปรียบเทียบพวกเขาและมองหาความแตกต่าง โปรดดูคำถามนี้เพื่อดูว่าคุณสามารถทำได้ จะต้องมีบางสิ่งที่ IE ทำกับคำขอ HTTP (บางส่วนเพิ่มเติมหรือส่วนหัวที่ขาดหายไป ฯลฯ ) ที่ทำให้ Apache จัดการกับมันแตกต่างกัน อย่างใดอย่างหนึ่งหรืออยู่ในระดับที่ต่ำกว่า (แพ็คเก็ต IP) ซึ่งฉันแน่ใจว่าไม่หวัง
Stijn de Witt

ฉันให้ความช่วยเหลือเพื่อหวังว่าคุณจะได้รับความสนใจสำหรับคำถามของคุณ
Stijn de Witt

2
เมื่อคิดถึงมันอีกคุณอาจรายงานเรื่องนี้ให้ Apache ทราบว่าเป็นข้อผิดพลาด ... เพราะไม่มีวิธีใดที่ฉันจะสามารถอธิบายสิ่งนี้ได้ว่าไม่ใช่ข้อผิดพลาดของ Apache ซึ่งอาจช่วยให้คุณได้ผู้เชี่ยวชาญ Apache ที่มีประสบการณ์มากมาพิจารณาปัญหา (และหวังว่าจะแก้ไขได้) หากคุณต้องการไปยังเส้นทางนั้นอาจช่วยได้ถ้าคุณย่อหน้ากระดาษที่มีปัญหากับสถานการณ์ที่เล็กที่สุดเท่าที่จะเป็นไปได้ซึ่งยังมีปัญหาอยู่ สิ่งนี้มีประโยชน์ทั้งในตัวของมันเองและต่อไป
Stijn de Witt

ตั้งค่าการหมดเวลาใน curl โดยใช้ setopt
user1050544

3
ไคลเอนต์มีอิทธิพลต่อการเข้าถึง URL ใดโดยสคริปต์ php หรือไม่? คำขอ cURL ยังคงดำเนินต่อไปเมื่อคุณค้นหาเซิร์ฟเวอร์ในสถานะด้านบนหรือไม่ เป็นไปได้หรือไม่ที่ IE กำลังพยายามร้องขอใหม่เมื่อตอบกลับช้าเกินไป หากคำขอ HTTP แต่ละรายการไปยังเว็บเซิร์ฟเวอร์ของคุณสามารถทำให้คำขอเริ่มต้นอีก 25 คำขอ HTTP ไปยังส่วนแบ็คเอนด์นั่นอาจเพิ่มขึ้นอย่างรวดเร็ว คุณสามารถนำการตอบกลับที่คุณได้รับมาใช้กับ cURL สำหรับลูกค้ามากกว่าหนึ่งรายได้หรือไม่
kasperd

คำตอบ:


5

นานมาแล้วฉันเห็น Apache lock-ups ที่เกิดจากกระบวนการ Apache ทำการโทรผ่าน HTTP ไปยัง URL อื่นที่ให้บริการโดยกระบวนการ Apache บนเซิร์ฟเวอร์เดียวกัน บางครั้งฉันก็มีกระบวนการมากมายรอสายดังกล่าวโดยที่ไม่มีกระบวนการ Apache ให้บริการ ในกรณีของฉันฉันมีเลเยอร์การแปลอยู่หน้าเว็บเพจบางหน้า แต่การเรียก API บนเว็บไซต์ของคุณนั้นเหมือนกันมาก

ลักษณะของเบราว์เซอร์ที่ใช้ในการโทรเริ่มแรกอาจทำให้มีโอกาสเกิดขึ้นได้ ตัวอย่างเช่นพฤติกรรมที่ยังคงอยู่การหมดเวลาและอื่น ๆ แต่ไม่ใช่เบราว์เซอร์ที่มีความผิดปกติ

ถ้ามันเป็นอย่างที่ฉันเห็นคุณก็อยากจะดูพฤติกรรมการหมดเวลาในการใช้ curl ของคุณ รหัสที่คุณใส่ไว้แสดงให้เห็นว่าคุณกำลังทำสิ่งนั้นอยู่ แต่คุณอาจจำเป็นต้องเข้าใจอย่างถ่องแท้ว่าคุณต้องการขอสิ่งใด มันน่าสนใจที่จะดูด้วยtcpdump (หรือ ngrep, Wiresharkหรืออะไรก็ตาม) นอกจากนี้ยังเป็นการดีที่จะทราบว่าการเรียกของระบบกำลังดำเนินการอยู่เมื่อกระบวนการเรียกใช้หยุดทำงาน strace -p [PID]นั่นคือการมองไปที่มันมี

คุณควรจะคิดด้วยว่าคุณสามารถลบการโทร HTTP จากการใช้ API ของคุณได้หรือไม่ คุณสามารถเก็บสิ่งต่าง ๆ ในกระบวนการ Apache เดียวกันได้โดยการโทรโดยตรงไปยังรหัสที่เหมาะสมที่จัดการคำขอ API ได้หรือไม่

มันอาจจะเกี่ยวข้องกับการบอกผู้คนว่าคุณใช้งาน PHP อย่างไร (เช่น mod_php, fpm เป็นต้น) นั่นอาจเป็นส่วนหนึ่งของการทำความเข้าใจกลไกที่รหัสล็อค


สิ่งนี้อาจช่วยในการซักถามภายใน PHP ... versaggi.net/phptest.phtml
ProfVersaggi

ในการทดลองฉันปิดการใช้งานการโทร API จากลูป CURL และทำการทดสอบมากมาย สิ่งนี้แยกปัญหาเช่นเดียวกับในระหว่างการทดสอบ Apache2 deamon ยังคงแข็งแรง
ProfVersaggi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.