문서 메뉴
문서 홈
/ / /
PHP 라이브러리 매뉴얼

자주 묻는 질문

이 페이지의 내용

  • 일반적인 확장 설치 오류
  • PHP 헤더를 찾을 수 없음
  • 여러 개의 PHP 런타임 설치
  • Windows에서 호환되지 않는DLL 로드하기
  • 서버 선택 실패

예를 들면 다음과 같습니다.

/private/tmp/pear/install/mongodb/php_phongo.c:24:10: fatal error: 'php.h' file not found
#include <php.h>
^~~~~~~

이 오류는 PHP의 빌드 시스템이 필요한 헤더를 찾을 수 없음을 나타냅니다. 모든 PHP 확장은 컴파일하기 위해 헤더가 필요합니다. 또한 해당 헤더는 확장 프로그램이 사용될 PHP 런타임과 일치해야 합니다. 일반적으로 phpize 명령( pecl 에 의해 호출됨)은 확장이 올바른 헤더로 빌드되도록 합니다.

PHP 런타임이 있다고 해서 헤더를 사용할 수 있는 것은 아닙니다. 다양한 Linux 배포판에서 헤더는 종종 별도의 php-dev 또는 php-devel 패키지로 게시됩니다. macOS에서 기본 PHP 런타임에는 헤더가 포함되어 있지 않으며 사용자는 일반적으로 Homebrew 를 통해 PHP(및 헤더)를 설치해야 합니다. 확장을 빌드합니다.

시스템에 여러 버전의 PHP가 설치된 경우 각 버전마다 고유한 peclphpize 명령이 있습니다. 또한 각 PHP 런타임에는 각 SAPI에 대해 별도의 php.ini 파일이 있을 수 있습니다(예: FPM, Atlas CLI). 확장 프로그램이 설치되었지만 런타임에 사용할 수 없는 경우 올바른 pecl 명령을 사용했는지, 적절한 php.ini 파일을 수정했는지 다시 확인하세요.

PHP 런타임에서 파일을 사용하고 있는지 의심스러운 경우 php.ini phpinfo() 의 출력을 검사해야 합니다. 특정 SAPI의 경우. 또한php_ini_loaded_file()php_ini_scanned_files() PHP가 어떤 INI 파일을 로드했는지 정확히 확인하는 데 사용할 수 있습니다.

확장 프로그램이 로드되지 않는 문제를 디버깅하려면 도구 디렉토리에 제공된 detect-extension 스크립트를 사용할 수 있습니다. 이 스크립트를 Atlas CLI에서 실행하거나 웹 서버를 통해 액세스할 수 있는 스크립트에 포함할 수 있습니다. 이 도구는 시스템의 잠재적인 문제와 설치 지침을 제시합니다. 컴포저를 통해 라이브러리를 설치했다고 가정하면 공급업체 디렉토리에서 스크립트를 호출할 수 있습니다.

php vendor/mongodb/mongodb/tools/detect-extension.php

웹 서버 SAPI의 구성을 확인하려면 웹 서버에서 액세스할 수 있는 스크립트에 파일을 포함하고 브라우저에서 엽니다. 출력 형식을 올바르게 지정하려면 스크립트를 <pre> 태그로 감싸야 합니다.

<pre><?php require(...); ?></pre>

Windows 바이너리는 PHP 버전, Typescript 또는 NTS) 및 아키텍처(x86 또는 x64)의 다양한 조합에 사용할 수 있습니다. 올바른 바이너리를 선택하지 않으면 런타임에 확장 파일을 로드하려고 할 때 오류가 발생합니다.

PHP Warning: PHP Startup: Unable to load dynamic library 'mongodb'

다음 PHP 런타임 속성에 해당하는DLL을 다운로드했는지 확인합니다.

  • PHP 버전(PHP_VERSION)

  • 스레드 안전성(PHP_ZTS)

  • 아키텍처 (PHP_INT_SIZE)

앞서 언급한 상수 외에도 이러한 속성은 phpinfo(). 시스템에 여러 PHP 런타임이 설치된 경우 올바른 환경에 대해 phpinfo() 출력을 검사하고 있는지 다시 확인하세요.

앞서 언급한 detect-extension 스크립트를 사용하여 PHP 환경에 적합한DLL을 결정할 수도 있습니다.

