>백엔드 개발 >PHP 튜토리얼 >열악한 네트워크 환경을 처리하려면 서버가 정지되는 것을 방지하기 위해 php-curl에 대한 시간 초과 제한을 설정하십시오.

열악한 네트워크 환경을 처리하려면 서버가 정지되는 것을 방지하기 위해 php-curl에 대한 시간 초과 제한을 설정하십시오.

WBOY
WBOY원래의
2016-07-29 09:11:011300검색

외국물품 발굴 프로젝트는 회사명이 없어 신청할 수 없어 프런트엔드 머신은 알리바바 클라우드 홍콩 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-curlCURLOPT_TIMEOUTCURLOPT_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_CONNECTTIMEOUT12초 이내에 완료하세요. 그렇지 않으면 시간이 초과됩니다. 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 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.