Re: How to create Persistent zval?
| From: | Lin Yo-An | Date: | Sat, 18 Jan 2014 19:52:47 +0000 |
| Subject: | Re: How to create Persistent zval? | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-71250@lists.php.net to get a copy of this message | ||
Daniel Lowrey <rdlowrey@php.net> 於 2014年1月19日星期日寫道:
> >> Hello,
> >>
> >> I am trying to store a zval object into the persistent list in zend VM..
> >> (Using EG(persistent_list) and zend_rscd_list_entry)
> >>
> >> Which works fine if I store/fetch the zval in the same request context..
> >>
> >> But it seems that zend engine cleans up the zval object after the
> request,
> >> when the next request comes, the fetched list entry points to a freed
> zval
> >> address and it makes php segmentationfault. I guess zval is allocated by
> >> emalloc, so I cant keep it cross requests?
>
> > For persistent alloc, you should use pemalloc() , which is just a
> > wrapper leading to libc's malloc.
> > If you use emalloc() , the Zend Memory Manager will free the storage
> > at the end of the request, thus leading to use-after-free crash if you
> > reuse your pointer on a next request.
>
> --- Disclaimer ---
> I'm passing this along; Joe is having technical difficulties and asked for
> help sending this to the list. I provide no warranties or refunds ;)
> ---
>
> All zvals passed into the engine must be allocated by the mm, you cannot
> pemalloc anything and pass it into the engine safely.
>
> You don't want to store a persistent zval, you want to store a persistent
> resource entry, which should be allocated with pemalloc(size, 1)
>
> The reason for this is when cleaning up, the engine has no means by which
> to tell if a zval has been pemalloc or emalloc'd, zval_ptr_dtor works the
> same for everything.
Thank you so much! That is what i was guessing.. - ref cnt and pemalloc
does not work for persistent zval.
And zend engine cleans up zvals at the end of request no matter the ref cnt
is?
so zval is not persistent, then is HashTable persistent?
It's because I need to store a zval object which has several properties.
Is there a way to do make the object persistent? Or do i need to serialize
it just like apc?
> Cheers
> Joe
>
--
Best Regards,
Yo-An Lin