2010-12-21 5 views
5

모든 것을 검색 한 후 원격 SSL 사용 가능 호스트에 발급 된 cURL 요청이 제 경우의 50 % 정도만 성공한 이유를 이해할 수 없습니다. 상황은 다음과 같습니다. PHP CLI를 사용하여 실행되는 단일 PHP 스크립트 내에서 HTTPS 원격 호스트에 발급 된 일련의 cURL 요청이 있습니다. 때때로 내가 요청이 성공적으로 실행하지만, 어떤 이유로 대부분의 시간 내가 그것을 실행하는 스크립트를 실행할 때 컬에서 다음과 같은 오류가 발생합니다 :cURL/PHP 요청이 시간의 50 %를 실행합니다

* About to connect() to www.virginia.edu port 443 (#0) 
* Trying 128.143.22.36... * connected 
* Connected to www.virginia.edu (128.143.22.36) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac 
* Closing connection #0 

나는 다시 내가 같은 결과를 얻을 몇 번을 시도 할 경우, 하지만 몇 번 시도해도 요청이 성공적으로 통과됩니다. 그 후 스크립트를 다시 실행하면 오류가 발생하고 패턴이 계속됩니다. 오류 '경고 불량 녹음 Mac'을 조사해도 아무 도움이되지 않았으며 스크립트가 가끔씩 실행되기 때문에 SSL 문제에 대한 책임이 있음을 주저합니다.

저는 최신 버전의 openssl뿐만 아니라 php5 및 php5-curl이 설치된 우분투 서버 10.04입니다. cURL 특정 옵션과 관련하여 CURLOPT_SSL_VERIFYPEER는 false로 설정되고 CURLOPT_TIMEOUT 및 CURLOPT_CONNECTTIMEOUT은 모두 4 초로 설정됩니다. 이 문제를 더 자세히 설명하는 것은 Mac OS X 개발 컴퓨터에서 똑같은 상황이 발생한다는 것입니다. 요청은 시간의 50 % 만 통과합니다.

+0

Google에 "오류 140943FC"가 표시 될 수도 있습니다. –

+0

나를 믿어 봤습니다. 나는 심지어 작업자 스레드 버전과 (이것은 도움이되지 않았기 때문에 이미 실행 중이기 때문에) 이와 관련된 버그가 있었기 때문에 나는 작업자 스레드와 반대되는 prefork MPM에서 Apache를 실행하고 있는지 확인했습니다. – mquinn

+2

잘못된 레코드 MAC은 네트워크 인터페이스의 MAC 주소를 참조하지 않습니다. 그것은 "메시지 인증 코드" –

답변

3

원격 호스트가 실제 고유 호스트가 아닐 수도 있습니다. 어쩌면 들어오는 요청을받는 여러 서버와의 일종의로드 균형 조정 솔루션 일 수 있습니다. 무엇이 나를 오류 메시지의 'mac 오류'일 수 있다고 생각하게 만듭니다. 이는 SSL 호스트가 여전히 실행 중일 때 원격 호스트 mac 주소가 변경된 것일 수 있습니다. 그리고 이것은 때때로 당신이 아무런 문제가 없다고 설명 할 수 있습니다.

하지만 어쩌면 :-) SSL 문제는 찾기가 어렵습니다.

prefork MPM vs Worker MPM에 대한 답을 이해하지 못합니다. cli 모드에서 PHP를 실행하면 apache MPM이 사용되지 않고 아파치도 사용되지 않습니다. 긴 패스

CURLOPT_FORBID_REUSE

:

+0

과 관련된 문제를 말하며로드 균형 조정 된 원격 호스트가 내 상황에서 의미가 있습니다. 내가 유효하고 틀리지 않은 컬 응답을 얻을 수있을 때까지 차단하기로 결정했다. 내가 지금 제일 좋아. – mquinn

+3

MAC이 네트워크 MAC 주소와 관련이 없다고 생각합니다. 이것은 Message Authentication Code의 약자입니다 : http://en.wikipedia.org/wiki/Message_authentication_code ... 이것은 "원격 호스트 mac 주소"변경이이 문제와 관련이 없으며 그 반대도 마찬가지라는 결론에 이릅니다. –

+0

@Charles Oliver Nutter는 잘 잡았지만 호스트 (ssl 캐시)에서 공유해야하는 것과 아직 그렇지 않은 것의 문제가있을 수 있습니다. – regilero

1

는이 옵션이 필요할 수 있습니다. 다음 전송이 완료되면 명시 적으로 연결을 닫게하려면 1로 설정하십시오. 일반적으로 libcurl은 모든 연결이 살아있을 때 하나의 전송으로 끝내면 살아남을 수 있습니다. 이 옵션은주의해서 사용해야하며 이해하는 경우에만 사용해야합니다. 나중에 다시 사용할 수 있도록 libcurl에서 연결을 열어 두려면 0으로 설정하십시오 (기본 동작).

+0

제안 해 주셔서 감사합니다.하지만 아무 소용이 없었습니다. 나는 이전에 CURLOPT_FRESH_CONNECT를 시도했지만 작동하지 않았고 FORBID_REUSE가 동일한 이전 동작을 초래했습니다. – mquinn

0

시도 했습니까? curl_setopt ($ handle, CURLOPT_SSLVERSION, 3);

관련 문제