
저는 현재 PHP5.3으로 작성되고 Symfony2 프레임워크를 사용하여 애플리케이션 중 하나에 대한 공유 스테이징 환경을 설정하고 있습니다.
서버당 애플리케이션의 단일 인스턴스만 호스팅하면 모든 것이 정상적으로 작동합니다.
그러나 그런 다음 애플리케이션의 추가 인스턴스(클라이언트 사용자 정의에 따라 정확히 동일한 코드를 공유하거나 공유하지 않을 수 있음)를 배포하면 다음과 같은 오류가 발생합니다.
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Warning: require(/var/www/vhosts/application1/httpdocs/vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php): failed to open stream: Operation not permitted in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Fatal error: require(): Failed opening required '/var/www/vhosts/application1/httpdocs/app/../vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
기본적으로 두 번째 사이트는 첫 번째 사이트의 파일을 요구하지만 open_basedir 제한으로 인해 그렇게 할 수 없습니다. open_basedir은 문제를 해결하는 대신 마스킹만 하고 존재해서는 안 되는 응용 프로그램 간의 종속성을 생성하므로 비활성화할 의향이 없습니다.
처음에는 이것이 Symfony2 오류와 관련된 것이라고 믿었지만 이제는 APC 문제로 추적했습니다. APC를 비활성화하면 오류도 해결되지만 그렇게 하면 성능에 미치는 영향이 걱정됩니다.
내가 할 수 있는 일에 대해 제안할 사람이 있나요?
답변1
좋아, 이것은 APC나 Symfony2의 특별한 문제가 아니라 우리 자신의 코드에 문제가 있는 것으로 밝혀졌습니다.
이 내용을 접할 수 있는 다른 사람을 참고하려면 다음을 수행하십시오.
우리는 Symfony2의 ApcUniversalClassLoader 구성 요소를 사용하고 있었습니다.
이를 통해 캐시 파일의 접두사를 지정할 수 있습니다.
이 접두사는 애플리케이션의 각 인스턴스에서 동일했습니다. 그렇기 때문에 서버당 인스턴스가 하나만 있는 한 제대로 작동했습니다.
접두사가 동일했기 때문에 APC는 서버를 다시 시작한 직후에 액세스한 응용 프로그램의 첫 번째 인스턴스에 속하는 클래스를 로드하려고 시도했습니다.
접두사를 응용 프로그램의 인스턴스별로 다르게 변경하면 올바르게 작동하여 올바른 폴더에서 클래스를 로드할 수 있습니다.
바라건대, 이것이 작동하지 않는 이유를 깨닫고 다른 사람이 책상에서 머리를 부딪히는 것을 방지할 수 있기를 바랍니다. :)