|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-01-06 09:09 UTC] sskaje at gmail dot com
Description:
------------
Linux/CentOS 5.5 x86_64
PHP 5.3.4
Apache 2.2.16
Tested and can be reproduced under Apache httpd + mod_php5/nginx+fastcgi.
Ok under CLI(at least cant be reproduced under cli.)
I tested a script like below, which was simplified to the minimal.
I was about to dump something, then wrote a var_dump() with an exit;, then i found the php results a fatal error like:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1702113144 bytes) in Unknown on line 0 ...
then In apache error log:
PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0
Apache httpd/nginx usually gives *no response* to the http get request.
check the following code:
uncomment:
1st __halt_compiler(); .... OK
2nd __halt_compiler(); .... BAD
then exchange the lines of definitions of class a and b, uncomment:
1st __halt_compiler(); .... OK
2nd __halt_compiler(); .... OK
only in 5.3.4, works perfectly in 5.3.3.
Test script:
---------------
<?php
echo 'a';
exit;
#__halt_compiler();
class a extends b{}
class b{}
#__halt_compiler();
#new a;
Expected result:
----------------
a
Actual result:
--------------
error like
[quote]
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1702113144 bytes) in Unknown on line 0 ...
then In apache error log:
PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0
Apache httpd/nginx usually gives *no response* to the http get request.
[/quote]
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 16:00:01 2025 UTC |
The original script is like <?php require(__DIR__ . '/blahsparent.php'); class blahblah extends blahsparent { } new blahblah; only if __halt_compiler(); was added before the line of 'class ....', error would not be triggered.@Stas: I upgrade my php to 5.3.5 and the memory allocation message disappeared while a *no response* request still exists. php scripts: [root@dev test]# more test*.php > /tmp/php.txt [root@dev test]# cat /tmp/php.txt :::::::::::::: test1.php :::::::::::::: <?php echo 'a'; exit; require(__DIR__ . '/Controller.php'); class test extends TestController { public function action() { $this->output = 'Hello'; $this->display('raw'); } } new test; :::::::::::::: test2.php :::::::::::::: <?php echo 'a'; exit; __halt_compiler(); require(__DIR__ . '/Controller.php'); class test extends TestController { public function action() { $this->output = 'Hello'; $this->display('raw'); } } new test; :::::::::::::: test3.php :::::::::::::: <?php echo 'a'; exit; require(__DIR__ . '/Controller.php'); __halt_compiler(); class test extends TestController { public function action() { $this->output = 'Hello'; $this->display('raw'); } } new test; :::::::::::::: test4.php :::::::::::::: <?php echo 'a'; exit; require(__DIR__ . '/Controller.php'); class test extends TestController { public function action() { $this->output = 'Hello'; $this->display('raw'); } } __halt_compiler(); new test; ============== Controller.php: [root@dev test]# more Controller.php <?php /** * 业务 TestController * */ require(__DIR__ . '/../ControllerBase.php'); abstract class TestController extends ControllerBase { public function __construct() { # 禁用 GPC $this->diable_gpc(); $this->checkPara(); $this->action(); } public function __destruct() { if (!empty($this->output)) { # 默认输出 $this->display(); unset($this->output); } } } # EOF ========================== Results: test1.php: no http response returned. test2.php: http 200 and an output of 'a' test3.php: same as test2.php test4.php: same as test1.phpWhats' more, script without the echo...exit stuff like : :::::::::::::: test.php :::::::::::::: <?php require(__DIR__ . '/Controller.php'); class test extends TestController { public function action() { $this->output = 'Hello'; $this->display('raw'); } } new test; works perfectly. die('a') performs as same as the echo...exit.