2

한 페이지에서 여러 AJAX 호출을하고 있습니다. 모든 호출은 응답을 성공적으로 반환하지만 마지막 (다른 ajax 호출과 관련이 없음)은 응답 코드로 500 내부 서버 오류를 반환합니다 (방화 광구가 말하는 것처럼). 그러나 오류 코드에도 불구하고 올바른 AJAX 호출에서 콘텐츠가 반환됩니다.이상한 500 내부 서버 오류 (방화 광, PHP, display_errors, ajax)

놀랍게도 php.ini의 display_errors 옵션을 On으로 설정하면 오류가 사라지고 페이지의 응답이 렌더링됩니다. 파일에 로깅 오류가 있지만 위에서 언급 한 내부 서버 오류에 해당하는 오류가 기록되지 않습니다.

그건 그렇고, 아파치, JQuery, PHP5, APC (해당되는 경우)를 사용하고 있습니다.

+0

질문 없습니다. 또한 묵시적인 질문 인 "무엇이 틀렸습니까?"에 대답 할 수있는 세부 정보를 거의 제공하지 않습니다. – hobodave

+0

나는 그것이 더 흥미로운 상황이기 때문에 더 많은 정보가 필요하지만 동의했다는 것에 동의한다. –

+0

@hobodave, 더 많은 정보가 필요하십니까? 이 방법이 도움이된다면 오류가 발생하는 코드 조각은 실제로 XML 문자열이 포함 된 JSON 문자열로 변수 값 중 하나로 응답합니다. –

답변

2

매우 이상합니다 ... 이 실제 반환 값과 독립적으로 상태 코드 헤더에 영향을 줄 수있는을 작성하지 않은 라이브러리 또는 다른 코드를 사용하고 있습니까?

+0

예, FlourishLib이라는 라이브러리를 사용하고 있지만 다른 서버에서 동일한 소프트웨어가 원활하게 실행되므로 문제가 될 수 있습니다. –

0

PHP 인터프리터는이 요청 중에 단순히 충돌합니다. 나는 PHP를 추락시킬 수있는 하나의 잠재적 인 이유를 안다 :

GCC 4.3의 몇몇 버그로 인해,이 컴파일러 버전으로 컴파일 된 PHP는 예외 구현이 깨져있다. 드문 경우지만 스크립트로 예외를 발생 시키면 segfault가 발생하고 스크립트 실행이 종료됩니다. 이 논문은 몇 달 전에 PHP 팀에 의해 확인되었습니다.

확인하려면 스크립트 실행이 중단되는 곳을 확인하고 예외가 발생하면 바로 집에 있는지 확인하십시오. 이 검사는 die()을 스크립트에 더 추가하여 수행하면 어떤 일이 발생하는지 확인할 수 있습니다. 또 다른 방법은 declare(ticks=1)을 사용하고 debug_backtrace()의 마지막 항목을 틱마다 파일에 저장하는 틱 기능을 등록하면 스크립트가 실행되는 방법에 대한 보고서를 얻을 수 있습니다.

3

제한된 정보를 제공 할 가능성이 높습니다. PHP가 에 도달하면이 예상 출력을 반향 출력합니다.

테스트하려면 : 마지막으로 실행되는 줄에서 뭔가를 울립니다. 그 에코가 나타나지 않으면 PHP 스크립트가 어딘가에서 멈추고 있음을 알 수 있습니다. 이 시점에서 디버깅과 추적의 문제 일뿐입니다.

0

나는 비슷한 문제가 있었는데 문제는 스크립트가 예외를 던지고 catch 블록이 없어서 예외가 표면에 부풀어 오르고 치명적인 오류 인 "잡히지 않은 예외"가 발생했기 때문입니다. 어떤 표준 PHP 동작이지만 하나의 특정 서버에서 200 OK 대신 500 내부 서버 오류 응답 코드를 얻을 수도 있습니다. 예외를 제거하고 die() 문으로 대체하면 서버에서 문제가 해결되었습니다 (처음부터 예외가 실제로 발생하지 않는 간단한 스크립트이기 때문에 가능합니다)

0

이 문제는 종종 다음 중 하나입니다. 스크립트 사용 권한, 권한 및 소유권을 확인하십시오. ajax 호출 후 반환되는 경우 치명적 오류가 없는지 확인합니다. 실수로 파일을 ASCII 모드로 유닉스에 업로드하지 않았는지 확인하십시오.

더 많은 정보는 내가이 동일한 문제를 가지고 숨겨진 치명적 오류로 판명 http://www.larshemel.com/forum/500_internal_server_error

2

에서 읽을 수 있습니다. display_errors를 켜고, 오류를 찾아 내고, 오류를 제거하고, display_errors를 끕니다 (아마도 개발을 위해 display_errors를 켜고 프로덕션 환경에서는 사용하지 않는 것이 가장 좋습니다).