Bug #68587 [Opn->Fbk]: auto_prepend_file breaks Apache2 virtual hosts if same contents
| From: | requinix@php.net | Date: | Thu, 11 Dec 2014 04:47:12 +0000 |
| Subject: | Bug #68587 [Opn->Fbk]: auto_prepend_file breaks Apache2 virtual hosts if same contents | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-189004@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=68587&edit=1
ID: 68587
Updated by: requinix@php.net
Reported by: dante at lorenso dot com
Summary: auto_prepend_file breaks Apache2 virtual hosts if
same contents
-Status: Open
+Status: Feedback
Type: Bug
Package: Apache2 related
Operating System: Ubuntu 14.04 LTS
PHP Version: 5.5.19
Block user comment: N
Private report: N
New Comment:
Using OPcache? What's the value of opcache.use_cwd? If off, does turning it on fix the problem?
Previous Comments:
------------------------------------------------------------------------
[2014-12-11 04:28:44] dante at lorenso dot com
I added the following code to BOTH bootstrap.php files ...
error_log(str_repeat('-', 80));
error_log('FILE: ' . __FILE__);
error_log('DIR: ' . __DIR__);
error_log('ROOT_DIR: ' . ROOT_DIR);
$files = get_included_files();
edump($files);
And here are the 2 outputs ...
After loading the first virtual host URL(keydb):
[Wed Dec 10 22:16:22.146732 2014] [:error] [pid 18058] [client 10.0.8.2:6687] FILE:
/www/prod/keydb/public/bootstrap.php
[Wed Dec 10 22:16:22.146840 2014] [:error] [pid 18058] [client 10.0.8.2:6687] DIR:
/www/prod/keydb/public
[Wed Dec 10 22:16:22.146926 2014] [:error] [pid 18058] [client 10.0.8.2:6687] ROOT_DIR:
/www/prod/keydb
[Wed Dec 10 22:16:22.147380 2014] [:error] [pid 18058] [client 10.0.8.2:6687] [01] Array\n(\n [0]
=> /www/prod/keydb/public/bootstrap.php\n)\n
And after loading the second virtual host URL(acd):
[Wed Dec 10 22:16:29.082052 2014] [:error] [pid 18056] [client 10.0.8.2:43767] FILE:
/www/prod/keydb/public/bootstrap.php
[Wed Dec 10 22:16:29.082153 2014] [:error] [pid 18056] [client 10.0.8.2:43767] DIR:
/www/prod/keydb/public
[Wed Dec 10 22:16:29.082236 2014] [:error] [pid 18056] [client 10.0.8.2:43767] ROOT_DIR:
/www/prod/keydb
[Wed Dec 10 22:16:29.082461 2014] [:error] [pid 18056] [client 10.0.8.2:43767] [01] Array\n(\n
[0] => /www/dev/acd/public/bootstrap.php\n)\n
NOTICE how loading the "acd" project ... in the get_included_files() array it lists the
file name as /www/dev/acd/public/bootstrap.php? But, the value of __FILE__ lists a DIFFERENT file
... the one from the other virtual host: /www/prod/keydb/public/bootstrap.php.
I agree now that this is not affecting the Apache 2 virtual hosts directly, but it IS a bug inside
PHP somewhere. PHP is confused about which file it is actually parsing because
get_included_files()[0] != __FILE__
For the auto_prepend_file declared in each virtual host. In my projects, it is not the same virtual
host that is used, but it IS the same bootstrap.php file being used, so PHP sets all the define
constants to values based on the bootstrap.php file:
define('ROOT_DIR', realpath(__DIR__ . '/..'));
And this triggers the SPL auto loader to use the wrong classes:
// PSR-4: convert class name to file name
$lib_file = ROOT_DIR . '/library/' . strtr(ltrim($class_name, '\\'),
array('\\' => '/')) . '.php';
if (file_exists($lib_file)) {
include $lib_file;
return true;
}
Which effectively makes all the asset files and library classes load from the wrong site.
-- Dante
------------------------------------------------------------------------
[2014-12-11 02:18:50] requinix@php.net
Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves.
A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external
resources such as databases, etc. If the script requires a
database to demonstrate the issue, please make sure it creates
all necessary tables, stored procedures etc.
Please avoid embedding huge scripts into the report.
bootstrap.php, specifically. Do you happen to be using that to effectively "load" the
website? Could it be confused about which site it's supposed to load?
Exactly what did you change to make the problem go away?
Because I can tell you this: Apache is not looking for the php_value directive that defines
auto_prepend_file, examining the referenced file, deciding that since the contents of the file
matches those of a previous VirtualHost's the two sites are the same, and disregarding all
other configuration directives such as ServerName/Alias and DocumentRoot which may contradict that
conclusion.
------------------------------------------------------------------------
[2014-12-11 02:03:51] dante at lorenso dot com
Description:
------------
Given 2 different virtual hosts in Apache, if auto_prepend_file is used in both virtual hosts and
the files contain the exact same data, the first virtual host loaded by Apache is used for all
subsequent virtual hosts.
Example ...
<VirtualHost...>
php_value auto_prepend_file bootstrap.php
</VirtualHost>
<VirtualHost...>
php_value auto_prepend_file bootstrap.php
</VirtualHost>
Changing contents of just one of the bootstrap.php files to alter the contents will correct the
problem and allow Apache to serve different virtual host DocumentRoot content.
Expected result:
----------------
php_value auto_prepend_file bootstrap.php should be independent of file contents and should be
defined separately for each virtual host without conflict.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=68587&edit=1