나는 vagrant box에서 우분투를 실행하고 LAMP 응용 프로그램을 성공적으로 실행하고 개발하고 있습니다.
mbstring
배경: Composer를 사용하여 Laravel을 설치하려고 하는데 "요청한 PHP 확장이 시스템에 없습니다."라는 메시지가 나타납니다.
내 /etc/php
디렉터리에는 7.0과 7.1이라는 두 개의 디렉터리가 있습니다.
그러나 파일을 실행하면 phpinfo()
실행 중이라는 메시지가 표시됩니다.PHP Version 5.5.9-1ubuntu4.20
하지만 실행하면 php -v
버전 7.0.14를 실행 중이라고 표시됩니다.
root@vagrant-ubuntu-trusty-64:/var/www/homebase/src# php -v
PHP 7.0.14-2+deb.sury.org~trusty+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.14-2+deb.sury.org~trusty+1, Copyright (c) 1999-2016, by Zend Technologies
질문: 차이점이 보이는 이유는 무엇입니까?
답변1
phpinfo()
에서 제공하는 Apache PHP 모듈의 버전을 표시합니다 libapache2-mod-php
. 업그레이드해야 합니다(또는 특정 버전 중 하나를 설치해야 합니다 libapache2-mod-php7.1
).
답변2
차이점이 보이는 이유는 무엇인가요?
컴파일 make
타임( ) - PHP의 소스 구성은 여러 SAPI 빌드를 트리거합니다. 예를 들어 php-cli
, php-cgi
기타 php-debug
항목은 컴파일 시간 구성에 따라 다릅니다.
참고: 패키지 관리자가 과거에 컴파일 인쇄를 억제하는 변경을 했기 때문에(아직도 적용되는지 확실하지 않음) PHP의 데비안 또는 우분투 패키지 버전을 사용하여 컴파일 타임 구성 옵션에 액세스하지 못할 수도 있습니다. 시간 구성(사용량 php-config
) 참조:https://lists.ubuntu.com/archives/ubuntu-server-bugs/2010-April/034631.html
그렇지 않은 경우 각 SAPI는 PHP 인터프리터에서 PHP 코드를 실행하려는 모든 항목에 대한 상호 작용 지점을 제공하는 이진 실행 파일입니다. make install
또는 패키지 구성 중에 checkinstall --pkgname=php-self-compiled
이러한 SAPI는 파일 시스템의 다른 위치에 배치됩니다.
cli SAPI - 런타임에 얻는 것은 또는 같은 곳에 php -v
배치될 수 있으며 , cgi SAPI는 시작 시 init 스크립트를 통해 시작되거나 데몬(웹 서버 하위 시스템의 일부)으로 systemd로 시작됩니다. 따라서 PHP 스크립트를 실행하려는 웹 서버는 미리 시작된 SAPI 인스턴스를 사용하고 실행할 스크립트를 전달합니다. 이 SAPI에는 자체 런타임 구성이 있습니다(다음을 사용하여 서버를 시작 하면 볼 수 있음)./bin/php
/usr/bin/php
php-cgi
strace
php
strace php -v
각 SAPI는 일반적으로 동일한 컴파일 작업에서 시작되므로 많은 컴파일 시간 구성(예: 추가할 확장명, 정적으로 컴파일해야 하는지 런타임에 링크해야 하는지 여부)과 버전 번호 등을 공유합니다.
이것이 바로 PHP 구성을 조사하려고 할 때 동작이 발생하는 이유입니다. 둘은 동일한 프로그램이라고 생각할 만큼 유사하지만 어떤 면에서는 여전히 일관성이 없습니다. 후드 객체이지만 구성이 다르고 다양한 환경을 제공하도록 설계되었습니다. 예를 들어 PHP-cli(작곡가가 실행하는 프로그램)가 오류 메시지를 인쇄할 때 오류 메시지가 터미널에 인쇄될 것으로 예상하므로 다음과 같은 경우 일반 텍스트를 인쇄합니다. php-fpm
또는 php-cgi
동일한 오류를 인쇄하면 일부 웹 관련 프로세스와 상호 작용한다고 가정하기 때문에 이를 HTML로 래핑합니다. php-debug는 포트 9000에서 데이터 연결을 수신하는 등 다른 방식으로 상호 작용을 다시 예상합니다.
답변3
나는 이 문제가 명령줄에서 사용되는 php-cgi와 직접 php의 차이점과 관련이 있다고 생각합니다(확인할 Ubuntu 상자가 없습니다). Ubuntu가 LAMP 스택을 설치할 때 phpX-cgi를 사용한 것 같습니다. cgi 버전은 php.ini 파일을 사용하는데, 이는 cwd에 대한 경로를 변경하기 때문에 문제를 더욱 복잡하게 만듭니다.