마른 남자
저는 PHP를 아파치 모듈(libphp56.so)로 구축하고 이를 MacPorts의 libcurl에 연결했습니다. 그러나 libphp56.so가 로드되면 httpd는 시작 시(launchd를 통해) 실패하고 라이브러리 버전 불일치 오류를 인쇄합니다.
지방
PHP의 구성 스크립트를 실행하고 --with-curl=/opt/local
이를 /opt/local/lib/libcurl.4.dylib(MacPorts에서 제공)와 연결했습니다. libcurl의 복사본은 버전 9.0.0이지만 dyld는 버전 7.0.0(/usr/lib/libcurl.4.dylib의 버전)을 로드한다고 주장합니다. 현재는 후자가 로드 중이라고 가정합니다.
apachectl
httpd를 실행 하려면 호출하세요 launchctl
. 직접 실행하면 httpd는 libphp56.so를 로드하고 오류 없이 실행됩니다.
다음은 명령줄의 관련 정보입니다(가독성을 위해 공백이 추가됨).
$ sudo -s #apachectl 구성 테스트 httpd:/private/etc/apache2/httpd.conf 라인 174에 구문 오류가 있습니다: libexec/apache2/libphp56.so를 서버에 로드할 수 없습니다: dlopen(/Library/WebServer/libexec/apache2/libphp56.so, 10): 로드되지 않은 라이브러리: /opt/local/lib/libcurl.4.dylib 인용:/Library/WebServer/libexec/apache2/libphp56.so 이유: 라이브러리 버전 비호환성: libphp56.so에는 버전 9.0.0 이상이 필요하지만 libcurl.4.dylib는 버전 7.0.0을 제공합니다. # /usr/sbin/httpd # ps -ax -O gid | grep /usr/sbin/httpd | 6878 0 ?? SS 0:00.22 /usr/sbin/httpd 6901 70 ?? S 0:00.00 /usr/sbin/httpd 6907 0 s008 S+ 0:00.00 grep --color=auto /usr/sbin/httpd # 종료 기간 6878 # otool -L /opt/local/lib/libcurl.4.dylib grep libcurl 함수 | /opt/local/lib/libcurl.4.dylib: /opt/local/lib/libcurl.4.dylib (호환 버전 9.0.0, 현재 버전 9.0.0) # otool -L /usr/lib/libcurl.4.dylib grep libcurl 함수 | /usr/lib/libcurl.4.dylib: /usr/lib/libcurl.4.dylib (버전 7.0.0, 현재 버전 8.0.0과 호환 가능) # otool -L /Library/WebServer/libexec/apache2/libphp56.so grep libcurl 함수 | /opt/local/lib/libcurl.4.dylib (호환 버전 9.0.0, 현재 버전 9.0.0) # 에코 "x${DYLD_LIBRARY_PATH}x" 더블 엑스 # grep -r 'DYLD_.*_PATH' /etc # launchctl getenv DYLD_LIBRARY_PATH
httpd의 launchd.plist는 매우 기본적입니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>EnvironmentVariables</key>
<dict>
<key>XPC_SERVICES_UNAVAILABLE</key>
<string>1</string>
</dict>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>org.apache.httpd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
</dict>
</plist>
설정디어드환경 변수를 보고 DYLD_PRINT_TO_FILE
하고 launchd 설정 DYLD_LIBRARY_PATH DYLD_PRINT_ENV
및 DYLD_PRINT_LIBRARIES
/usr/lib/libcurl.4.dylib 로드를 보여줍니다.
# DYLD_PRINT_TO_FILE=~/httpd.log DYLD_PRINT_ENV=1 DYLD_PRINT_LIBRARIES=1 apachectl configtest # grep -P 'curl|DYLD_' ~/httpd.log DYLD_PRINT_TO_FILE=/Users/Capra/httpd.log DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_ENV=1 DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_TO_FILE=/Users/Capra/httpd.log DYLD_LIBRARY_PATH=/usr/lib DYLD_PRINT_ENV=1 dyld: 로드됨: /usr/lib/libcurl.4.dylib # 에코 > ~/http.log # DYLD_PRINT_TO_FILE=~/httpd.log DYLD_PRINT_ENV=1 DYLD_PRINT_LIBRARIES=1 /usr/sbin/httpd -D FOREGROUND ^C # grep -P 'curl|DYLD_' ~/httpd.log DYLD_PRINT_TO_FILE=/Users/Capra/httpd.log DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_ENV=1 dyld: 로드됨: /opt/local/lib/libcurl.4.dylib dyld: 제거됨: /opt/local/lib/libcurl.4.dylib dyld: 로드됨: /opt/local/lib/libcurl.4.dylib
libcurl이 이 문제를 겪는 유일한 라이브러리는 아니라는 점에 유의하십시오. 문제를 해결하는 동안 빌드 프로세스에서 PHP의 컬 확장이 누락되었고 libxml과 관련된 유사한 메시지를 받았습니다.
질문
DYLD_LIBRARY_PATH
launchd를 통해 실행할 때 httpd를 설정 해제하는 방법은 무엇입니까? 안전 결과는 무엇입니까?
시도해 볼 수 있는 솔루션
- launchctl unsetenv DYLD_LIBRARY_PATH
DYLD_LIBRARY_PATH
org.apache.httpd.plist에 설정합니다.- org.apache.httpd.plist가 httpd에 대한 래퍼를 실행하여 설정하도록 합니다.
DYLD_LIBRARY_PATH
해결책이 아님
시스템 libcurl에 대해 링크할 수 있지만, PHP가 최신 구성요소와 함께 실행되도록 하는 방법을 찾고 있습니다. /usr/lib/libcurl.4.dylib에 대해 링크하는 것은 최후의 수단일 뿐입니다. launchd를 완전히 피하고, 영향을 받는 PHP 확장/라이브러리를 빌드에 포함하지 않고, 시스템 libcurl을 교체하는 것도 솔루션이 아닌 것으로 간주됩니다. 나는 제거 가능한 포장지를 갖는 것을 거의 고려할 것입니다.
시스템 메시지
- 운영 체제: Mac OS X 10.10.5 요세미티.
- 웹 서버: 아파치 2.4.16
- PHP 5.6.31