Bug #77649 [Opn]: preload: Can't preload class %s with unresolved initializer for constant
| From: | nikic@php.net | Date: | Fri, 22 Feb 2019 16:21:58 +0000 |
| Subject: | Bug #77649 [Opn]: preload: Can't preload class %s with unresolved initializer for constant | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-219707@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=77649&edit=1
ID: 77649
Updated by: nikic@php.net
Reported by: mberchtold at gmail dot com
Summary: preload: Can't preload class %s with unresolved
initializer for constant
Status: Open
Type: Bug
Package: opcache
Operating System: Windows 10 x64
PHP Version: master-Git-2019-02-21 (snap)
-Assigned To:
+Assigned To: dmitry
Block user comment: N
Private report: N
New Comment:
Ah wait, I see it now. There's another warning on Windows:
Warning: Can't preload unlinked class Zend\Db\Sql\Join at
D:\htdocs\zend-db-master\src\Sql\Join.php:25 in Unknown on line 0
And this is the class declaration: https://github.com/zendframework/zend-db/blob/master/src/Sql/Join.php#L25
I guess that we don't support linking of internal classes on Windows due to ASLR issues.
Previous Comments:
------------------------------------------------------------------------
[2019-02-22 16:15:51] nikic@php.net
So, good news is that I can indeed reproduce this on Windows. However, I can't debug it there,
and it doesn't repro on Ubuntu. Not immediately obvious to me why this would be OS dependent
either.
------------------------------------------------------------------------
[2019-02-22 15:55:44] mberchtold at gmail dot com
Let me help you with this:
1. Use PHP on Windows 10 64-bit
2. Download the latest snap (today) from here: https://windows.php.net/downloads/snaps/master/r7cf177c/php-master-nts-windows-vc15-x64-avx-r7cf177c.zip
3. Create a file called preload.php and use the code from the script in this bug report.
4. Download zend-db from here: https://codeload.github.com/zendframework/zend-db/zip/master
and extract the zip
5. Change the $basedirectory in the preload.php pointing to correct location of the zend-db in 4.
6. change php ini values:
opcache.enable_cli=1
opcache.preload=preload.php
7. run php.exe
------------------------------------------------------------------------
[2019-02-22 08:25:16] nikic@php.net
I'm not able to reproduce this.
------------------------------------------------------------------------
[2019-02-21 22:33:21] mberchtold at gmail dot com
Description:
------------
This is related to the bug that was reported (and fixed) here:
https://bugs.php.net/bug.php?id=77643
Basically I'm trying to preload some parts of zend framework 3 and the following warning is
logged:
PHP Warning: Can't preload class Zend\Db\Sql\Select with unresolved initializer for constant
JOIN_LEFT_OUTER at vendor\zendframework\zend-db\src\Sql\Select.php:21 in Unknown on line 0
The constant is defined as following in Select.php
const JOIN_LEFT_OUTER = Join::JOIN_LEFT_OUTER;
where JOIN_LEFT_OUTER is defined in Join.php:
const JOIN_LEFT_OUTER = 'left outer';
Test script:
---------------
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.preload={PWD}/preload_undef_const_5.inc
preload_undef_const_5.inc:
<?php
$basedirectory = 'C:/test/';
// dependent classes
opcache_compile_file($basedirectory . 'vendor/zendframework/zend-db/src/Sql/Join.php');
opcache_compile_file($basedirectory .
'vendor/zendframework/zend-db/src/Sql/AbstractPreparableSql.php');
opcache_compile_file($basedirectory .
'vendor/zendframework/zend-db/src/Sql/AbstractSql.php');
opcache_compile_file($basedirectory .
'vendor/zendframework/zend-db/src/Sql/SqlInterface.php');
opcache_compile_file($basedirectory .
'vendor/zendframework/zend-db/src/Sql/PreparableSqlInterface.php');
opcache_compile_file($basedirectory .
'vendor/zendframework/zend-db/src/Sql/Platform/PlatformDecoratorInterface.php');
// actual class
opcache_compile_file($basedirectory . 'vendor/zendframework/zend-db/src/Sql/Select.php');
Expected result:
----------------
no warning
Actual result:
--------------
PHP Warning: Can't preload class Zend\Db\Sql\Select with unresolved initializer for constant
JOIN_LEFT_OUTER at vendor\zendframework\zend-db\src\Sql\Select.php:21 in Unknown on line 0
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=77649&edit=1