외국물품 발굴 프로젝트는 회사명이 없어 신청할 수 없어 프런트엔드 머신은 알리바바 클라우드 홍콩 ECS에 배치하고, 추가로 알리바바 클라우드 항저우 ECS를 이용해 크론탭을 운영한다. ——크롤러 실행, Alibaba Cloud OSS에 이미지 저장 등 최근 항저우 ECS가 좀 중복되는 느낌이 들어서(원래 항저우 RDS가 있었는데 홍콩 RDS로 옮겼음) 없앨 예정이라 crontab을 모두 항저우로 옮겼습니다. ECS가 홍콩 ECS로 돌아가서 많은 문제를 일으켰습니다.
어떤 문제가 발생했나요? 핵심적인 문제는 홍콩ECS가 국제적인 네트워크 환경에 있어서 본토 서버에 접속할 때 네트워크 지터가 자주 발생하는데, 이는 해결이 매우 어렵다는 점이다. 좀 더 구체적으로 예를 들어, 홍콩 ECS가 Alibaba Cloud Hangzhouopen search
(open search
홍콩 노드가 없습니다, dear╥﹏╥...)를 쿼리할 때 종종 오류를 보고하는 또 다른 예는 다음과 같습니다. 홍콩 ECS가 이미지를 캡쳐한 뒤 항저우 OSS에 업로드한다는 것(OSS는 홍콩 노드를 갖고 있는데 문제는 이미지 처리 서비스가 없다는 점이다. 이게 바가지라고 생각하지 않나?) 둘째 , 오류를 보고하기 전에 잠시 멈추는 경우가 많아 업로드 효율성이 매우 낮습니다. (이러한 이유로 사진을 업로드하기 전에 수천 개의 크롤링된 제품이 대기하고 있습니다. 선반에 놓을 수 있습니다).
open search
의 문제는 여전히 해결하기 쉽습니다. SDK에서는 시간 초과 제한을 조금 더 크게(5초) 설정했는데 기본적으로 오류가 보고되지 않습니다.
OSS SDK는 이 구성을 전혀 제공하지 않습니다. 이 문제를 해결하기 위해 SDK에 들어가서 소스 코드를 수정하기로 결정했습니다.
OSS의 SDK는 php-curl
을 통해 API를 요청합니다. 조사 결과 이 SDK에 requestcore.class.php
클래스를 정의하는 RequestCore
이라는 파일이 있음을 발견했습니다. 그 중 prep_request()
은 컬의 구성을 담당하고, send_request($parse = false)
은 컬의 실행(즉, 실제로 요청을 보내는 것)을 담당한다.
먼저 두 개의 prep_request()
, php-curl
및 CURLOPT_TIMEOUT
CURLOPT_CONNECTTIMEOUT
curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000)의 두 가지 시간 제한 구성이 포함된을 살펴보겠습니다. ;
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120);
CURLOPT_TIMEOUT
이해하기 쉽습니다. 전체 컬 요청 프로세스(http 요청 및 응답)의 시간 초과 제한(초)입니다. , 0으로 설정하면 제한이 없음을 의미합니다. CURLOPT_CONNECTTIMEOUT
은 현재 컬 요청 과정 중 작은 부분인 것으로 확인되어 CURLOPT_TIMEOUT
보다 작게 설정해야 하며, 그렇지 않으면 CURLOPT_TIMEOUT
은 의미가 없습니다. 인터넷 정보에 따르면
CURLOPT_CONNECTTIMEOUT 연결을 시작하기 전 대기 시간을 0으로 설정하면 무기한 대기합니다.
이 发起连接前等待的时间
는 TCP三次握手
과정을 완료하는 데 걸리는 시간, 즉 TCP三次握手
의 전체 과정이 이내에 완료되어야 한다는 점을 언급하는 편이 다소 모호합니다. CURLOPT_CONNECTTIMEOUT
12초 이내에 완료하세요. 그렇지 않으면 시간이 초과됩니다. TCP三次握手
지정된 시간 내에 완료할 수 없다는 것은 서버가 사용량이 많거나 충돌하거나 네트워크가 비정상임을 의미하며 이는 이 기사에서 언급한 시나리오와 일치합니다.
이 추측을 바탕으로 CURLOPT_CONNECTTIMEOUT
을 3초로 설정했습니다.
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);
그렇습니다. 오류를 보고하기 전에 네트워크가 지터링되는 경우(SDK 설정 CURLOPT_CONNECTTIMEOUT
은 120초) 2분 동안 기다려야 합니다.
PS: 시간 초과를 1초 미만으로 설정하려면 CURLOPT_TIMEOUT_MS
을 사용해야 하지만 Brother Niao에 따르면 이 구성에는 버그가 있으며 테스트되지 않았습니다. "컬의 밀리초 타임아웃" "버그"》
위에서는 가혹한 네트워크 환경에 대처하는 방법, crontab 및 이미지 저장을 포함하여 서버가 멈추는 것을 방지하기 위해 php-curl에 대한 시간 초과 제한을 설정하는 방법을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.