From: nickj-phpbugs at nickj dot org
Operating system: Debian Woody GNU/Linux 3.0r6
PHP version: 5CVS-2005-07-08 (dev)
PHP Bug Type: Date/time related
Bug description: Memory leak, possibly in date/time related code.
Description:
------------
Encountering a memory leak, possibly in date/time related code.
Running this script:
=================================================================
<?php
// tell us about all errors.
error_reporting(E_ALL);
define ("START_YEAR", 1971);
define ("END_YEAR", 2038);
function test_strtotime($request) {
for ($i=1; ; $i++) {
// start at year START_YEAR, bail out at year END_YEAR
$tStamp = mktime (17,17,17,1,$i,START_YEAR);
if (date("Y", $tStamp) == END_YEAR) break;
$strtotime_timestamp = strtotime ($request, $tStamp);
if (strftime("%r %B %d %Y", $strtotime_timestamp) != date ("h:i:s A F
d Y", $strtotime_timestamp)) {
print "Mismatch: $i $tStamp\n";
}
}
}
$days = array ("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday");
for ($i=1; $i<500; $i++) {
putenv("TZ=Australia/Sydney");
foreach ($days as $day) {
test_strtotime($day);
}
}
?>
=================================================================
What's different to various other scripts I've run before to test
date/time code is this line:
> if (strftime("%r %B %d %Y", $strtotime_timestamp) != date ("h:i:s A F d
Y", $strtotime_timestamp))
So, something about this may possibly be the culprit.
Here's what I see on a Linux box whilst running this:
=================================================================
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:46:29 EST 2005
total used free shared buffers cached
Mem: 452324 449108 3216 0 13016 325608
-/+ buffers/cache: 110484 341840
Swap: 787144 0 787144
root 1906 99.9 9.7 46796 44012 ttyp1 R+ 15:46 0:15
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:46:37 EST 2005
total used free shared buffers cached
Mem: 452324 449516 2808 0 9904 307260
-/+ buffers/cache: 132352 319972
Swap: 787144 0 787144
root 1906 99.9 14.5 68728 65944 ttyp1 R+ 15:46 0:23
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:46:52 EST 2005
total used free shared buffers cached
Mem: 452324 449276 3048 0 6160 270252
-/+ buffers/cache: 172864 279460
Swap: 787144 0 787144
root 1906 99.9 23.6 109604 106820 ttyp1 R+ 15:46 0:38
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:47:23 EST 2005
total used free shared buffers cached
Mem: 452324 448996 3328 0 4920 190460
-/+ buffers/cache: 253616 198708
Swap: 787144 64 787080
root 1906 99.9 41.5 190912 188132 ttyp1 R+ 15:46 1:09
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
root 1922 0.0 0.0 1344 440 ttyp0 R+ 15:47 0:00 grep php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:47:36 EST 2005
total used free shared buffers cached
Mem: 452324 449316 3008 0 4872 159064
-/+ buffers/cache: 285380 166944
Swap: 787144 64 787080
root 1906 99.9 48.7 223104 220320 ttyp1 R+ 15:46 1:22
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:48:26 EST 2005
total used free shared buffers cached
Mem: 452324 449508 2816 0 1036 35880
-/+ buffers/cache: 412592 39732
Swap: 787144 64 787080
root 1906 99.9 78.3 357200 354420 ttyp1 R+ 15:46 2:13
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
root 1930 0.0 0.0 1344 444 ttyp0 S+ 15:48 0:00 grep php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 15:48:56 EST 2005
total used free shared buffers cached
Mem: 452324 448796 3528 0 80 8272
-/+ buffers/cache: 440444 11880
Swap: 787144 75912 711232
root 1906 99.9 81.1 435200 366960 ttyp1 R+ 15:46 2:41
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
root 1934 0.0 0.0 1344 444 ttyp0 S+ 15:49 0:00 grep php
ludo:~/tmp/php-5.1-dev# date; free; ps auxw | grep php
Fri Jul 8 16:00:25 EST 2005
total used free shared buffers cached
Mem: 452324 449584 2740 0 80 1076
-/+ buffers/cache: 448428 3896
Swap: 787144 787144 0
root 1906 42.7 95.1 1216916 430252 ttyp1 T 15:46 7:40
/root/tmp/php-5.1-dev/php5-200507080430/sapi/cli/php
./poss-memory-leak.php
root 1957 0.0 0.0 1348 320 ttyp0 S+ 16:01 0:00 grep php
=================================================================
After 14 minutes the box was thrashing to disk and was extremely slow to
respond. Suspending the script (ctrl-Z), and checking the output of 'top'
showed that php was using around a gigabyte of RAM:
=================================================================
Tasks: 40 total, 2 running, 37 sleeping, 1 stopped, 0 zombie
Cpu(s): 0.3% us, 0.0% sy, 0.0% ni, 97.3% id, 2.3% wa, 0.0% hi, 0.0%
si
Mem: 452324k total, 446624k used, 5700k free, 448k buffers
Swap: 787144k total, 787144k used, 0k free, 5008k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1906 root 18 0 1188m 419m 4200 T 0.0 95.0 7:40.77 php
2398 root 16 0 1788 960 1664 R 0.0 0.2 0:00.06 top
861 root 16 0 6460 592 6016 R 0.0 0.1 0:03.96 sshd
877 root 16 0 2244 424 2080 S 0.0 0.1 0:01.67 bash
[ ... snip ... ]
=================================================================
And when left running, it eventually gives out-of-memory messages like
this in the kernel log:
=================================================================
Jul 7 17:49:37 ludo kernel: Out of Memory: Killed process 818 (apache).
Jul 7 17:50:25 ludo kernel: Out of Memory: Killed process 819 (apache).
Jul 7 17:53:34 ludo kernel: Out of Memory: Killed process 861 (apache).
Jul 7 17:57:50 ludo kernel: Out of Memory: Killed process 573 (mysqld).
Jul 7 17:57:50 ludo kernel: Out of Memory: Killed process 575 (mysqld).
Jul 7 17:57:50 ludo kernel: Out of Memory: Killed process 576 (mysqld).
Jul 7 17:57:50 ludo kernel: Out of Memory: Killed process 577 (mysqld).
Jul 7 18:02:58 ludo kernel: Out of Memory: Killed process 1284 (apache).
Jul 7 18:03:17 ludo kernel: Out of Memory: Killed process 1285 (apache).
Jul 7 18:03:23 ludo kernel: Out of Memory: Killed process 1259 (php).
=================================================================
--
Edit bug report at http://bugs.php.net/?id=33614&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=33614&r=trysnapshot4
Try a CVS snapshot (php5.0):
http://bugs.php.net/fix.php?id=33614&r=trysnapshot50
Try a CVS snapshot (php5.1):
http://bugs.php.net/fix.php?id=33614&r=trysnapshot51
Fixed in CVS: http://bugs.php.net/fix.php?id=33614&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=33614&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=33614&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=33614&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=33614&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=33614&r=support
Expected behavior: http://bugs.php.net/fix.php?id=33614&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=33614&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=33614&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=33614&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=33614&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=33614&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=33614&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=33614&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=33614&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=33614&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=33614&r=mysqlcfg