Score:0

แนวทางปฏิบัติที่ดีที่สุดในการแก้ไขปัญหาแอปพลิเคชัน php ที่ติดขัดเนื่องจากการเรียก curl ภายในไปยังปลายทางที่ไม่ตอบสนอง

ธง cn

เมื่อเร็ว ๆ นี้ฉันพบว่าตัวเองมีเว็บไซต์ (Prestashop e-commerce บนเครื่อง Centos PHP-FPM /Apache / MySql) ที่หยุดทำงานและไม่ตอบสนองต่อคำขอของเว็บ

หลังจากการตรวจสอบ ปัญหาเกิดจากการเรียก API ที่ทำด้วย php-curl ไปยังจุดสิ้นสุดที่ออฟไลน์ชั่วคราว ภายในไฟล์ PHP ของแอปพลิเคชันที่ถูกเรียกคืนในทุกหน้าของเว็บไซต์

การเรียก cURL เกิดขึ้นอย่างไม่ถูกต้องโดยไม่มีการตั้งค่า CURLOPT_TIMEOUT_MS ดังนั้นผู้ใช้ที่เยี่ยมชมเว็บไซต์ของฉันจึงเติมการเชื่อมต่อ php ในจำนวนสูงสุดอย่างรวดเร็ว บล็อกกระบวนการ php-fpm และป้องกันไม่ให้เซิร์ฟเวอร์ของฉันรับการเชื่อมต่อขาเข้าอื่นๆ

ฉันสงสัยว่าใครสามารถป้องกัน / ระบุปัญหา "ในการผลิต" จากเทอร์มินัลได้อย่างรวดเร็วและมีประสิทธิภาพหากเกิดขึ้นอีกครั้ง (โดยเฉพาะอย่างยิ่งเพื่อทำความเข้าใจอย่างรวดเร็วว่าจุดสิ้นสุดที่ถูกบล็อกหรือระบุไฟล์ที่สร้างสคริปต์ที่บล็อกเซิร์ฟเวอร์) เนื่องจากในกรณีของฉัน ฉันต้องตรวจสอบปัญหาที่ "ระดับแอปพลิเคชัน" แทนที่จะตรวจสอบจากเซิร์ฟเวอร์ เนื่องจาก:

  • การเปิดใช้ "บนสุด" เซิร์ฟเวอร์จะแสดงรายการกระบวนการ php-fpm ที่ถูกบล็อกโดยไม่มีข้อมูลเพิ่มเติมเพื่อทำความเข้าใจปัญหา (เช่น โหลดเซิร์ฟเวอร์เฉลี่ยอยู่ที่ประมาณ 0.00 เนื่องจากแทบไม่มีกิจกรรมใดๆ เนื่องจากการเชื่อมต่อติดขัด)
  • การเปิดตัว "netstat -nputw" แสดงการเชื่อมต่อภายในจำนวนมากในสถานะ TIME_WAIT แต่ไม่มีข้อมูลเกี่ยวกับการหยุดทำงาน "ผู้ร้าย" (ฉันสามารถเห็นจุดสิ้นสุดที่เรียกโดย php-curl ด้วย netstat หรือคำสั่งเครือข่ายที่คล้ายกันหรือไม่)
  • การเปิดใช้ "strace" ของกระบวนการ php-fpm ฉันเห็นไฟล์ที่เกี่ยวข้องจำนวนมาก แต่สิ่งนี้ไม่มีประโยชน์มากนักเนื่องจากไซต์นี้มีปริมาณการใช้งานเฉลี่ย เปิดไฟล์หลายสิบไฟล์
  • บันทึกของเว็บเซิร์ฟเวอร์แจ้งเพียงการหมดเวลาการเชื่อมต่อไปยังทรัพยากรบนเว็บ แต่ไม่ใช่ของสคริปต์ที่มีการเรียก cURL ที่มีปัญหา

ขอบคุณสำหรับความช่วยเหลือของคุณ.

ua flag
เพิ่มระยะหมดเวลาและวัดว่าระยะใดหยุดทำงาน
user3256843 avatar
cn flag
คำถามไม่ใช่สิ่งที่ต้องทำหลังจากเข้าใจต้นตอของปัญหาแล้ว แต่จะตรวจหาอย่างไรในกรณีที่เกิดปัญหาขึ้นอีก (เช่น ในเว็บไซต์อื่น)
ua flag
หากจำเป็นต้องใช้ผลลัพธ์ของ curl ในการสร้างเพจ คุณต้องรอจนกว่า curl จะล้มเหลวหรือหมดเวลา คุณสามารถผ่อนคลายในแง่มุมใดของข้อความนี้ได้บ้าง
user3256843 avatar
cn flag
บางทีฉันอาจยังไม่ชัดเจนเพียงพอในการตั้งคำถาม สิ่งที่ฉันต้องรู้คือจากมุมมองของ "sysadmin" วิธีค้นหาจากเทอร์มินัลในเวลาที่เร็วที่สุด สาเหตุที่แท้จริงในสถานการณ์เช่นนี้ ถ้ามัน จะเกิดขึ้นอีก เช่น บนเซิร์ฟเวอร์อื่นโดยไม่ทราบว่าแอปพลิเคชันถูกสร้างขึ้นมาอย่างไรและไม่ได้วิเคราะห์แอปพลิเคชัน
ua flag
และข้อเสนอแนะของฉันก็ก้าวไปสู่สิ่งนั้น ฉันอาจมีเงื่อนงำเพิ่มเติมหลังจากที่คุณตอบคำถามของฉัน (เมื่อฉันตอบคำถามไม่ได้ อย่างน้อยฉันก็พยายามช่วยแก้จุดบกพร่อง)
user3256843 avatar
cn flag
ฉันจะพยายามอธิบายตัวเองให้ดีขึ้น: เมื่อฉันพบปัญหาในแอปพลิเคชัน ฉันรู้ดีว่าในการแก้ปัญหานั้นจะต้องตั้งค่าการหมดเวลาในการเรียก curl ที่ไม่ตอบสนอง (หรือการโทร curl จะต้องถูกปิดใช้งานไปพร้อมกัน) แต่การแก้ไขแอปพลิเคชันที่เขียนไม่ดีนั้นไม่ใช่ส่วนหนึ่ง ของงานฉัน... คำถามถูกถามเพราะความต้องการของฉันคือการดูแลระบบ - เพื่อระบุสาเหตุของปัญหาโดยไม่ต้องรู้อะไรเลยเกี่ยวกับแอปพลิเคชันพื้นฐานในเวลาที่เร็วที่สุดด้วยเชลล์ที่อยู่ตรงหน้าฉัน
ua flag
เกร็ดเล็กเกร็ดน้อย: หลายปีก่อน ฉันมีโปรแกรมทำลอนผมเยอะมาก นานๆครั้งมันก็จะค้าง หลังจากค้นคว้ามามากพอสมควรและถามผู้เชี่ยวชาญ ฉันก็สรุปได้ว่ามีบางอย่างที่ต่ำมากในระบบปฏิบัติการเป็นสาเหตุของปัญหา ฉันสามารถแสดงได้ซ้ำๆ ว่าการแฮงค์อยู่ที่ 80.0 วินาทีพอดีเป๊ะ แน่นอนว่านี่เป็นสิ่งที่ยอมรับไม่ได้ แต่ฉันไม่สามารถหาวิธีแก้ไขได้ในเธรด (การใช้หลายเธรดอาจทำให้ฉันดำเนินการต่อได้ แต่ฉันไม่ต้องการไปที่นั่น)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา