it-swarm-ja.com

APCおよびSymfony2に関するopen_basedirの問題

私は現在、PHP5.3で記述され、Symfony2フレームワークを使用して、アプリケーションの1つに共有ステージング環境をセットアップしています。

サーバーごとにアプリケーションのインスタンスを1つだけホストする場合、すべてが正常に機能します。

ただし、アプリケーションの追加インスタンスをデプロイすると(クライアントのカスタマイズに応じて、まったく同じコードを共有する場合と共有しない場合があります)、次のようなエラーが発生します。

[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

基本的に、2番目のサイトは最初のサイトからのファイルを要求しようとしていますが、open_basedirの制限により、それはできません。 open_basedirを無効にするのは、問題を解決するのではなくマスクするだけであり、存在してはならないアプリケーション間の依存関係を作成するためです。

これはSymfony2エラーに関連していると当初は信じていましたが、現在はAPCの問題まで追跡しています。 APCを無効にすることでもエラーは解決しますが、そうすることによるパフォーマンスへの影響が心配です。

誰かが私ができるかもしれないことについて何か提案がありますか?

2
Steve Hill

わかりました。これは、APCまたはSymfony2のいずれかで特に問題があるのではなく、独自のコードの問題であることが判明しました。

これに出くわすかもしれない他の誰かの参照のために:

  1. Symfony2のApcUniversalClassLoaderコンポーネントを使用していました。

  2. これにより、キャッシュファイルのプレフィックスを指定できます。

  3. このプレフィックスは、アプリケーションの各インスタンスで同じでした。これが、サーバーごとにインスタンスが1つしかない限り、正常に機能した理由です。

  4. プレフィックスが同じであるため、APCは、サーバーの再起動直後にアクセスされたアプリケーションの最初のインスタンスに属するクラスをロードしようとしました。

  5. プレフィックスをアプリケーションのインスタンスごとに異なるものに変更すると、これが正しく動作し、正しいフォルダーからクラスがロードされます。

うまくいけば、これにより、他の人がなぜそれが機能しないのかを理解したときに、机から頭を叩くのを防ぐことができます:)

1
Steve Hill