A few months back i submitted a bug report #21855 and forgotten about it.

In short ...certain complex enough scripts would cause PHP to crash and burn
on HPUX. The gdb backtraces and the fault generated seemed to indicate that
memory access was beging performed in the guard pages located just beyond
stack limits.

The bug has been fixed in our HP Apache distribution for sometime now. 

The Problem:
 HPUX has a default thread stack limit pitched at 64k on PARISC and 256k on
Itanium. For sufficiently complex scripts, I measured and found that PHP's
execution engine (execute() in zend_engine.c ) gets recursive and consumes
more than this default stack limit. The reason being that dynamic memory
allocation (for the opcodes?)is done on the stack instead of heap (for
performance reasons I guess).

This has showed up on HPUX easily perhaps due to its relatively smaller
default stack size. But in any case one cant count on PHP to be under the
stack limit 
for "sufficiently complex" scripts on any OS as such which i beleive is
typically is KiloBytes. Increasing thread stack size at thread creation time
only (in apache)
delays the onset of problem and wastes memory for Apache threads that are
not
servicing PHP requests. 

Solution:
  Allocate from the heap, and take the performance hit.


********************************
<<< file 1: zend_execute.c
>>> file 2: fixed_zend_execute.c
********************************
-----[1015 changed to 1015]-----
<       EX(Ts) = (temp_variable *)
do_alloca(sizeof(temp_variable)*op_array->T);
---
>       EX(Ts) = (temp_variable *)
emalloc(sizeof(temp_variable)*op_array->T);
-----[1711 changed to 1711]-----
<                                       free_alloca(EX(Ts));
---
>                                       efree(EX(Ts));

--Roshan

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to