2011-11-17 5 views
2

우분투 소스에서 PHP 5.3.8을 설치했습니다. 또한 구성 중에 FPM을 활성화했습니다.각 PHP-FPM Worker는 개별적으로 php.ini를로드합니까?

그러나 PHP 확장 설치시 문제가 발생했습니다. 내 php.ini 파일에 (예 extension=apc.so을) 확장을 추가하고 PHP를 다시 시작하면 (즉 /etc/init.d/php-fpm restart), 내가 얻을 아래와 같은 오류 :

Starting php-fpm PHP Warning: Module 'apc' already loaded in Unknown on line 0 
<br /> 
<b>Warning</b>: Module 'apc' already loaded in <b>Unknown</b> on line <b>0</b><br /> 
PHP Warning: Module 'geoip' already loaded in Unknown on line 0 
<br /> 
<b>Warning</b>: Module 'geoip' already loaded in <b>Unknown</b> on line <b>0</b><br /> 
PHP Warning: Module 'imagick' already loaded in Unknown on line 0 
<br /> 
<b>Warning</b>: Module 'imagick' already loaded in <b>Unknown</b> on line <b>0</b><br /> 
PHP Warning: Module 'memcache' already loaded in Unknown on line 0 
<br /> 

내 PHP-FPM의 conf가 pm.start_servers = 5 설정을 가지고있다, 그래서 저는 약 5 명의 PHP-FPM 작업자를 활성화 시켰습니다. PHP를 다시 시작할 때 (즉 모듈이 이미로드되었다는 메시지) php.ini 파일을로드하려고합니까? 그렇다면 Zend Loader를로드 할 때 오류가 치명적일 때 오류를 막을 수있는 방법이 있습니까?

미리 감사드립니다.

답변

8

두 시간 후에 나는 이것을 치료할 수있는 방법을 찾아 냈습니다. 나는 이것이 소스에서 FPM을 사용하여 PHP를 컴파일하고 설치하는 사람들에게 더 유익 할 것이라고 생각한다. (모든 사람들은 아마도 이것과 아무 관계가 없다.)

기본적으로 PHP는 fpm.conf php.ini 대신 모든 PHP 확장을로드합니다. 여기 당신이 무슨있다 :

  1. 열고 PHP-fpm.conf 파일을 (나는 소스에서 내 PHP를 설치 그래서 나는 어떻게 설정에 따라 /usr/local/php/etc/php-fpm.conf에서 광산을 내 --prefix--with-config-file-path 있지만에서 find/-name "php-fpm.conf"을 사용할 수 있습니다 bash 쉘을 사용하여 자신의 위치를 ​​찾으십시오).

  2. 확장로드 지시문을 추가하십시오 (이상적으로는 파일의 끝에 있음). 형식이 약간 다르므로 여기에서주의해야합니다. php.ini 파일에서이 파일은 extension=apc.so이지만 PHP-fpm.conf 파일에서는 php_admin_value[extension]=apc.so처럼 정의해야합니다.

참고 : extension_dir (당신이 당신의 확장에 대한 모든 .so를 파일을 보관) 값이 php.ini 파일에 정의되어 있는지 확인합니다. 그런 다음 php-fpm을 다시 시작하십시오.

나는 이상과 더 이상 오류가없고 모든 내 확장자는 phpinfo()에 표시됩니다.

나는 이것이 누군가를 도왔 으면 좋겠다. 그것은 나를 미치게 만들었다.

건배.

편집은 추가 테스트 후 나는 문제가 실제로는 조금 더 복잡한 것을 발견했다. 컴파일시에 --with-config-file-path--with-config-file-scan-dir에 대해 동일한 위치를 지정했기 때문에 php.ini를 두 번로드하는 PHP가 원인이었습니다.

  1. :

    그래서 당신은 (또한 작동하지만 당신이 젠드 확장 예를 들면 이온 큐브 로더를로드 할 수 없습니다로 제한이있는) 내가 위에서 지정한 것과 더 나은 대안으로 다음을 수행 할 것 다음 옵션을 사용하여 PHP를 컴파일하십시오 : --with-config-file-scan-dir=/usr/local/php/etc/conf.d. 이 파일을 --with-config-file-path과 다른 디렉토리로 만듭니다.

  2. PHP 확장을로드하기위한 별도의 파일을 만듭니다 (phpext.ini라고 부를 수 있음). 위의 정의 된 위치, 즉 /usr/local/php/etc/conf.d에 저장합니다. 이 파일에서로드하려는 모든 광고 확장을 정의하십시오. extension=apc.so. 내선 번호는 /usr/lib/php5/20090626/ 디렉토리에 저장해야합니다.이 디렉토리는 기본 디렉토리 여야합니다. 기본 php.ini 파일에서 확장을 정의하지 않았는지 확인하십시오.
  3. 다시 시작 PHP

이제 모든 잘 작동합니다 그리고 당신은 (그들이 당신의 php.ini 파일에 정의되어 있어야로와 PHP-fpm.conf에있을 수 없습니다) 젠드 확장을로드 할 수있을 것입니다 .

건배.

+0

아름다운! 나는 항상 php-fpm이 경고를로드하는 모듈로 내 로그를 어수선하게 만들었다 고 궁금해했다. – Olaseni

0

우분투는 확장을 위해 하나의 PHP에 대해 여러 개의 confiugration 파일을 사용합니다. 시스템 소프트웨어 관리 (예 : apt)를 통해 확장 프로그램을 설치하는 경우 php.ini 파일에서 확장 프로그램을 수동으로 활성화 할 필요가 없습니다.

php.ini에 추가 한 파일을 제거하면 문제가 해결됩니다.

추가적으로 PHP는 활성 프로세스마다 모든 ini 파일을 읽습니다.

+0

모든 PHP와 모든 확장 기능을 소스에서 설치 했으므로 수동으로 활성화해야합니다 (필자는 apt-get을 사용하지 않았습니다). 그것들은 모두'phpinfo()'에서 작동하고 나타나지만 에러가 발생합니다. ZendGuardLoader.so는로드 할 때 치명적인 오류를 일으키고 (두 번로드되기 때문에 외관상으로는) 다른 사람들은 오류를 제공하지만 확장은 작동합니다. –

+0

소스와 특히 빌드 스크립트를 어디서 얻었습니까? – hakre

+0

표준 문제 PHP : PHP 소스 파일은 php.net에서 가져온 것이며 PHP 확장은 PECL에서 가져온 것입니다. –

0

/etc/php5/conf.d에 geoip/apc sub-ini가 없는지 확인하십시오. 우분투는 자신의 .ini를 conf.d 디렉토리에 집어 넣어 외부 드라이버를로드하는 경향이 있으며 메인 .ini 만 남겨 둡니다.

+0

conf.d 디렉토리에있는 유일한 .ini 파일은 pdo.ini이며'extension = pdo.so'라는 한 줄을 포함하고 있습니다. '/ etc/php5/cli/php.ini'에 다른 php.ini 파일이 있지만 phpinfo()에서 php.ini가/usr/local/php/etc/php.ini 파일에서로드됩니다. 오른쪽 .ini 파일) –

관련 문제