Edit report at http://bugs.php.net/bug.php?id=53663&edit=1
ID: 53663
Comment by: sskaje at gmail dot com
Reported by: sskaje at gmail dot com
Summary: fatal error with bad memory allocation in a script
echo & exit
Status: Open
Type: Bug
Package: Scripting Engine problem
Operating System: Linux/CentOS
PHP Version: 5.3.4
Block user comment: N
Private report: N
New Comment:
Whats' 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.
Previous Comments:
------------------------------------------------------------------------
[2011-01-17 04:42:43] sskaje at gmail dot com
@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.php
------------------------------------------------------------------------
[2011-01-16 22:09:33] [email protected]
Could you please post exact script that doesn't work? I tried some
permutations of uncommenting stuff in your example and no one of them
led to the error.
------------------------------------------------------------------------
[2011-01-06 09:17:17] sskaje at gmail dot com
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.
------------------------------------------------------------------------
[2011-01-06 09:13:04] sskaje at gmail dot com
In fact, there are also error logs in httpd error-log:
[Thu Jan 06 15:15:41 2011] [error] [client 172.16.1.123] PHP Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 543450464 bytes) in Unknown on line 0
[Thu Jan 06 15:16:27 2011] [error] [client 172.16.1.123] PHP Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 1735355393 bytes) in Unknown on line 0
[Thu Jan 06 15:16:27 2011] [error] [client 172.16.1.123] PHP Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 1999598178 bytes) in Unknown on line 0
[Thu Jan 06 15:16:27 2011] [error] [client 172.16.1.123] PHP Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 1999598178 bytes) in Unknown on line 0
[Thu Jan 06 15:16:27 2011] [error] [client 172.16.1.123] PHP Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 1999598178 bytes) in Unknown on line 0
[Thu Jan 06 15:16:28 2011] [error] [client 172.16.1.123] PHP Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 1999598178 bytes) in Unknown on line 0
And the 'PHP Fatal error: Exception thrown without a stack frame in
Unknown on line 0' might not be logged by this test script.
Sorry.
------------------------------------------------------------------------
[2011-01-06 09:09:45] 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]
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=53663&edit=1