Re: [PHP-DEV] Needs some clarification on static zend_string vs zend_new_interned_string (php internals).
[email protected] (Alex Pătrănescu)
| Newsgroups | php.internals |
|---|---|
| Message-ID | <CAAwdEzBFm-avqwFO=H-jWYtQdfDErq-ae-2qZGq6TGpGQjeTFg@mail.gmail.com> |
Hi David, On Wed, Sep 16, 2026 at 4:16 PM David Maye Kitenge <[email protected]> wrote: > Hello everyone, > > My name is David. I'm working on the refactoring of a PHP extension from > "Zephir" language to a cleaner C language output. > > I came across the fact that the extension uses a lot of "static" > zend_string. No I want to convert those static zend_string into the > intern string. > > From what I read today based on PHP internal book website and PHP Source > online, calling a Zen's new interest string function create a string whose > value is registered into a hash table. And then on a request in it this or > that send interned string is then retrieved from the hash table instead of > creating a new Zen string. Apart from the fact that every every news and > intern strings have an immutable ref count. > > My doubt is the following: > > * Does ref counting increments/decrements when you create a Zend string > using the static keyword? > static applies to the C variable, not the string’s reference-counting behaviour. A string held in static zend_string *s is still normally refcounted unless it is interned. > * Assigning a new zend_string as interned zend_string, when the flag > "IS_Interned_STRING" (if I remember correctly), the string is kinda garbage > collected? (Do I need to free the string)? > An actually interned string is managed by Zend/OPcache. The string copy/release helpers leave its refcount unchanged, and you should not free it directly. To convert an existing string you own: `s = zend_new_interned_string(s);` Store the returned pointer, and the function will release the original string and return an existing interned one. Do not separately release the old pointer. But, you should still use `zend_string_release(s)` when finished with your owned reference. It is a no-op for interned strings, but handles non-interned results, which these APIs can return with OPcache during a request. For fixed extension strings needed across requests, initialize them during normal module startup (MINIT): `s = zend_string_init_interned("example", sizeof("example") - 1, true);` Strings interned during a request are not necessarily permanent; storing their pointer in a static variable does not extend their lifetime. Regards, -- Alex >