Edit report at http://bugs.php.net/bug.php?id=52061&edit=1
ID: 52061
Comment by: jsweeny at gmail dot com
Reported by: mail-phpbugs at fushigi dot de
Summary: memory_limit above 2G
Status: Assigned
Type: Bug
Package: Scripting Engine problem
Operating System: Linux/Centos-5
PHP Version: 5.2SVN-2010-06-12 (snap)
Assigned To: pajoye
Block user comment: N
Private report: N
New Comment:
I am having this same problem; but I'm running php version 5.1.6. I
have 12 GB of memory and am running 64-bit Linux. Why did you say that
version 5.1 was okay? Something about "walking in an error"?
If a fix was created for version 5.2, can one also be created for
version 5.1?
thanks!
Previous Comments:
------------------------------------------------------------------------
[2010-06-20 12:58:00] mail-phpbugs at fushigi dot de
i have testet it on my test machines and the memory limit is working
fine :)
thx for the quick fix :)
------------------------------------------------------------------------
[2010-06-19 22:48:39] felipe@php.net
This bug has been fixed in SVN.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
------------------------------------------------------------------------
[2010-06-19 22:47:27] felipe@php.net
Automatic comment from SVN on behalf of felipe
Revision: http://svn.php.net/viewvc/?view=revision&revision=300606
Log: - Fixed bug #52061 (memory_limit above 2G)
# MFH: zend_atol()
------------------------------------------------------------------------
[2010-06-12 02:56:41] mail-phpbugs at fushigi dot de
Description:
------------
PHP 5.2 doesn't coun't process memory_limit => 2048M in right way
in 32bit mode it works up to 4G, after that it would cause a fatal
error, this seems ok, because of the memory limitations of 32bit :)
in 64bit its a REAL BUG, because after 2047M the memory limit DOESN'T
MATCH, this means no memory limit is active !
as far as i have seen the memory limit for php51 isn't affectet this way
because it walks in an error as of 2GB
and it seems in php53 the problem is fixed, here i tried to set limits
up to 8GB and all worked fine.
The test script is from http://news.php.net/php.internals/48607 , but i
think is shows the problem very well :)
is it possible to fix this, so it will behave as php-5.3 ?
or have the same matching as in 32bit version, so there is a limit if
someone setting a too high value ?
i have found this problem as i wanted to get a customer from an old
php-5.2.13 32bit machine on a newer php-5.2.13 64bit machine :(
32bit 5.2:
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.1 / 0.2 MB
> 10000 - 1.294s: 166.7 / 177.5 MB
> 20000 - 2.453s: 333.2 / 355.1 MB
> 30000 - 3.988s: 499.7 / 532.4 MB
> 40000 - 5.700s: 666.3 / 709.5 MB
> 50000 - 7.614s: 832.8 / 886.9 MB
> 60000 - 9.838s: 999.3 / 1'064.0 MB
> 70000 - 11.592s: 1'165.9 / 1'241.3 MB
> 80000 - 12.943s: 1'332.4 / 1'418.6 MB
> 90000 - 19.795s: 1'498.9 / 1'595.7 MB
PHP Fatal error: Allowed memory size of -2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32
64bit 5.2:
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.1 / 0.2 MB
> 10000 - 0.110s: 167.0 / 177.8 MB
> 20000 - 0.221s: 333.8 / 355.1 MB
> 30000 - 0.335s: 500.5 / 532.2 MB
> 40000 - 0.449s: 667.3 / 709.7 MB
> 50000 - 0.560s: 834.1 / 887.1 MB
> 60000 - 0.672s: 1'000.9 / 1'064.2 MB
> 70000 - 0.782s: 1'167.7 / 1'241.7 MB
> 80000 - 0.891s: 1'334.5 / 1'418.8 MB
> 90000 - 1.000s: 1'501.3 / 1'596.0 MB
> 100000 - 1.109s: 1'668.1 / 1'773.3 MB
> 110000 - 1.219s: 1'834.9 / 1'950.4 MB
> 120000 - 1.328s: 2'001.7 / 2'127.5 MB
> 130000 - 1.436s: 2'168.5 / 2'304.9 MB
> 140000 - 1.543s: 2'335.3 / 2'482.2 MB
> 150000 - 1.651s: 2'502.1 / 2'659.3 MB
> 160000 - 1.758s: 2'668.9 / 2'836.6 MB
> 170000 - 1.864s: 2'835.7 / 3'013.7 MB
> 180000 - 1.969s: 3'002.5 / 3'190.9 MB
> 190000 - 2.079s: 3'169.3 / 3'368.2 MB
> 200000 - 2.189s: 3'336.0 / 3'545.5 MB
> 210000 - 2.300s: 3'502.8 / 3'722.6 MB
> 220000 - 2.411s: 3'669.6 / 3'900.0 MB
> 230000 - 2.519s: 3'836.4 / 4'077.1 MB
> 240000 - 2.628s: 4'003.2 / 4'254.2 MB
> 250000 - 2.737s: 4'170.0 / 4'431.5 MB
> 260000 - 2.845s: 4'336.8 / 4'608.6 MB
> 270000 - 2.953s: 4'503.6 / 4'786.0 MB
> 280000 - 3.061s: 4'670.4 / 4'963.3 MB
> 290000 - 3.169s: 4'837.2 / 5'140.4 MB
> 300000 - 3.277s: 5'004.0 / 5'317.5 MB
> 310000 - 3.384s: 5'170.8 / 5'494.9 MB
> 320000 - 3.490s: 5'337.6 / 5'672.0 MB
> 330000 - 3.596s: 5'504.4 / 5'849.3 MB
> 340000 - 3.703s: 5'671.2 / 6'026.6 MB
> 350000 - 3.809s: 5'838.0 / 6'203.7 MB
> 360000 - 3.914s: 6'004.8 / 6'380.9 MB
> 370000 - 4.019s: 6'171.6 / 6'558.2 MB
> 380000 - 4.124s: 6'338.3 / 6'735.3 MB
> 390000 - 4.231s: 6'505.1 / 6'912.4 MB
> 400000 - 4.342s: 6'671.9 / 7'089.8 MB
Cleaning up 200001 output handlers
Done, total time: 4.638s, peak mem: 6'671.9 / 7'089.8 MB
########## Other Versions ######################
32bit 5.1:
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.1 / 0.1 MB
> 10000 - 0.721s: 166.6 / 166.6 MB
> 20000 - 1.646s: 333.0 / 333.0 MB
> 30000 - 2.839s: 499.5 / 499.5 MB
> 40000 - 4.010s: 665.9 / 665.9 MB
> 50000 - 6.007s: 832.4 / 832.4 MB
> 60000 - 8.427s: 998.8 / 998.8 MB
> 70000 - 9.531s: 1'165.3 / 1'165.3 MB
> 80000 - 12.218s: 1'331.7 / 1'331.7 MB
> 90000 - 15.126s: 1'498.2 / 1'498.2 MB
> 100000 - 17.942s: 1'664.7 / 1'664.7 MB
Integer overflow in memory_limit check detected
64bit 5.1:
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.1 / 0.1 MB
> 10000 - 0.116s: 166.7 / 166.7 MB
> 20000 - 0.235s: 333.3 / 333.3 MB
> 30000 - 0.356s: 499.9 / 499.9 MB
> 40000 - 0.473s: 666.5 / 666.5 MB
> 50000 - 0.586s: 833.1 / 833.1 MB
> 60000 - 0.698s: 999.7 / 999.7 MB
> 70000 - 0.807s: 1'166.3 / 1'166.3 MB
> 80000 - 0.916s: 1'332.9 / 1'332.9 MB
> 90000 - 1.024s: 1'499.5 / 1'499.5 MB
> 100000 - 1.133s: 1'666.1 / 1'666.1 MB
Integer overflow in memory_limit check detected
32bit 5.3:
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.3 / 0.4 MB
> 10000 - 0.382s: 166.9 / 177.8 MB
> 20000 - 1.000s: 333.4 / 354.9 MB
> 30000 - 1.425s: 499.9 / 532.2 MB
> 40000 - 1.754s: 666.5 / 709.3 MB
> 50000 - 2.137s: 833.0 / 886.4 MB
> 60000 - 2.484s: 999.6 / 1'063.8 MB
> 70000 - 2.834s: 1'166.1 / 1'240.9 MB
> 80000 - 3.129s: 1'332.6 / 1'418.2 MB
> 90000 - 3.527s: 1'499.2 / 1'595.3 MB
PHP Fatal error: Allowed memory size of -2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32
64bit 5.3:
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.6 / 0.6 MB
> 10000 - 0.112s: 167.4 / 178.2 MB
> 20000 - 0.226s: 334.2 / 355.5 MB
> 30000 - 0.340s: 501.0 / 532.8 MB
> 40000 - 0.453s: 667.8 / 710.2 MB
> 50000 - 0.568s: 834.6 / 887.5 MB
> 60000 - 0.681s: 1'001.4 / 1'064.6 MB
> 70000 - 0.792s: 1'168.2 / 1'242.2 MB
> 80000 - 0.903s: 1'335.0 / 1'419.3 MB
> 90000 - 1.014s: 1'501.8 / 1'596.4 MB
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32
Test script:
---------------
<?php
ini_set("memory_limit", "2G");
function mib($b) {
return $b ? number_format($b/1024/1204, 1, ".", "'") : "?";
}
function mgu($r, $p = false) {
return mib($p ? memory_get_peak_usage($r) :
memory_get_usage($r));
}
function obs($i) {
global $start;
fprintf(STDERR, "> %6d - %6.3fs: %10s /%10s MB\n",
$i,
microtime(true)-$start,
mgu(false), mgu(true)
);
}
$loop = 400000;
$data = str_repeat(" ", 0x3fff);
fprintf(STDERR, "Running %d times with a %d bytes long string
('%s...')\n",
$loop,
strlen($data),
substr($data, 0, 3)
);
$start = microtime(true);
for ($i = 0; $i < $loop; ++$i) {
ob_start();
echo $data;
if (!($i % 10000)) {
obs($i);
}
if ($i % 2) {
ob_flush();
} elseif ($i) {
ob_end_clean();
}
}
obs($i);
fprintf(STDERR, "\nCleaning up %d output handlers\n",
ob_get_level()
);
while(ob_get_level())
ob_end_clean();
fprintf(STDERR, "Done, total time: %6.3fs, peak mem: %s / %s MB\n",
microtime(true)-$start,
mgu(false, true), mgu(true, true)
);
?>
Expected result:
----------------
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.1 / 0.2 MB
> 10000 - 0.110s: 167.0 / 177.8 MB
> 20000 - 0.221s: 333.8 / 355.1 MB
> 30000 - 0.335s: 500.5 / 532.2 MB
> 40000 - 0.449s: 667.3 / 709.7 MB
> 50000 - 0.560s: 834.1 / 887.1 MB
> 60000 - 0.672s: 1'000.9 / 1'064.2 MB
> 70000 - 0.782s: 1'167.7 / 1'241.7 MB
> 80000 - 0.891s: 1'334.5 / 1'418.8 MB
> 90000 - 1.000s: 1'501.3 / 1'596.0 MB
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32
Actual result:
--------------
Running 400000 times with a 16383 bytes long string (' ...')
> 0 - 0.000s: 0.1 / 0.2 MB
> 10000 - 0.110s: 167.0 / 177.8 MB
> 20000 - 0.221s: 333.8 / 355.1 MB
> 30000 - 0.335s: 500.5 / 532.2 MB
> 40000 - 0.449s: 667.3 / 709.7 MB
> 50000 - 0.560s: 834.1 / 887.1 MB
> 60000 - 0.672s: 1'000.9 / 1'064.2 MB
> 70000 - 0.782s: 1'167.7 / 1'241.7 MB
> 80000 - 0.891s: 1'334.5 / 1'418.8 MB
> 90000 - 1.000s: 1'501.3 / 1'596.0 MB
> 100000 - 1.109s: 1'668.1 / 1'773.3 MB
> 110000 - 1.219s: 1'834.9 / 1'950.4 MB
> 120000 - 1.328s: 2'001.7 / 2'127.5 MB
> 130000 - 1.436s: 2'168.5 / 2'304.9 MB
> 140000 - 1.543s: 2'335.3 / 2'482.2 MB
> 150000 - 1.651s: 2'502.1 / 2'659.3 MB
> 160000 - 1.758s: 2'668.9 / 2'836.6 MB
> 170000 - 1.864s: 2'835.7 / 3'013.7 MB
> 180000 - 1.969s: 3'002.5 / 3'190.9 MB
> 190000 - 2.079s: 3'169.3 / 3'368.2 MB
> 200000 - 2.189s: 3'336.0 / 3'545.5 MB
> 210000 - 2.300s: 3'502.8 / 3'722.6 MB
> 220000 - 2.411s: 3'669.6 / 3'900.0 MB
> 230000 - 2.519s: 3'836.4 / 4'077.1 MB
> 240000 - 2.628s: 4'003.2 / 4'254.2 MB
> 250000 - 2.737s: 4'170.0 / 4'431.5 MB
> 260000 - 2.845s: 4'336.8 / 4'608.6 MB
> 270000 - 2.953s: 4'503.6 / 4'786.0 MB
> 280000 - 3.061s: 4'670.4 / 4'963.3 MB
> 290000 - 3.169s: 4'837.2 / 5'140.4 MB
> 300000 - 3.277s: 5'004.0 / 5'317.5 MB
> 310000 - 3.384s: 5'170.8 / 5'494.9 MB
> 320000 - 3.490s: 5'337.6 / 5'672.0 MB
> 330000 - 3.596s: 5'504.4 / 5'849.3 MB
> 340000 - 3.703s: 5'671.2 / 6'026.6 MB
> 350000 - 3.809s: 5'838.0 / 6'203.7 MB
> 360000 - 3.914s: 6'004.8 / 6'380.9 MB
> 370000 - 4.019s: 6'171.6 / 6'558.2 MB
> 380000 - 4.124s: 6'338.3 / 6'735.3 MB
> 390000 - 4.231s: 6'505.1 / 6'912.4 MB
> 400000 - 4.342s: 6'671.9 / 7'089.8 MB
Cleaning up 200001 output handlers
Done, total time: 4.638s, peak mem: 6'671.9 / 7'089.8 MB
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=52061&edit=1