Bug #66773 [Asn]: Autoload with Opcache allows importing conflicting class name to namespace
| From: | dmitry@php.net | Date: | Thu, 23 Oct 2014 09:17:48 +0000 |
| Subject: | Bug #66773 [Asn]: Autoload with Opcache allows importing conflicting class name to namespace | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-188273@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=66773&edit=1
ID: 66773
Updated by: dmitry@php.net
Reported by: carl dot vuorinen at w3 dot fi
Summary: Autoload with Opcache allows importing conflicting
class name to namespace
Status: Assigned
Type: Bug
Package: opcache
Operating System: Linux (Ubuntu)
PHP Version: 5.5.9
Assigned To: dmitry
Block user comment: N
Private report: N
New Comment:
Unfortunately, the patch is wrong.
Opcache compiles each script separately by design.
Otherwise, it'll may make dependencies on other scripts.
And later to unpredictable behavior, if some of those scripts are changed and recompiled but
depended is not.
The patch breaks this rule.
Actually, the behavior with opcache seems better :)
May be it makes sense switching to it in PHP7.
Previous Comments:
------------------------------------------------------------------------
[2014-10-22 09:41:14] jpauli@php.net
I got a patch at https://github.com/jpauli/ZendOptimizerPlus/compare/66773
I compiles and works just fine for 5.5, shouldn't diff for other versions.
Dmitry, this needs review
------------------------------------------------------------------------
[2014-06-23 16:17:26] devosc at gmail dot com
I prefer the new behaviour and would like it to be kept/maintained.
------------------------------------------------------------------------
[2014-06-23 12:30:38] jpauli@php.net
Reproduced.
Seems like a bug.
@dmitry: any idea ? I found that the compiler class_table is reseted between each compilation by
opcache (https://github.com/zendtech/ZendOptimizerPlus/blob/master/ZendAccelerator.c#L1411), thus
the class can't be found and detected as already used.
------------------------------------------------------------------------
[2014-05-27 01:11:55] adrien dot crivelli at gmail dot com
Same issue here. The test script could be reproduced:
$ lsb_release -a
LSB
Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
$ php -v
PHP 5.5.9-1ubuntu4 (cli) (built: Apr 9 2014 17:11:57)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
$ php -i | grep opcache.enable_cli
opcache.enable_cli => On => On
$ php execute.php
self: Some\Bar
parent: Other\Bar
$ php -i | grep opcache.enable_cli
opcache.enable_cli => Off => Off
$ php execute.php
PHP Fatal error: Cannot use Other\Bar as Bar because the name is already in use in
/tmp/a/some_foo.php on line 5
PHP Stack trace:
PHP 1. {main}() /tmp/a/execute.php:0
PHP 2. spl_autoload_call() /tmp/a/execute.php:13
PHP 3. {closure:/tmp/a/execute.php:6-8}() /tmp/a/execute.php:0
PHP 4. spl_autoload() /tmp/a/execute.php:7
Fatal error: Cannot use Other\Bar as Bar because the name is already in use in /tmp/a/some_foo.php
on line 5
Call Stack:
0.0002 235776 1. {main}() /tmp/a/execute.php:0
0.0005 242720 2. spl_autoload_call() /tmp/a/execute.php:13
0.0005 242752 3. {closure:/tmp/a/execute.php:6-8}() /tmp/a/execute.php:0
0.0005 242880 4. spl_autoload() /tmp/a/execute.php:7
------------------------------------------------------------------------
[2014-03-11 12:25:59] carl dot vuorinen at w3 dot fi
Here is a more detailed output with both OPcache enabled and OPcache disabled.
Same behaviour also reproduced in few other environments.
$ php -v
PHP 5.5.9-1+sury.org~saucy+1 (cli) (built: Feb 13 2014 15:58:58)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
$ php -i | grep opcache.enable_cli
opcache.enable_cli => On => On
$ php execute.php
self: Some\Bar
parent: Other\Bar
$ sudo nano /etc/php5/cli/php.ini
$ php -i | grep opcache.enable_cli
opcache.enable_cli => Off => Off
$ php execute.php
Fatal error: Cannot use Other\Bar as Bar because the name is already in use
in /tmp/path/some_foo.php on line 5
Call Stack:
0.0005 234520 1. {main}() /tmp/path/execute.php:0
0.0036 241464 2. spl_autoload_call() /tmp/path/execute.php:13
0.0036 241496 3. {closure:/tmp/path/execute.php:6-8}() /tmp/path/execute.php:0
0.0036 241624 4. spl_autoload() /tmp/path/execute.php:7
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=66773
--
Edit this bug report at https://bugs.php.net/bug.php?id=66773&edit=1