다음은 서버 선택 실패의 모든 예입니다.

No suitable servers found (`serverSelectionTryOnce` set):
[connection refused calling hello on 'a.example.com:27017']
[connection refused calling hello on 'b.example.com:27017']
No suitable servers found: `serverSelectionTimeoutMS` expired:
[socket timeout calling hello on 'example.com:27017']
No suitable servers found: `serverSelectionTimeoutMS` expired:
[connection timeout calling hello on 'a.example.com:27017']
[connection timeout calling hello on 'b.example.com:27017']
[TLS handshake failed: -9806 calling hello on 'c.example.com:27017']
No suitable servers found: `serverselectiontimeoutms` timed out:
[TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'a.example.com:27017']
[TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'b.example.com:27017']

이러한 오류는 일반적으로 MongoDB\Driver\Exception\ConnectionTimeoutException 으로 표시됩니다. 확장자에서 예외가 발생합니다. 실제 예외 메시지는 확장 프로그램에서 사용하는 기본 시스템 라이브러리인 libmongoc에서 발생합니다. 이러한 메시지는 다양한 형태를 취할 수 있으므로 애플리케이션의 오류를 더 잘 진단할 수 있도록 메시지 구조를 세분화하는 것이 도움이 됩니다.

메시지는 일반적으로 "적합한 서버를 찾을 수 없음"으로 시작합니다. 메시지의 다음 부분은 서버 선택이 실패한 방법 을 나타냅니다. 기본적으로 확장 프로그램은 서버 선택 루프를 피하고 대신 한 번만 시도합니다( serverSelectionTryOnce 연결 문자열 옵션에 따라). 확장 프로그램이 루프를 사용하도록 구성된 경우 "serverSelectionTimeoutMS expires"와 같은 메시지가 시간 제한을 소진했음을 알려줍니다.

메시지의 마지막 구성 요소에는 서버 선택이 실패한 이유 가 나와 있으며, 각 호스트에 대한 연결 및 모니터링을 담당하는 서비스인 토폴로지 스캐너에서 직접 발생하는 하나 이상의 오류가 포함되어 있습니다. 모니터링 중에 오류가 마지막으로 발생한 모든 호스트가 이 목록에 포함됩니다. 이러한 메시지는 일반적으로 낮은 수준의 소켓 또는 TLS 함수에서 발생합니다.

다음 내용이 포괄적인 것은 아니지만, 서버 선택 실패의 원인이 되는 요인을 분석하는 데 점 방향을 제시하기를 바랍니다.

  • "connection 거부됨"은 원격 호스트가 예상 포트에서 수신 대기하고 있지 않음을 나타냅니다.

  • '연결 시간 초과'는 라우팅 또는 방화벽 문제이거나 지연 시간으로 인한 시간 초과일 수 있습니다.

  • '소켓 시간 초과'는 연결 점 설정되었지만 지연 시간 인해 끊어지거나 시간이 초과되었음을 나타냅니다.

  • "TLS 핸드셰이크 실패"는 TLS 또는 OCSP 확인과 관련된 내용을 나타내며 경우에 따라 TLS 인증서가 잘못 구성되었음을 나타냅니다.

연결에 실패하는 경우 connect 도구를 사용하여 추가 정보를 받을 수 있습니다. 이 도구는 소켓 함수를 사용하여 연결 문자열의 각 호스트에 연결을 시도하여 연결 설정, 데이터 전송 및 수신이 가능한지 확인합니다. 이 도구는 MongoDB 배포에 대한 연결 문자열을 유일한 인수로 사용합니다. 컴포저를 통해 라이브러리를 설치했다고 가정하고 공급업체 디렉토리에서 스크립트를 호출합니다.

php vendor/mongodb/mongodb/tools/connect.php mongodb://127.0.0.1:27017

서버가 연결을 허용하지 않는 경우 출력은 다음과 같습니다.

Looking up MongoDB at mongodb://127.0.0.1:27017
Found 1 host(s) in the URI. Will attempt to connect to each.
Could not connect to 127.0.0.1:27017: Connection refused

참고

이 도구는 mongodb:// URI 스키마만 지원합니다. mongodb+srv 체계 사용은 지원되지 않습니다.

돌아가기

예외 클래스