<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>#externals</title><link>https://externals.io</link><description>Opening PHP's #internals to the outside</description><pubDate>Fri, 18 Sep 2026 02:10:47 +0000</pubDate><lastBuildDate>Fri, 18 Sep 2026 02:10:47 +0000</lastBuildDate><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132529</link><description>&lt;p&gt;I have noticed that my previous emails haven't received a response, and I &lt;br&gt;
want to address this openly with everyone here.&lt;/p&gt;
&lt;p&gt;I sincerely apologize for my recent behavior. As the first contributor from &lt;br&gt;
Iran, reaching this point felt like overcoming impossible odds. Achieving &lt;br&gt;
this level here is incredibly difficult—between the challenging educational &lt;br&gt;
landscape, the lack of standard paths or certifications for PHP, and the &lt;br&gt;
limited access to hands-on professional environments, getting to contribute &lt;br&gt;
to the core is like climbing a mountain ten times over.&lt;/p&gt;
&lt;p&gt;Because of this intense pressure, I lost my perspective. It was not my &lt;br&gt;
intention to be difficult or aggressive. I ask you to please look at me &lt;br&gt;
again as the Sepehr who first joined this community—eager and ready to &lt;br&gt;
learn. I was wrong, and I am truly sorry.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5u7aRV1Hm2OuR-hsFfTfqDwUNcmtB5nHkG4Rz4xcLhSjg@mail.gmail.com</guid><pubDate>Thu, 17 Sep 2026 23:30:41 +0000</pubDate></item><item><title>[PHP DEV] [Discussion] Native terminal helpers for PHP CLI</title><link>https://externals.io/message/132528</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Curious what you and others think on whether this makes sense as an RFC &lt;br&gt;
direction for 8.7, or if there are particular areas you would want &lt;br&gt;
adjusted &lt;br&gt;
first?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don't understand much about the problem you're tackling, so I can't &lt;br&gt;
meaningfully comment on if the API makes sense on a &amp;quot;high level&amp;quot; domain &lt;br&gt;
specific perspective. However for the API to become a first class &lt;br&gt;
citizen some changes will need to be made:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;With the new polling API introducing the Io namespace, the &lt;br&gt;
functionality should likely be provided as Io\Terminal. Grouping it &lt;br&gt;
under Io makes sense to me and avoids reserving another top-level name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Classes are not namespaces: Static methods that are not named &lt;br&gt;
constructors should be free-standing functions. Thus &lt;br&gt;
Io\Terminal\enable_ansi(), Io\Terminal\set_title(), etc. Alternatively &lt;br&gt;
since they almost all seem to take the &amp;quot;file descriptor&amp;quot; as the first &lt;br&gt;
argument, they could also be instance methods on an Io\Terminal\Terminal &lt;br&gt;
class that receives the terminal handle in the constructor. I leave it &lt;br&gt;
up to the domain experts to decide what makes more sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The enums should be unbacked. A backed enum is almost always the &lt;br&gt;
wrong design decision, since there is rarely a single canonical and &lt;br&gt;
obviously correct scalar representation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>dcdcffe45328f478facfcf0d35a3e13f@bastelstu.be</guid><pubDate>Thu, 17 Sep 2026 17:03:42 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132527</link><description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;Following the recent discussions, I have decided to withdraw the &lt;br&gt;
array_str_contains RFC. I will be closing the corresponding PR shortly.&lt;/p&gt;
&lt;p&gt;I would like to thank those who provided constructive feedback. I intend to &lt;br&gt;
take some time to refine my approach and hope to contribute more useful &lt;br&gt;
features and cleaner implementations to the project in the future.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5vhK8wBWuakFXZw=jYHTicNe1iHNcOHrAOUW1-NM9bzWA@mail.gmail.com</guid><pubDate>Thu, 17 Sep 2026 16:11:58 +0000</pubDate></item><item><title>[PHP DEV] [Discussion] Native terminal helpers for PHP CLI</title><link>https://externals.io/message/132526</link><description>&lt;p&gt;Ah got it, thanks for pointing out the 8.7 timeline Larry.&lt;/p&gt;
&lt;p&gt;On the PECL to core transition, I personally lean toward sooner if people &lt;br&gt;
see value in it, mostly so internals can help shape the API early before &lt;br&gt;
conventions get locked in userland. For anyone curious to test or poke &lt;br&gt;
around the code, the repository is here: &lt;br&gt;
&lt;a href="https://github.com/prateekbhujel/php-terminal" rel="nofollow" target="_blank"&gt;https://github.com/prateekbhujel/php-terminal&lt;/a&gt; &lt;br&gt;
Any PRs, feedback, or design critiques are more than welcome.&lt;/p&gt;
&lt;p&gt;Curious what you and others think on whether this makes sense as an RFC &lt;br&gt;
direction for 8.7, or if there are particular areas you would want adjusted &lt;br&gt;
first?&lt;/p&gt;
&lt;p&gt;Pratik&lt;/p&gt;
</description><guid>CA+9BsNfLjj-KHUxRvNg-ay_Ph9VVoXCN7ZgXAXozSDAgjjTWJA@mail.gmail.com</guid><pubDate>Thu, 17 Sep 2026 15:30:39 +0000</pubDate></item><item><title>[PHP DEV] [Discussion] Native terminal helpers for PHP CLI</title><link>https://externals.io/message/132525</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi Derick,&lt;/p&gt;
&lt;p&gt;Wanted to share a quick update since June.&lt;/p&gt;
&lt;p&gt;I ended up implementing your stream suggestions in the v0.6.0 and &lt;br&gt;
v0.7.0 releases. All methods now accept native stream resources (like &lt;br&gt;
STDIN, STDOUT, STDERR, and php:// streams) directly alongside the &lt;br&gt;
enums. I also published it to Packagist, and installing through PIE &lt;br&gt;
works cleanly now. I also added prebuilt Windows x64 DLLs to the &lt;br&gt;
releases so folks on Windows can test without compiling from source.&lt;/p&gt;
&lt;p&gt;My main motivation is still Windows CLI support. Tools like Laravel &lt;br&gt;
Prompts and Symfony Console still drop into dumb text fallbacks on &lt;br&gt;
Windows simply because core has no native raw mode or single key &lt;br&gt;
reading primitives.&lt;/p&gt;
&lt;p&gt;Now that the PIE package is working across Linux, macOS, and Windows, I &lt;br&gt;
wanted to check if you think this is worth bringing up as an RFC for &lt;br&gt;
8.5 or 8.6, or if it is better to keep gathering feedback through PIE &lt;br&gt;
first?&lt;/p&gt;
&lt;p&gt;Thanks, &lt;br&gt;
Pratik&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At this point it would be an RFC for 8.7, as 8.5 is already released and 8.6 is frozen.&lt;/p&gt;
&lt;p&gt;As I've not used it yet I cannot speak to when an RFC would be appropriate.  However, I will note that libraries moving from PECL to php-src in the past have often undergone changes in the process, so they're not a direct transfer/rename.  Whether that is an argument to move it to core sooner or later I leave as an exercise for the reader.  (I could likely argue either way, really.)&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
</description><guid>093eeed3-9bcf-4797-a77b-6020923bae5a@app.fastmail.com</guid><pubDate>Thu, 17 Sep 2026 13:58:44 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132524</link><description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I’m writing this because I feel it’s important to address the recent &lt;br&gt;
friction. First and foremost, I want to sincerely apologize to the whole &lt;br&gt;
internals community, and specifically to Larry Garfield.&lt;/p&gt;
&lt;p&gt;As an aspiring contributor from Iran, I didn't fully understand the &lt;br&gt;
community norms, etiquette, and the weight of the processes here, which led &lt;br&gt;
to some misunderstandings and behavior that I now realize was &lt;br&gt;
inappropriate. I deeply regret any disruption I’ve caused to your valuable &lt;br&gt;
time and workflow.&lt;/p&gt;
&lt;p&gt;I genuinely care about PHP and the work you all do. I hope you can accept &lt;br&gt;
my apology. I promise to step back, reflect, and learn from this. I want to &lt;br&gt;
show that I am capable of being a respectful and constructive member of &lt;br&gt;
this community.&lt;/p&gt;
&lt;p&gt;Thank you for your patience and for hearing me out. I would appreciate it &lt;br&gt;
if you could share your valuable feedback and advice on how I can improve &lt;br&gt;
and move forward.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5uxyJzkSCPRd7XvhNWfdvS0OBOJFObkqDEH4+8NrpraoQ@mail.gmail.com</guid><pubDate>Thu, 17 Sep 2026 08:55:26 +0000</pubDate></item><item><title>[PHP DEV] [Discussion] Native terminal helpers for PHP CLI</title><link>https://externals.io/message/132523</link><description>&lt;p&gt;Hi Derick,&lt;/p&gt;
&lt;p&gt;Wanted to share a quick update since June.&lt;/p&gt;
&lt;p&gt;I ended up implementing your stream suggestions in the v0.6.0 and v0.7.0 &lt;br&gt;
releases. All methods now accept native stream resources (like STDIN, &lt;br&gt;
STDOUT, STDERR, and php:// streams) directly alongside the enums. I also &lt;br&gt;
published it to Packagist, and installing through PIE works cleanly now. I &lt;br&gt;
also added prebuilt Windows x64 DLLs to the releases so folks on Windows &lt;br&gt;
can test without compiling from source.&lt;/p&gt;
&lt;p&gt;My main motivation is still Windows CLI support. Tools like Laravel Prompts &lt;br&gt;
and Symfony Console still drop into dumb text fallbacks on Windows simply &lt;br&gt;
because core has no native raw mode or single key reading primitives.&lt;/p&gt;
&lt;p&gt;Now that the PIE package is working across Linux, macOS, and Windows, I &lt;br&gt;
wanted to check if you think this is worth bringing up as an RFC for 8.5 or &lt;br&gt;
8.6, or if it is better to keep gathering feedback through PIE first?&lt;/p&gt;
&lt;p&gt;Thanks, &lt;br&gt;
Pratik&lt;/p&gt;
</description><guid>CA+9BsNe_ejZT3mWDaRVF1U6Fx3A6zVYm4cvoYmw0TRF65eHxKQ@mail.gmail.com</guid><pubDate>Thu, 17 Sep 2026 04:49:43 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132522</link><description>&lt;blockquote&gt;
&lt;p&gt;‪On Wed, 16 Sept 2026 at 15:19, ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt; &lt;br&gt;
wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does anyone here actually dislike my contributions to php-src????&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes from me as well. I don't know why you are persisting with this RFC. I &lt;br&gt;
don't remember ever seeing so much mail in the list for such an unwanted &lt;br&gt;
RFC.&lt;/p&gt;
&lt;p&gt;I could understand if during the discussion stage, you got feedback like: &lt;br&gt;
&amp;quot;OMG, I soooo need this.&amp;quot; or &amp;quot;Finally! This has always been sorely missing &lt;br&gt;
from the language.&amp;quot; but that didn't happen. I hope you are not motivated to &lt;br&gt;
contribute just so you can be considered a contributor. I hope ego or &lt;br&gt;
prestige is not behind the unrelenting push.&lt;/p&gt;
&lt;p&gt;Even if you can build a faster version in C, that doesn't mean it should be &lt;br&gt;
added to the &lt;code&gt;array_&lt;/code&gt; functions family. I am sure dozens of callback &lt;br&gt;
hybridized iterator functions could be written faster in C, but that is not &lt;br&gt;
a green light to flood the core with more native functions.&lt;/p&gt;
&lt;p&gt;As I mentioned previously, please silently compile your own list of &lt;br&gt;
proposals. Once you have ~5 separate deeply-considered proposals that you &lt;br&gt;
are proud of, then self-assess which is best and if it is worthy of &lt;br&gt;
sharing. I have personally considered proposing &lt;code&gt;array_transpose()&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;preg_escape()&lt;/code&gt;, a &lt;code&gt;PREG_&lt;/code&gt; flag that omits unwanted full string matches, &lt;br&gt;
making the third parameter of &lt;code&gt;substr_replace()&lt;/code&gt; null by default to allow &lt;br&gt;
suffixing an array of strings, and adopting &lt;code&gt;..&lt;/code&gt; range syntax across all &lt;br&gt;
native functions which accept a character mask, but none of my arguments &lt;br&gt;
feel like they would garner support. So, I'm keeping them locked away in my &lt;br&gt;
mental vault. Maybe I'll have an epiphany that will make them attractive or &lt;br&gt;
maybe they'll shape my thoughts on another idea. Not all ideas are winners, &lt;br&gt;
that doesn't make someone a loser. Just keeping learning and growing.&lt;/p&gt;
&lt;p&gt;Sincerely, &lt;br&gt;
mickmackusa&lt;/p&gt;
</description><guid>CAKVXxD-B4hoGSNd=Z7xyy_ijccvTPyxTo3ka+=GHKHmM5qfy9A@mail.gmail.com</guid><pubDate>Wed, 16 Sep 2026 19:21:59 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132521</link><description>&lt;p&gt;Hi Sepehr&lt;/p&gt;
&lt;p&gt;I sent personal mail. &lt;br&gt;
Please check it.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><guid>CAEPPVa14nHVoW6bpsObBBWVJ5s6eVbg4puDf9GPZpk1heTK0+g@mail.gmail.com</guid><pubDate>Wed, 16 Sep 2026 15:22:04 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132520</link><description>&lt;p&gt;‪On Wed, 16 Sept 2026 at 15:19, ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt; wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does anyone here actually dislike my contributions to php-src????&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes.&lt;/p&gt;
</description><guid>CAGBsUrfUdnF8=x-NOCtxiT4Kq_Cwv1pe=_PDXOdaWdFtQmLvjg@mail.gmail.com</guid><pubDate>Wed, 16 Sep 2026 14:48:05 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132519</link><description>&lt;blockquote&gt;
&lt;p&gt;Second, my RFC page has received a significant number of views,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How can you tell? Considering the wiki software doesn't record view counts.&lt;/p&gt;
&lt;p&gt;cheers &lt;br&gt;
Derick&lt;/p&gt;
</description><guid>5746A048-1E56-4A7E-B378-4BCDE87F55D8@php.net</guid><pubDate>Wed, 16 Sep 2026 14:46:28 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132518</link><description>&lt;p&gt;در تاریخ چهارشنبه ۱۶ سپتامبر ۲۰۲۶، ۱۶:۴۱ Larry Garfield &amp;lt; &lt;br&gt;
&lt;a href="mailto:larry@garfieldtech.com" rel="nofollow" target="_blank"&gt;larry@garfieldtech.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ چهارشنبه ۱۶ سپتامبر ۲۰۲۶، ۰۰:۵۵ Larry Garfield &lt;br&gt;
&lt;a href="mailto:larry@garfieldtech.com"&gt;larry@garfieldtech.com&lt;/a&gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;It has been 3 days now and no one has agreed on running the &lt;br&gt;
benchmark tests for my function.&lt;/p&gt;
&lt;p&gt;If there is no agreement on keeping the benchmarks within the next 2 &lt;br&gt;
days, the benchmarks will be completely canceled for my function.&lt;/p&gt;
&lt;p&gt;I look forward to hearing your valuable feedback. Also, this thread &lt;br&gt;
is not just for the benchmarks of this function; you can share any valuable &lt;br&gt;
feedback or thoughts you have regarding my function in this thread.&lt;/p&gt;
&lt;p&gt;With respect, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm pretty sure the reason no one has looked at your benchmarks is no &lt;br&gt;
one supports this function.  I don't believe I've seen a single person &lt;br&gt;
agree with you that it's useful.  You have just been flooding the list with &lt;br&gt;
messages assuming this function will be the greatest thing since sliced &lt;br&gt;
bread, across multiple threads for no apparent reason.  You've already been &lt;br&gt;
advised, both on list and off, on an alternate approach for your specific &lt;br&gt;
use case.  It seems obvious to me that PHP-Internals is just not interested &lt;br&gt;
in this functionality.  Period.&lt;/p&gt;
&lt;p&gt;Whether you're using AI or not, your posts are not helpful or &lt;br&gt;
constructive and people are tired.&lt;/p&gt;
&lt;p&gt;It's OK to have a proposal rejected.  Even very experienced long time &lt;br&gt;
contributors have ideas declined early on.  It is part of the process, and &lt;br&gt;
that's OK.  Pushing and pushing and pushing after it's clear that it's not &lt;br&gt;
going to happen is not a part of the process.  It's just a waste of &lt;br&gt;
everyone's time.&lt;/p&gt;
&lt;p&gt;Please stop wasting everyone's time.&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Larry,&lt;/p&gt;
&lt;p&gt;I need to clarify a few points regarding your email. First, you &lt;br&gt;
initially set providing benchmarks as a primary condition for this RFC. &lt;br&gt;
Later, in private, you told me they weren't necessary. Now, claiming &lt;br&gt;
that these benchmarks are invalid or non-existent completely &lt;br&gt;
contradicts your own initial request.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an outright lie.&lt;/p&gt;
&lt;p&gt;I previously stated that if your argument for a feature is performance, &lt;br&gt;
then it needs benchmarks to demonstrate that performance.&lt;/p&gt;
&lt;p&gt;Weeks later (a few days ago), you emailed me directly asking for help with &lt;br&gt;
CI issues on your PR.&lt;/p&gt;
&lt;p&gt;This was my response:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Sepehr.&lt;/p&gt;
&lt;p&gt;I... don't know why you're asking me for help on this.  I am very open &lt;br&gt;
that while I do a lot of design work for PHP, actually working on the &lt;br&gt;
codebase is not something I'm good at.  I barely manage to read a few parts &lt;br&gt;
of it, and don't know the first thing about why FreeBSD builds or such &lt;br&gt;
would die.&lt;/p&gt;
&lt;p&gt;This would be a question better directed at the list, or just ask for help &lt;br&gt;
on the PR itself.&lt;/p&gt;
&lt;h2&gt;That said, I am also not sure why you're still pushing for that function. &lt;br&gt;
The feedback has been universally negative.  I'd lay good money that the &lt;br&gt;
RFC never passes, no matter what your benchmarks say.  As I said weeks ago, &lt;br&gt;
if your particular code base is such that this is your bottleneck, then &lt;br&gt;
first congrats on having a very efficient application, and second, it's &lt;br&gt;
time to write a tiny extension for just your project.&lt;/h2&gt;
&lt;p&gt;This is not saying &amp;quot;benchmarks aren't necessary,&amp;quot; &amp;quot;benchmarks are &lt;br&gt;
invalid,&amp;quot; or &amp;quot;non-existent.&amp;quot;  It's saying &amp;quot;stop wasting your time and &lt;br&gt;
everyone else's, no one wants your RFC.&amp;quot;  That is still what I am saying. &lt;br&gt;
(And looking at the RFC on the wiki, I don't actually see benchmarks &lt;br&gt;
listed.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As for performance, I’ve already conducted a real-world usage analysis, &lt;br&gt;
and the JSON results are documented in the RFC. They clearly show that &lt;br&gt;
this function outperforms the alternatives you suggested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The alternative I suggested, weeks ago and in the email above, is writing &lt;br&gt;
your own tiny extension to provide the C function you have already &lt;br&gt;
written.  Its performance, whatever it is, should be identical regardless &lt;br&gt;
of whether it's in stdlib or your own extension.  Your response here is &lt;br&gt;
completely inaccurate and grossly misrepresents my very clear statements on &lt;br&gt;
the matter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given the documentation and the results, I cannot accept your &lt;br&gt;
assessment that the benchmarks are invalid. The performance of this &lt;br&gt;
function is proven.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once again:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I never said they are invalid.&lt;/li&gt;
&lt;li&gt;There are no benchmarks on the RFC listed on the RFC index page &lt;br&gt;
(although the formatting is broken)&lt;/li&gt;
&lt;li&gt;What I said is that no one is interested in this proposal, regardless &lt;br&gt;
of its performance, so please stop wasting our time and yours.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are unable to engage honestly and without misrepresenting what &lt;br&gt;
others have said on this topic, then please remove yourself from the &lt;br&gt;
mailing list.&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Larry,&lt;/p&gt;
&lt;p&gt;First, I have to point out that you told me to ignore benchmarks because &lt;br&gt;
this function had no place in the core, yet now you claim it was a &lt;br&gt;
misunderstanding.&lt;/p&gt;
&lt;p&gt;Second, my RFC page has received a significant number of views, which again &lt;br&gt;
contradicts your point.&lt;/p&gt;
&lt;p&gt;Third, please stop trying to use language that leads the conversation in &lt;br&gt;
the wrong direction.&lt;/p&gt;
&lt;p&gt;Everyone is reading this email, and I have one question: &lt;br&gt;
Does anyone here actually dislike my contributions to php-src????&lt;/p&gt;
&lt;p&gt;With great respect to everyone and Mr. Garfield, &lt;br&gt;
Mahmoudi&lt;/p&gt;
</description><guid>CA+Jcf5t9eD9oZKgUP3pp7nkR9-EjYZ9gNxAr9USB3=qvzxAP-g@mail.gmail.com</guid><pubDate>Wed, 16 Sep 2026 14:19:32 +0000</pubDate></item><item><title>Needs some clarification on static zend_string vs zend_new_interned_string (php internals).</title><link>https://externals.io/message/132517</link><description>&lt;p&gt;Hi David,&lt;/p&gt;
&lt;p&gt;On Wed, Sep 16, 2026 at 4:16 PM David Maye Kitenge &lt;a href="mailto:david.maye@seigisoft.com"&gt;david.maye@seigisoft.com&lt;/a&gt; &lt;br&gt;
wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;p&gt;My name is David. I'm working on the refactoring of a PHP extension from &lt;br&gt;
&amp;quot;Zephir&amp;quot; language to a cleaner C language output.&lt;/p&gt;
&lt;p&gt;I came across the fact that the extension uses a lot of &amp;quot;static&amp;quot; &lt;br&gt;
zend_string.  No I want to convert those static zend_string  into the &lt;br&gt;
intern string.&lt;/p&gt;
&lt;p&gt;From what I read today based on PHP internal book website and PHP Source &lt;br&gt;
online, calling a Zen's new interest string function create a string whose &lt;br&gt;
value is registered into a hash table.  And then on a request in it this or &lt;br&gt;
that send interned string is then retrieved from the hash table instead of &lt;br&gt;
creating a new Zen string. Apart from the fact that every every news and &lt;br&gt;
intern strings have an immutable ref count.&lt;/p&gt;
&lt;p&gt;My doubt is the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does ref counting increments/decrements when you create a Zend string &lt;br&gt;
using the static keyword?&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;static applies to the C variable, not the string’s reference-counting &lt;br&gt;
behaviour. A string held in static zend_string *s is still normally &lt;br&gt;
refcounted unless it is interned.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Assigning a new zend_string as interned zend_string, when the flag &lt;br&gt;
&amp;quot;IS_Interned_STRING&amp;quot; (if I remember correctly), the string is kinda garbage &lt;br&gt;
collected? (Do I need to free the string)?&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;An actually interned string is managed by Zend/OPcache. The string &lt;br&gt;
copy/release helpers leave its refcount unchanged, and you should not free &lt;br&gt;
it directly.&lt;/p&gt;
&lt;p&gt;To convert an existing string you own: &lt;br&gt;
&lt;code&gt;s = zend_new_interned_string(s);&lt;/code&gt; &lt;br&gt;
Store the returned pointer, and the function will release the original &lt;br&gt;
string and return an existing interned one. Do not separately release the &lt;br&gt;
old pointer. &lt;br&gt;
But, you should still use &lt;code&gt;zend_string_release(s)&lt;/code&gt; when finished with your &lt;br&gt;
owned reference. It is a no-op for interned strings, but handles &lt;br&gt;
non-interned results, which these APIs can return with OPcache during a &lt;br&gt;
request.&lt;/p&gt;
&lt;p&gt;For fixed extension strings needed across requests, initialize them during &lt;br&gt;
normal module startup (MINIT): &lt;br&gt;
&lt;code&gt;s = zend_string_init_interned(&amp;quot;example&amp;quot;, sizeof(&amp;quot;example&amp;quot;) - 1, true);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Strings interned during a request are not necessarily permanent; storing &lt;br&gt;
their pointer in a static variable does not extend their lifetime.&lt;/p&gt;
&lt;h2&gt;Regards,&lt;/h2&gt;
&lt;p&gt;Alex&lt;/p&gt;
</description><guid>CAAwdEzBFm-avqwFO=H-jWYtQdfDErq-ae-2qZGq6TGpGQjeTFg@mail.gmail.com</guid><pubDate>Wed, 16 Sep 2026 13:59:40 +0000</pubDate></item><item><title>Needs some clarification on static zend_string vs zend_new_interned_string (php internals).</title><link>https://externals.io/message/132516</link><description>&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;p&gt;My name is David. I'm working on the refactoring of a PHP extension from &amp;quot;Zephir&amp;quot; language to a cleaner C language output.&lt;/p&gt;
&lt;p&gt;I came across the fact that the extension uses a lot of &amp;quot;static&amp;quot; zend_string.  No I want to convert those static zend_string  into the intern string.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;My doubt is the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does ref counting increments/decrements when you create a Zend string using the static keyword?&lt;/li&gt;
&lt;li&gt;Assigning a new zend_string as interned zend_string, when the flag &amp;quot;IS_Interned_STRING&amp;quot; (if I remember correctly), the string is kinda garbage collected? (Do I need to free the string)?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for your support. &lt;br&gt;
David.&lt;/p&gt;
</description><guid>141986084.5153055.1789564181299@hostalia.webmail.es</guid><pubDate>Wed, 16 Sep 2026 13:09:41 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132515</link><description>&lt;blockquote&gt;
&lt;p&gt;در تاریخ چهارشنبه ۱۶ سپتامبر ۲۰۲۶، ۰۰:۵۵ Larry Garfield &lt;br&gt;
&lt;a href="mailto:larry@garfieldtech.com"&gt;larry@garfieldtech.com&lt;/a&gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;It has been 3 days now and no one has agreed on running the benchmark tests for my function.&lt;/p&gt;
&lt;p&gt;If there is no agreement on keeping the benchmarks within the next 2 days, the benchmarks will be completely canceled for my function.&lt;/p&gt;
&lt;p&gt;I look forward to hearing your valuable feedback. Also, this thread is not just for the benchmarks of this function; you can share any valuable feedback or thoughts you have regarding my function in this thread.&lt;/p&gt;
&lt;p&gt;With respect, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm pretty sure the reason no one has looked at your benchmarks is no one supports this function.  I don't believe I've seen a single person agree with you that it's useful.  You have just been flooding the list with messages assuming this function will be the greatest thing since sliced bread, across multiple threads for no apparent reason.  You've already been advised, both on list and off, on an alternate approach for your specific use case.  It seems obvious to me that PHP-Internals is just not interested in this functionality.  Period.&lt;/p&gt;
&lt;p&gt;Whether you're using AI or not, your posts are not helpful or constructive and people are tired.&lt;/p&gt;
&lt;p&gt;It's OK to have a proposal rejected.  Even very experienced long time contributors have ideas declined early on.  It is part of the process, and that's OK.  Pushing and pushing and pushing after it's clear that it's not going to happen is not a part of the process.  It's just a waste of everyone's time.&lt;/p&gt;
&lt;p&gt;Please stop wasting everyone's time.&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Larry,&lt;/p&gt;
&lt;p&gt;I need to clarify a few points regarding your email. First, you &lt;br&gt;
initially set providing benchmarks as a primary condition for this RFC. &lt;br&gt;
Later, in private, you told me they weren't necessary. Now, claiming &lt;br&gt;
that these benchmarks are invalid or non-existent completely &lt;br&gt;
contradicts your own initial request.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an outright lie.&lt;/p&gt;
&lt;p&gt;I previously stated that if your argument for a feature is performance, then it needs benchmarks to demonstrate that performance.&lt;/p&gt;
&lt;p&gt;Weeks later (a few days ago), you emailed me directly asking for help with CI issues on your PR.&lt;/p&gt;
&lt;p&gt;This was my response:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Sepehr.&lt;/p&gt;
&lt;p&gt;I... don't know why you're asking me for help on this.  I am very open that while I do a lot of design work for PHP, actually working on the codebase is not something I'm good at.  I barely manage to read a few parts of it, and don't know the first thing about why FreeBSD builds or such would die.&lt;/p&gt;
&lt;p&gt;This would be a question better directed at the list, or just ask for help on the PR itself.&lt;/p&gt;
&lt;h2&gt;That said, I am also not sure why you're still pushing for that function.  The feedback has been universally negative.  I'd lay good money that the RFC never passes, no matter what your benchmarks say.  As I said weeks ago, if your particular code base is such that this is your bottleneck, then first congrats on having a very efficient application, and second, it's time to write a tiny extension for just your project.&lt;/h2&gt;
&lt;p&gt;This is not saying &amp;quot;benchmarks aren't necessary,&amp;quot; &amp;quot;benchmarks are invalid,&amp;quot; or &amp;quot;non-existent.&amp;quot;  It's saying &amp;quot;stop wasting your time and everyone else's, no one wants your RFC.&amp;quot;  That is still what I am saying.  (And looking at the RFC on the wiki, I don't actually see benchmarks listed.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As for performance, I’ve already conducted a real-world usage analysis, &lt;br&gt;
and the JSON results are documented in the RFC. They clearly show that &lt;br&gt;
this function outperforms the alternatives you suggested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The alternative I suggested, weeks ago and in the email above, is writing your own tiny extension to provide the C function you have already written.  Its performance, whatever it is, should be identical regardless of whether it's in stdlib or your own extension.  Your response here is completely inaccurate and grossly misrepresents my very clear statements on the matter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given the documentation and the results, I cannot accept your &lt;br&gt;
assessment that the benchmarks are invalid. The performance of this &lt;br&gt;
function is proven.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once again:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I never said they are invalid.&lt;/li&gt;
&lt;li&gt;There are no benchmarks on the RFC listed on the RFC index page (although the formatting is broken)&lt;/li&gt;
&lt;li&gt;What I said is that no one is interested in this proposal, regardless of its performance, so please stop wasting our time and yours.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are unable to engage honestly and without misrepresenting what others have said on this topic, then please remove yourself from the mailing list.&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
</description><guid>d9ef6f04-f4c9-42fb-bfff-ba351e4ca054@app.fastmail.com</guid><pubDate>Wed, 16 Sep 2026 13:08:31 +0000</pubDate></item><item><title>[VOTE] [RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132514</link><description>&lt;p&gt;در تاریخ چهارشنبه ۱۶ سپتامبر ۲۰۲۶، ۱۳:۰۴ Tim Düsterhus &lt;a href="mailto:tim@bastelstu.be"&gt;tim@bastelstu.be&lt;/a&gt; &lt;br&gt;
نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think you've read the RFC further after my latest response regarding &lt;br&gt;
your suggestions. And I think you have no further issues with it &lt;br&gt;
because &lt;br&gt;
you don't send more email to the thread. Maybe I don't have the English &lt;br&gt;
skill to make it clear about what is planned and made.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No, I hadn't taken another look at the RFC yet. I also made it clear &lt;br&gt;
that I had not given it much thought (due to time constraints). But my &lt;br&gt;
schedule should not be a blocker for RFCs to proceed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Content-wise I also don't agree with the decision to keep using&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;untyped  &lt;br&gt;
&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;constants instead of enums, but didn't have the time to actually think &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;gt; &lt;br&gt;
this through or read the RFC in-depth.&lt;/p&gt;
&lt;p&gt;I have discussed this with David in the discussion thread. We all agree &lt;br&gt;
on this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From what I see not much discussion has happened on that topic. It's &lt;br&gt;
basically just David suggesting it (and me previously suggesting it in &lt;br&gt;
private) and you declining the suggestion. I think we can find a &lt;br&gt;
reasonable middle-ground that makes use of enums, while not precluding a &lt;br&gt;
future redesign of the ext/intl API. I'll send those to the discussion &lt;br&gt;
thread to keep it in a single place.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Tim,&lt;/p&gt;
&lt;p&gt;Thanks for bringing this up. I completely welcome finding a reasonable &lt;br&gt;
middle-ground.&lt;/p&gt;
&lt;p&gt;My long-term plan is indeed to actively contribute to ext/intl (especially &lt;br&gt;
aiming for PHP 8.7, where we can systematically modernize the extension &lt;br&gt;
with proper namespaces, enums, and cleaner error handling).&lt;/p&gt;
&lt;p&gt;I'd be glad to see your proposed middle-ground in the main discussion &lt;br&gt;
thread, and we can definitely work together to align it so it fits both the &lt;br&gt;
current RFC requirements and the future ext/intl roadmap.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5ufyvwA9HP13BBQ6GiG+G1MQudrCLsZUkWtCuiKj+Xsrg@mail.gmail.com</guid><pubDate>Wed, 16 Sep 2026 09:49:52 +0000</pubDate></item><item><title>[RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132513</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For enums and namespaces: I kept class constants and the global Intl* &lt;br&gt;
class name to stay &lt;br&gt;
consistent with the existing ext/intl API, such as IntlDateFormatter, &lt;br&gt;
IntlListFormatter &lt;br&gt;
IntlNumberRangeFormatter, and IntlDatePatternGenerator. I don't want to &lt;br&gt;
make &lt;br&gt;
IntlRelativeDateTimeFormatter somehow special here just because this is &lt;br&gt;
added later. &lt;br&gt;
I agree that enums and namespaces would be nicer in isolation, &lt;br&gt;
&lt;em&gt;indeed&lt;/em&gt;. But,  &lt;br&gt;
introducing them for only this one formatter would make the API &lt;br&gt;
inconsistent with the rest &lt;br&gt;
of ext/intl.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I had mentioned in the voting thread, I think there is a reasonable &lt;br&gt;
middleground to be achieved here:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; final class IntlRelativeDateTimeFormatter
 {
     public function __construct(
         ?string $locale = null,
         IntlRelativeDateTimeFormatterStyle $style = 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IntlRelativeDateTimeFormatterStyle::Long, &lt;br&gt;
IntlRelativeDateTimeFormatterCapitalization &lt;br&gt;
$capitalizationContext = &lt;br&gt;
IntlRelativeDateTimeFormatterCapitalization::None, &lt;br&gt;
?NumberFormatter $numberFormatter = null, &lt;br&gt;
) {}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     public function format(int|float $offset, 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IntlRelativeDateTimeFormatterUnit $unit): string|false {}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     public function formatNumeric(int|float $offset, int $unit): 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;string|false {}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     public function combineDateAndTime(string $relativeDate, string 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$time): string|false {}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     public function getErrorCode(): int {}

     public function getErrorMessage(): string {}
 }

 enum IntlRelativeDateTimeFormatterStyle {
     case Long;
     case Short;
     case Narrow;
 }

 enum IntlRelativeDateTimeFormatterCapitalization {
     case None;
     case MiddleOfSentence;
     case BeginningOfSentence;
     case UiListAndMenu;
     case Standalone;
 }

 enum IntlRelativeDateTimeFormatterUnit {
     case Year;
     case Quarter;
     case Month;
     case Week;
     case Day;
     case Hour;
     case Minute;
     case Second;
     // ...
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The practical change for the users is just moving some separators &lt;br&gt;
around:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $formatter-&amp;gt;format(-1, IntlRelativeDateTimeFormatter::UNIT_DAY)
 // becomes
 $formatter-&amp;gt;format(-1, IntlRelativeDateTimeFormatterUnit::Day)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basically the first component of the constant name moves in front of the &lt;br&gt;
&lt;code&gt;::&lt;/code&gt; (and underscores are replaced by pascal case).&lt;/p&gt;
&lt;p&gt;No namespaces are introduced, leaving a clean place for a redesigned &lt;br&gt;
Intl API that doesn't just expose the ICU API as-is, but the main &lt;br&gt;
benefits of using enums are preserved: Better discoverability and &lt;br&gt;
autocompletion in IDEs. Cleaner documentation (it's possible to document &lt;br&gt;
both the enum and the individual cases). Simplified input checks in the &lt;br&gt;
internal implementation (error handling is implicitly provided by the &lt;br&gt;
engine with the Z_PARAM_ENUM specifier).&lt;/p&gt;
&lt;p&gt;I believe that users will value the clearer API signatures provided by &lt;br&gt;
enums over the tiny inconsistency of placing the “Unit”, “Style” and &lt;br&gt;
“Capitalization” in front of the &lt;code&gt;::&lt;/code&gt; instead of after - and enums &lt;br&gt;
themselves are already used in PHP’s stdlib (e.g. RoundingMode), so &lt;br&gt;
users have already encountered them.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>c7518ba659bcb0d338bcbaeb0c680339@bastelstu.be</guid><pubDate>Wed, 16 Sep 2026 09:49:40 +0000</pubDate></item><item><title>[VOTE] [RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132512</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think you've read the RFC further after my latest response regarding &lt;br&gt;
your suggestions. And I think you have no further issues with it &lt;br&gt;
because &lt;br&gt;
you don't send more email to the thread. Maybe I don't have the English &lt;br&gt;
skill to make it clear about what is planned and made.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No, I hadn't taken another look at the RFC yet. I also made it clear &lt;br&gt;
that I had not given it much thought (due to time constraints). But my &lt;br&gt;
schedule should not be a blocker for RFCs to proceed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;gt; &lt;br&gt;
Content-wise I also don't agree with the decision to keep using &lt;br&gt;
untyped  &lt;br&gt;
&amp;gt; &lt;br&gt;
constants instead of enums, but didn't have the time to actually think  &lt;br&gt;
&amp;gt; &lt;br&gt;
this through or read the RFC in-depth.&lt;/p&gt;
&lt;p&gt;I have discussed this with David in the discussion thread. We all agree &lt;br&gt;
on this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From what I see not much discussion has happened on that topic. It's &lt;br&gt;
basically just David suggesting it (and me previously suggesting it in &lt;br&gt;
private) and you declining the suggestion. I think we can find a &lt;br&gt;
reasonable middle-ground that makes use of enums, while not precluding a &lt;br&gt;
future redesign of the ext/intl API. I'll send those to the discussion &lt;br&gt;
thread to keep it in a single place.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>12dc3dcc017c9aba763d77ae914e752c@bastelstu.be</guid><pubDate>Wed, 16 Sep 2026 09:32:49 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132511</link><description>&lt;p&gt;در تاریخ چهارشنبه ۱۶ سپتامبر ۲۰۲۶، ۰۰:۵۵ Larry Garfield &amp;lt; &lt;br&gt;
&lt;a href="mailto:larry@garfieldtech.com" rel="nofollow" target="_blank"&gt;larry@garfieldtech.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;It has been 3 days now and no one has agreed on running the benchmark &lt;br&gt;
tests for my function.&lt;/p&gt;
&lt;p&gt;If there is no agreement on keeping the benchmarks within the next 2 &lt;br&gt;
days, the benchmarks will be completely canceled for my function.&lt;/p&gt;
&lt;p&gt;I look forward to hearing your valuable feedback. Also, this thread is &lt;br&gt;
not just for the benchmarks of this function; you can share any valuable &lt;br&gt;
feedback or thoughts you have regarding my function in this thread.&lt;/p&gt;
&lt;p&gt;With respect, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm pretty sure the reason no one has looked at your benchmarks is no one &lt;br&gt;
supports this function.  I don't believe I've seen a single person agree &lt;br&gt;
with you that it's useful.  You have just been flooding the list with &lt;br&gt;
messages assuming this function will be the greatest thing since sliced &lt;br&gt;
bread, across multiple threads for no apparent reason.  You've already been &lt;br&gt;
advised, both on list and off, on an alternate approach for your specific &lt;br&gt;
use case.  It seems obvious to me that PHP-Internals is just not interested &lt;br&gt;
in this functionality.  Period.&lt;/p&gt;
&lt;p&gt;Whether you're using AI or not, your posts are not helpful or constructive &lt;br&gt;
and people are tired.&lt;/p&gt;
&lt;p&gt;It's OK to have a proposal rejected.  Even very experienced long time &lt;br&gt;
contributors have ideas declined early on.  It is part of the process, and &lt;br&gt;
that's OK.  Pushing and pushing and pushing after it's clear that it's not &lt;br&gt;
going to happen is not a part of the process.  It's just a waste of &lt;br&gt;
everyone's time.&lt;/p&gt;
&lt;p&gt;Please stop wasting everyone's time.&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Larry,&lt;/p&gt;
&lt;p&gt;I need to clarify a few points regarding your email. First, you initially &lt;br&gt;
set providing benchmarks as a primary condition for this RFC. Later, in &lt;br&gt;
private, you told me they weren't necessary. Now, claiming that these &lt;br&gt;
benchmarks are invalid or non-existent completely contradicts your own &lt;br&gt;
initial request.&lt;/p&gt;
&lt;p&gt;As for performance, I’ve already conducted a real-world usage analysis, and &lt;br&gt;
the JSON results are documented in the RFC. They clearly show that this &lt;br&gt;
function outperforms the alternatives you suggested.&lt;/p&gt;
&lt;p&gt;Given the documentation and the results, I cannot accept your assessment &lt;br&gt;
that the benchmarks are invalid. The performance of this function is proven.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5uLBXAqUz_x7HKCuO4u57FN1LNmDzosE8igUjqGFtjpKg@mail.gmail.com</guid><pubDate>Tue, 15 Sep 2026 23:05:25 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132510</link><description>&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;It has been 3 days now and no one has agreed on running the benchmark tests for my function.&lt;/p&gt;
&lt;p&gt;If there is no agreement on keeping the benchmarks within the next 2 days, the benchmarks will be completely canceled for my function.&lt;/p&gt;
&lt;p&gt;I look forward to hearing your valuable feedback. Also, this thread is not just for the benchmarks of this function; you can share any valuable feedback or thoughts you have regarding my function in this thread.&lt;/p&gt;
&lt;p&gt;With respect, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm pretty sure the reason no one has looked at your benchmarks is no one supports this function.  I don't believe I've seen a single person agree with you that it's useful.  You have just been flooding the list with messages assuming this function will be the greatest thing since sliced bread, across multiple threads for no apparent reason.  You've already been advised, both on list and off, on an alternate approach for your specific use case.  It seems obvious to me that PHP-Internals is just not interested in this functionality.  Period.&lt;/p&gt;
&lt;p&gt;Whether you're using AI or not, your posts are not helpful or constructive and people are tired.&lt;/p&gt;
&lt;p&gt;It's OK to have a proposal rejected.  Even very experienced long time contributors have ideas declined early on.  It is part of the process, and that's OK.  Pushing and pushing and pushing after it's clear that it's not going to happen is not a part of the process.  It's just a waste of everyone's time.&lt;/p&gt;
&lt;p&gt;Please stop wasting everyone's time.&lt;/p&gt;
&lt;p&gt;--Larry Garfield&lt;/p&gt;
</description><guid>a63bfba0-2b0f-4d15-ab10-7d3636a92343@app.fastmail.com</guid><pubDate>Tue, 15 Sep 2026 21:23:14 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132509</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;It has been 3 days now and no one has agreed on running the benchmark &lt;br&gt;
tests for my function.&lt;/p&gt;
&lt;p&gt;If there is no agreement on keeping the benchmarks within the next 2 days, &lt;br&gt;
the benchmarks will be completely canceled for my function.&lt;/p&gt;
&lt;p&gt;I look forward to hearing your valuable feedback. Also, this thread is not &lt;br&gt;
just for the benchmarks of this function; you can share any valuable &lt;br&gt;
feedback or thoughts you have regarding my function in this thread.&lt;/p&gt;
&lt;p&gt;With respect, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
</description><guid>CA+Jcf5thCk8ekFDAs3427G7WgrHyMaTq251kJ5ozbb_ow_3JVw@mail.gmail.com</guid><pubDate>Tue, 15 Sep 2026 15:53:56 +0000</pubDate></item><item><title>RFC karma request</title><link>https://externals.io/message/132508</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;I created an account on &lt;a href="http://wiki.php.net" rel="nofollow" target="_blank"&gt;wiki.php.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Username: mnapoli&lt;/p&gt;
&lt;p&gt;My plan is to create a RFC for &lt;a href="https://github.com/php/php-src/pull/23558" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23558&lt;/a&gt; (allowing runtime distributors to ship a single binary for both CLI and FPM)&lt;/p&gt;
&lt;p&gt;My GitHub profile: &lt;a href="https://github.com/mnapoli/" rel="nofollow" target="_blank"&gt;https://github.com/mnapoli/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you! &lt;br&gt;
Matthieu Napoli&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hello Matthieu,&lt;/p&gt;
&lt;p&gt;If the primary concern is with size, it may make sense to instead look into creating a reusable shared library on unix, much like on Windows.&lt;/p&gt;
&lt;p&gt;That being said, while I'm also in favour of shipping only one binary for both, I strongly believe that it should &lt;em&gt;not&lt;/em&gt; become an opt-in that nobody ends up shipping. It should become default at the very least, with an option to explicitly disable cli/fpm sources to save a few kb in a 9mb+++ binary at most.&lt;/p&gt;
&lt;p&gt;Have you had any thoughts about the embed shared library if fpm should also be exposed there?&lt;/p&gt;
&lt;p&gt;Marc&lt;/p&gt;
</description><guid>GVXP195MB16156ABBE25831392841E02CD1BA2@GVXP195MB1615.EURP195.PROD.OUTLOOK.COM</guid><pubDate>Tue, 15 Sep 2026 15:24:52 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132507</link><description>&lt;p&gt;در تاریخ سه‌شنبه ۱۵ سپتامبر ۲۰۲۶، ۱۴:۴۴ Derick Rethans &lt;a href="mailto:derick@php.net"&gt;derick@php.net&lt;/a&gt; &lt;br&gt;
نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۱۵:۳۷ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 20:40 ‫سپهر محمودی‬ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two &lt;br&gt;
critical issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my &lt;br&gt;
environment. It is scientifically impossible to derive any &lt;br&gt;
performance conclusions from code that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend &lt;br&gt;
Engine internals, the methodology applied here lacks the necessary &lt;br&gt;
technical rigor for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, &lt;br&gt;
and engine-aware performance analysis. However, as it stands, the &lt;br&gt;
provided material is effectively contentless and does not offer a &lt;br&gt;
basis for a technical evaluation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PLEASE UNZIP ATTACHED FILE. YOUR CODE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you lack a solid grasp of Zend Engine internals and core data &lt;br&gt;
structures like zval—which is the very backbone of PHP’s C runtime—it &lt;br&gt;
feels like you are simply relying on an AI assistant rather than &lt;br&gt;
technical understanding. Without mastering zval and Zend memory &lt;br&gt;
handling, working at this level in C is effectively crippled.&lt;/p&gt;
&lt;p&gt;To answer your question: I am testing this on high-end industrial &lt;br&gt;
64-bit hardware, and your provided files still completely fail to &lt;br&gt;
build.&lt;/p&gt;
&lt;p&gt;Perhaps you should tell your AI to think a bit harder before &lt;br&gt;
generating patches and benchmarks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was incredibly rude to say.&lt;/p&gt;
&lt;p&gt;It is &lt;em&gt;you&lt;/em&gt; with all the AI generated content wasting everybody's time.&lt;/p&gt;
&lt;p&gt;The amount of new threads, new discussions, is exhausting the members of &lt;br&gt;
this list. Especially because these discussions don't seem to be going &lt;br&gt;
anywhere.&lt;/p&gt;
&lt;p&gt;Consider this to be a warning if you want to continue to participate in &lt;br&gt;
this list.&lt;/p&gt;
&lt;p&gt;cheers, &lt;br&gt;
Derick &lt;br&gt;
(With his list-admin hat on)&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
&lt;a href="https://derickrethans.nl" rel="nofollow" target="_blank"&gt;https://derickrethans.nl&lt;/a&gt; | &lt;a href="https://xdebug.org" rel="nofollow" target="_blank"&gt;https://xdebug.org&lt;/a&gt; | &lt;a href="https://xdebug.cloud" rel="nofollow" target="_blank"&gt;https://xdebug.cloud&lt;/a&gt; &lt;br&gt;
Author of Xdebug. Like it? Consider supporting me: &lt;br&gt;
&lt;a href="https://xdebug.org/support" rel="nofollow" target="_blank"&gt;https://xdebug.org/support&lt;/a&gt; &lt;br&gt;
mastodon: @&lt;a href="mailto:derickr@phpc.social" rel="nofollow" target="_blank"&gt;derickr@phpc.social&lt;/a&gt; @&lt;a href="mailto:xdebug@phpc.social" rel="nofollow" target="_blank"&gt;xdebug@phpc.social&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;p&gt;Regarding my previous comments directed towards dear Yuya, I sincerely and &lt;br&gt;
deeply apologize. This is not the appropriate venue for such remarks, and &lt;br&gt;
it was unprofessional of me to speak that way to you all, whom I hold in &lt;br&gt;
the highest regard as the giants of the PHP community.&lt;/p&gt;
&lt;p&gt;I have sent a private email to dear Hamada to apologize, and he has kindly &lt;br&gt;
accepted. Even Tim reached out to me privately to emphasize that this list &lt;br&gt;
is not the place for such tension. I want to assure you and the entire &lt;br&gt;
internals community that I will refrain from any further inflammatory or &lt;br&gt;
inappropriate language.&lt;/p&gt;
&lt;p&gt;Regarding the use of AI: &lt;br&gt;
Several people have raised concerns about this on the list, and I would &lt;br&gt;
like to provide some context:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sometimes I repeat a word twice by mistake—does an AI make such human &lt;br&gt;
errors? No, it doesn't.&lt;/li&gt;
&lt;li&gt;To get all my CI checks to pass, I think I have manually pushed about 17 &lt;br&gt;
times so far. With AI, a task usually gets resolved in just 2 pushes.&lt;/li&gt;
&lt;li&gt;AI can write code in 2 minutes, and if you give it the same code to &lt;br&gt;
debug, it can analyze it and provide a fully working solution in about 5 &lt;br&gt;
minutes. Meanwhile, it took me 7 full days using PhpStorm to prepare all &lt;br&gt;
the necessary files.&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;sepehr&lt;/p&gt;
</description><guid>CA+Jcf5tbNsaW3MKGzOZVJ-18jBy++SrEjVPWOTPNV5W2Od2LPQ@mail.gmail.com</guid><pubDate>Tue, 15 Sep 2026 13:35:54 +0000</pubDate></item><item><title>[VOTE] [RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132506</link><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&amp;gt; It's debatable if the latest changes in response to my email constitute  &lt;br&gt;
&amp;gt; a major or a minor change regarding the cooldown. However there was also  &lt;br&gt;
&amp;gt; no email that changes &lt;em&gt;were&lt;/em&gt; made to the RFC text (only that some were  &lt;br&gt;
&amp;gt; &lt;em&gt;planned&lt;/em&gt;), which is why I didn't recheck the RFC before the vote - and  &lt;br&gt;
&amp;gt; the intent to vote expired.&lt;/p&gt;
&lt;p&gt;I think you've read the RFC further after my latest response regarding &lt;br&gt;
your suggestions. And I think you have no further issues with it because &lt;br&gt;
you don't send more email to the thread. Maybe I don't have the English &lt;br&gt;
skill to make it clear about what is planned and made.&lt;/p&gt;
&lt;p&gt;Given this misunderstanding yes I will threat this as a major change and &lt;br&gt;
revert the voting process.&lt;/p&gt;
&lt;p&gt;&amp;gt; Content-wise I also don't agree with the decision to keep using untyped  &lt;br&gt;
&amp;gt; constants instead of enums, but didn't have the time to actually think  &lt;br&gt;
&amp;gt; this through or read the RFC in-depth.&lt;/p&gt;
&lt;p&gt;I have discussed this with David in the discussion thread. We all agree on this. &lt;br&gt;
However, using untyped constants is a convention to the extension. Every other &lt;br&gt;
classes in the extension don't use enums. I'd suggest to add this in the future &lt;br&gt;
scope so a extension-wide RFC can revisit this topic later. I don't want to make &lt;br&gt;
this new class special to others at the sake of consistency.&lt;/p&gt;
&lt;p&gt;Further, using namespaces is also preferred here.&lt;/p&gt;
&lt;p&gt;&amp;gt; For these reasons I voted against the RFC.&lt;/p&gt;
&lt;p&gt;Please let me know if you have further suggestions. After resolving it, I will &lt;br&gt;
announce the cooldown period again. There is no need to rush anyways :)&lt;/p&gt;
&lt;p&gt;Weilin Du&lt;/p&gt;
</description><guid>tencent_BB1A5C174B95BC5B65192E57E8F2C4910809@qq.com</guid><pubDate>Tue, 15 Sep 2026 12:02:47 +0000</pubDate></item><item><title>[VOTE] [RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132505</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am excited to announce the start of the voting of &lt;br&gt;
my latest RFC on the international extension!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's debatable if the latest changes in response to my email constitute &lt;br&gt;
a major or a minor change regarding the cooldown. However there was also &lt;br&gt;
no email that changes &lt;em&gt;were&lt;/em&gt; made to the RFC text (only that some were &lt;br&gt;
&lt;em&gt;planned&lt;/em&gt;), which is why I didn't recheck the RFC before the vote - and &lt;br&gt;
the intent to vote expired.&lt;/p&gt;
&lt;p&gt;Content-wise I also don't agree with the decision to keep using untyped &lt;br&gt;
constants instead of enums, but didn't have the time to actually think &lt;br&gt;
this through or read the RFC in-depth.&lt;/p&gt;
&lt;p&gt;For these reasons I voted against the RFC.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>151bf7ae775eea60869bb49adb1ed322@bastelstu.be</guid><pubDate>Tue, 15 Sep 2026 11:33:49 +0000</pubDate></item><item><title>[VOTE] [RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132504</link><description>&lt;p&gt;Hi internals!&lt;/p&gt;
&lt;p&gt;I am excited to announce the start of the voting of &lt;br&gt;
my latest RFC on the international extension!&lt;/p&gt;
&lt;p&gt;discussion link: &lt;a href="https://externals.io/message/132187" rel="nofollow" target="_blank"&gt;https://externals.io/message/132187&lt;/a&gt; &lt;br&gt;
RFC: &lt;a href="https://wiki.php.net/rfc/reldateformatter" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/reldateformatter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The voting process will end at 2026-09-29 11:14:40 UTC.&lt;/p&gt;
&lt;p&gt;Thanks, &lt;br&gt;
Weilin Du&lt;/p&gt;
</description><guid>tencent_391E01926B5A2982B79B6CD2E5385DAF7806@qq.com</guid><pubDate>Tue, 15 Sep 2026 11:18:26 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132503</link><description>&lt;blockquote&gt;
&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۱۵:۳۷ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 20:40 ‫سپهر محمودی‬ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two &lt;br&gt;
critical issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my &lt;br&gt;
environment. It is scientifically impossible to derive any &lt;br&gt;
performance conclusions from code that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend &lt;br&gt;
Engine internals, the methodology applied here lacks the necessary &lt;br&gt;
technical rigor for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, &lt;br&gt;
and engine-aware performance analysis. However, as it stands, the &lt;br&gt;
provided material is effectively contentless and does not offer a &lt;br&gt;
basis for a technical evaluation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PLEASE UNZIP ATTACHED FILE. YOUR CODE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you lack a solid grasp of Zend Engine internals and core data &lt;br&gt;
structures like zval—which is the very backbone of PHP’s C runtime—it &lt;br&gt;
feels like you are simply relying on an AI assistant rather than &lt;br&gt;
technical understanding. Without mastering zval and Zend memory &lt;br&gt;
handling, working at this level in C is effectively crippled.&lt;/p&gt;
&lt;p&gt;To answer your question: I am testing this on high-end industrial &lt;br&gt;
64-bit hardware, and your provided files still completely fail to &lt;br&gt;
build.&lt;/p&gt;
&lt;p&gt;Perhaps you should tell your AI to think a bit harder before &lt;br&gt;
generating patches and benchmarks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was incredibly rude to say.&lt;/p&gt;
&lt;p&gt;It is &lt;em&gt;you&lt;/em&gt; with all the AI generated content wasting everybody's time.&lt;/p&gt;
&lt;p&gt;The amount of new threads, new discussions, is exhausting the members of &lt;br&gt;
this list. Especially because these discussions don't seem to be going &lt;br&gt;
anywhere.&lt;/p&gt;
&lt;p&gt;Consider this to be a warning if you want to continue to participate in &lt;br&gt;
this list.&lt;/p&gt;
&lt;p&gt;cheers, &lt;br&gt;
Derick &lt;br&gt;
(With his list-admin hat on)&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
&lt;a href="https://derickrethans.nl" rel="nofollow" target="_blank"&gt;https://derickrethans.nl&lt;/a&gt; | &lt;a href="https://xdebug.org" rel="nofollow" target="_blank"&gt;https://xdebug.org&lt;/a&gt; | &lt;a href="https://xdebug.cloud" rel="nofollow" target="_blank"&gt;https://xdebug.cloud&lt;/a&gt; &lt;br&gt;
Author of Xdebug. Like it? Consider supporting me: &lt;a href="https://xdebug.org/support" rel="nofollow" target="_blank"&gt;https://xdebug.org/support&lt;/a&gt; &lt;br&gt;
mastodon: @&lt;a href="mailto:derickr@phpc.social" rel="nofollow" target="_blank"&gt;derickr@phpc.social&lt;/a&gt; @&lt;a href="mailto:xdebug@phpc.social" rel="nofollow" target="_blank"&gt;xdebug@phpc.social&lt;/a&gt;&lt;/p&gt;
</description><guid>9c4cfa3a-355f-5423-2506-8e7f004d5118@php.net</guid><pubDate>Tue, 15 Sep 2026 11:14:22 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132502</link><description>&lt;p&gt;Hey,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey Jakub,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shouldn't we first unbundle it from php-src and then move to the &lt;br&gt;
static archive or is the pear install (which I think is used in &lt;br&gt;
Windows build in some cases) still work?&lt;/p&gt;
&lt;p&gt;I plan to resume the work on that PR in October or November when I &lt;br&gt;
should have more time but it would be good if someone could check if &lt;br&gt;
that move to static archive cannot break anything in php-src.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With help from Derick I looked into it, my understanding is that we can &lt;br&gt;
flip the switch without first unbundling as long as we don't break the &lt;br&gt;
resource URLs (XML, packages, phars). The static archive will keep &lt;br&gt;
providing the required resources under &lt;code&gt;&lt;a href="http://pear.php.net/*" rel="nofollow" target="_blank"&gt;pear.php.net/*&lt;/a&gt;&lt;/code&gt; &lt;br&gt;
&lt;a href="http://pear.php.net/*"&gt;http://pear.php.net/*&lt;/a&gt; (eg. &lt;br&gt;
&lt;code&gt;go-pear.phar&lt;/code&gt;) and &lt;code&gt;&lt;a href="http://pear.php.net/rest/*" rel="nofollow" target="_blank"&gt;pear.php.net/rest/*&lt;/a&gt;&lt;/code&gt; &lt;a href="http://pear.php.net/rest/*"&gt;http://pear.php.net/rest/*&lt;/a&gt;; &lt;br&gt;
just no longer from the &lt;br&gt;
dynamic code base that powers the website currently. The domain will not &lt;br&gt;
change.&lt;/p&gt;
&lt;p&gt;That said, the vote -- depending on when it starts -- will not end &lt;br&gt;
before mid October. The current archive is still PoC, and I will have &lt;br&gt;
some work before switching. Realistically, we will not land anything &lt;br&gt;
before November. So that aligns with your own timeline and we will have &lt;br&gt;
time to coordinate. Sounds good?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds good, thanks&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Also related: Daniel recently opened &lt;br&gt;
&lt;a href="https://github.com/php/php-src/pull/23634" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23634&lt;/a&gt; which targets 8.2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm aware - we were just discussing it between RM's&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;/p&gt;
&lt;p&gt;Jakub&lt;/p&gt;
</description><guid>CAEKnhAFsrpwVo5bJ64+h5Nh=onqSq6R9XEJDDBMha8fLubFbRw@mail.gmail.com</guid><pubDate>Mon, 14 Sep 2026 20:39:02 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132501</link><description>&lt;p&gt;Hey Jakub,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shouldn't we first unbundle it from php-src and then move to the &lt;br&gt;
static archive or is the pear install (which I think is used in &lt;br&gt;
Windows build in some cases) still work?&lt;/p&gt;
&lt;p&gt;I plan to resume the work on that PR in October or November when I &lt;br&gt;
should have more time but it would be good if someone could check if &lt;br&gt;
that move to static archive cannot break anything in php-src.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With help from Derick I looked into it, my understanding is that we can &lt;br&gt;
flip the switch without first unbundling as long as we don't break the &lt;br&gt;
resource URLs (XML, packages, phars). The static archive will keep &lt;br&gt;
providing the required resources under &lt;code&gt;&lt;a href="http://pear.php.net/*" rel="nofollow" target="_blank"&gt;pear.php.net/*&lt;/a&gt;&lt;/code&gt; (eg. &lt;br&gt;
&lt;code&gt;go-pear.phar&lt;/code&gt;) and &lt;code&gt;&lt;a href="http://pear.php.net/rest/*" rel="nofollow" target="_blank"&gt;pear.php.net/rest/*&lt;/a&gt;&lt;/code&gt;; just no longer from the &lt;br&gt;
dynamic code base that powers the website currently. The domain will not &lt;br&gt;
change.&lt;/p&gt;
&lt;p&gt;That said, the vote -- depending on when it starts -- will not end &lt;br&gt;
before mid October. The current archive is still PoC, and I will have &lt;br&gt;
some work before switching. Realistically, we will not land anything &lt;br&gt;
before November. So that aligns with your own timeline and we will have &lt;br&gt;
time to coordinate. Sounds good?&lt;/p&gt;
&lt;p&gt;Also related: Daniel recently opened &lt;br&gt;
&lt;a href="https://github.com/php/php-src/pull/23634" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23634&lt;/a&gt; which targets 8.2.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Cheers &lt;br&gt;
Nick&lt;/p&gt;
</description><guid>f3c1cda3-cad1-4e0c-945e-06d1fd06f802@nicksdot.dev</guid><pubDate>Mon, 14 Sep 2026 16:31:54 +0000</pubDate></item><item><title>RFC karma request</title><link>https://externals.io/message/132500</link><description>&lt;p&gt;Hi Matthieu&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I created an account on &lt;a href="http://wiki.php.net" rel="nofollow" target="_blank"&gt;wiki.php.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Username: mnapoli&lt;/p&gt;
&lt;p&gt;My plan is to create a RFC for &lt;a href="https://github.com/php/php-src/pull/23558" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23558&lt;/a&gt; (allowing runtime distributors to ship a single binary for both CLI and FPM)&lt;/p&gt;
&lt;p&gt;My GitHub profile: &lt;a href="https://github.com/mnapoli/" rel="nofollow" target="_blank"&gt;https://github.com/mnapoli/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RFC karma was granted. Good luck!&lt;/p&gt;
&lt;p&gt;Ilija&lt;/p&gt;
</description><guid>0a059aed-c9f2-4161-8524-a8dae5c6ddd2@gmail.com</guid><pubDate>Mon, 14 Sep 2026 13:23:23 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132499</link><description>&lt;p&gt;Hi Tim,&lt;/p&gt;
&lt;p&gt;Am 04.09.2026 um 19:51 schrieb Tim Düsterhus:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;I disagree with the behavior of not wrapping Exceptions thrown in &lt;br&gt;
user callbacks: I believe the correct choice is to throw a &lt;br&gt;
\PregException with the Exception thrown in the callback as the &lt;br&gt;
&lt;code&gt;-&amp;gt;previous&lt;/code&gt; exception. Not wrapping the user callback exception means &lt;br&gt;
that one needs a &lt;code&gt;catch(Exception)&lt;/code&gt; with a try just around the preg_ &lt;br&gt;
call to reliably handle all errors during regular expression &lt;br&gt;
execution, which nullifies much of the benefit of having a dedicated &lt;br&gt;
exception class in the first place.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It also violates the exception policy in &lt;br&gt;
&lt;a href="https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables" rel="nofollow" target="_blank"&gt;https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables&lt;/a&gt;, &lt;br&gt;
which states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If an extension uses external functionality that may throw an &lt;br&gt;
exception it MUST wrap any exception thrown by that functionality &lt;br&gt;
into an appropriate exception of its own. It MUST set the $previous &lt;br&gt;
property to the original exception when doing so.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Following the principle of least surprise, i would expect that this code:&lt;/p&gt;
&lt;p&gt;try { &lt;br&gt;
    preg_replace_callback($pattern, $callback, $subject); &lt;br&gt;
} catch (ValidationException $e) { &lt;br&gt;
    // Handle it &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;can be changed to the following, and still work like expected:&lt;/p&gt;
&lt;p&gt;try { &lt;br&gt;
    preg_replace_callback($pattern, $callback, $subject, flags: &lt;br&gt;
PREG_THROW_ON_ERROR); &lt;br&gt;
} catch (ValidationException $e) { &lt;br&gt;
    // Handle it &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;When PREG wraps everything thrown in a user supplied callback into an &lt;br&gt;
PregException, above code would no longer work. &lt;br&gt;
Instead, we would need this:&lt;/p&gt;
&lt;p&gt;try { &lt;br&gt;
    preg_replace_callback($pattern, $callback, $subject, flags: &lt;br&gt;
PREG_THROW_ON_ERROR); &lt;br&gt;
} catch (PregException $e) { &lt;br&gt;
    if ($e-&amp;gt;getPrevious() instanceof ValidationException) { &lt;br&gt;
        // Handle it &lt;br&gt;
    } else { &lt;br&gt;
        throw $e; // Rethrow if it wasn't the one we expected &lt;br&gt;
    } &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;The policy states: &amp;quot;If an extension uses external functionality&amp;quot; &lt;br&gt;
I would argue, that this should only target exceptions from the &lt;br&gt;
extension's own external dependencies. As a user i do not care about &lt;br&gt;
internal implementation details of an extension. In fact, it would be &lt;br&gt;
surprising to the caller to face foreign exceptions. Therefore it makes &lt;br&gt;
sense for any extension to catch those and wrap them in their own &lt;br&gt;
exception hierarchy.&lt;/p&gt;
&lt;p&gt;However, i would not regard user supplied callbacks to fall under that &lt;br&gt;
policy rule. The extension itself is not using that code and knows &lt;br&gt;
nothing about it. It just calls it, following the &amp;quot;Inversion of Control&amp;quot; &lt;br&gt;
principle back into userland.&lt;/p&gt;
&lt;p&gt;As always, a good indicator for questions like this is to check what &lt;br&gt;
other languages are doing.&lt;/p&gt;
&lt;p&gt;In Javascript, the Exception propagates untouched:&lt;/p&gt;
&lt;p&gt;class MyError extends Error {}&lt;/p&gt;
&lt;p&gt;const text = &amp;quot;test&amp;quot;;&lt;/p&gt;
&lt;p&gt;try { &lt;br&gt;
  text.replace(/.+/g, (match) =&amp;gt; { &lt;br&gt;
    throw new MyError(&amp;quot;User error&amp;quot;); &lt;br&gt;
  }); &lt;br&gt;
} catch (error) { &lt;br&gt;
  console.log(error instanceof MyError); // true &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;Same in Python:&lt;/p&gt;
&lt;p&gt;import re&lt;/p&gt;
&lt;p&gt;def my_callback(match): &lt;br&gt;
    raise ValueError(&amp;quot;User exception&amp;quot;)&lt;/p&gt;
&lt;p&gt;try: &lt;br&gt;
    re.sub(r'\d+', my_callback, &amp;quot;test&amp;quot;) &lt;br&gt;
except ValueError as e: &lt;br&gt;
    print(&amp;quot;Caught user exception&amp;quot;)&lt;/p&gt;
&lt;p&gt;And while i didn't confirm it by running code myself, my research &lt;br&gt;
pointed to Java, C#, C++, Rust and Ruby doing the same thing.&lt;/p&gt;
&lt;p&gt;So it seems to me, it is standard convention in most popular languages &lt;br&gt;
to let user exceptions propagate transparent. &lt;br&gt;
PHP would be an outlier, if it started wrapping them inside &lt;br&gt;
PregException. I don't think this would be the right call.&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;Sascha&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Freitags habe ich immer frei: Wir arbeiten bei F&amp;amp;P in einer &lt;br&gt;
4-Tage-Woche. &lt;em&gt;#32istdasneue40&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;F&amp;amp;P ♡ Creating Communities&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.fp.de"&gt;https://www.fp.de&lt;/a&gt;  &lt;br&gt;
&lt;a href="https://www.linkedin.com/company/f&amp;amp;p-gmbh-feig-&amp;amp;-partner/"&gt;https://www.linkedin.com/company/f&amp;amp;p-gmbh-feig-&amp;amp;-partner/&lt;/a&gt;  &lt;br&gt;
&lt;a href="https://www.instagram.com/fp_creating_communities/"&gt;https://www.instagram.com/fp_creating_communities/&lt;/a&gt;  &lt;br&gt;
&lt;a href="https://www.kununu.com/de/fundp"&gt;https://www.kununu.com/de/fundp&lt;/a&gt; &lt;br&gt;
F&amp;amp;P GmbH&lt;/p&gt;
&lt;p&gt;Feldstraße 53 &lt;br&gt;
95152 Selbitz&lt;/p&gt;
&lt;p&gt;Tel. 09280 - 98 11 18 - 0&lt;/p&gt;
&lt;p&gt;Sitz der Gesellschaft: Feldstraße 53, 95152 &lt;br&gt;
Selbitz &lt;br&gt;
Geschäftsführer: Dr. Ingmar Ackermann, Frank Noack &lt;br&gt;
Amtsgericht Hof, &lt;br&gt;
HRB 3352&lt;/p&gt;
</description><guid>e2efc02a-af5c-4017-881e-f5fbb228c09a@fp.de</guid><pubDate>Mon, 14 Sep 2026 12:56:02 +0000</pubDate></item><item><title>RFC karma request</title><link>https://externals.io/message/132498</link><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;I created an account on &lt;a href="http://wiki.php.net" rel="nofollow" target="_blank"&gt;wiki.php.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Username: mnapoli&lt;/p&gt;
&lt;p&gt;My plan is to create a RFC for &lt;a href="https://github.com/php/php-src/pull/23558" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23558&lt;/a&gt; (allowing runtime distributors to ship a single binary for both CLI and FPM)&lt;/p&gt;
&lt;p&gt;My GitHub profile: &lt;a href="https://github.com/mnapoli/" rel="nofollow" target="_blank"&gt;https://github.com/mnapoli/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you! &lt;br&gt;
Matthieu Napoli&lt;/p&gt;
</description><guid>e414bb68-48e0-41b9-859a-c3bb2b320634@slotai15m08</guid><pubDate>Mon, 14 Sep 2026 12:32:03 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132497</link><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey internals,&lt;/p&gt;
&lt;p&gt;I would like to open the discussion to &amp;quot;End PEAR Project Endorsement&amp;quot;: &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/end_pear_endorsement" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/end_pear_endorsement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Shouldn't we first unbundle it from php-src and then move to the static &lt;br&gt;
archive or is the pear install (which I think is used in Windows build in &lt;br&gt;
some cases) still work?&lt;/p&gt;
&lt;p&gt;I plan to resume the work on that PR in October or November when I should &lt;br&gt;
have more time but it would be good if someone could check if that move to &lt;br&gt;
static archive cannot break anything in php-src.&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;/p&gt;
&lt;p&gt;Jakub&lt;/p&gt;
</description><guid>CAEKnhAFGTfqc7UCkV+ZFxeYNGU36BxDO_hU0HewfZB+ipyRNNw@mail.gmail.com</guid><pubDate>Mon, 14 Sep 2026 11:57:02 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132496</link><description>&lt;blockquote&gt;
&lt;p&gt;Additionally, there is another good news. Chuck from PEAR made an &lt;br&gt;
effort to recover the missing bug pages and was successful. &lt;br&gt;
Thankfully, he now can and will provide us with everything we need for &lt;br&gt;
the archive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's amazing news and very very welcome! Thank you for coordinating &lt;br&gt;
with Chuck and thanks Chuck for unearthing the data!&lt;/p&gt;
&lt;p&gt;Smile, &lt;br&gt;
Juliette&lt;/p&gt;
</description><guid>6AA7D7FA.5070402@adviesenzo.nl</guid><pubDate>Mon, 14 Sep 2026 11:18:18 +0000</pubDate></item><item><title>PHP 8.6 Branch Cut - 1 Week Warning</title><link>https://externals.io/message/132495</link><description>&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;This is your one‑week warning for the PHP 8.6 branch cut.&lt;/p&gt;
&lt;p&gt;Next Tuesday (September 22) we will create the PHP-8.6 branch as part of &lt;br&gt;
the packaging of PHP 8.6.0RC1. At that point, master will move to PHP &lt;br&gt;
8.7, and the default expectation will be that changes target PHP 8.7. If &lt;br&gt;
patches need to be made against PHP 8.6, please ping the PHP 8.6 release &lt;br&gt;
managers team for review.&lt;/p&gt;
&lt;p&gt;The branch cut also marks the hard feature freeze: even features that do &lt;br&gt;
not require an RFC can no longer be incorporated into PHP 8.6 and will &lt;br&gt;
need to wait for a future release.&lt;/p&gt;
&lt;p&gt;For those of us with karma, the merge workflow for bug fixes will change &lt;br&gt;
after the branch cut: PHP-8.5 will get merged into PHP-8.6, and PHP-8.6 &lt;br&gt;
into master. Please keep an eye on GitHub when merging bug fixes to &lt;br&gt;
ensure they land on the correct branches.&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
Your PHP 8.6 RM team, &lt;br&gt;
Matteo Beccati, Joe Ferguson, and Daniel Scherzer&lt;/p&gt;
</description><guid>dc79862a-aae7-48fb-878d-3c35ba52c9a3@php.net</guid><pubDate>Mon, 14 Sep 2026 09:13:40 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132494</link><description>&lt;p&gt;در تاریخ دوشنبه ۱۴ سپتامبر ۲۰۲۶، ۱۰:۱۲ Tim Düsterhus &lt;a href="mailto:tim@bastelstu.be"&gt;tim@bastelstu.be&lt;/a&gt; &lt;br&gt;
نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Following recent discussions regarding performance benchmarking &lt;br&gt;
methodology &lt;br&gt;
for the array_str_contains proposal, the benchmark tests have been &lt;br&gt;
removed &lt;br&gt;
to better align with the feedback received on the project's testing &lt;br&gt;
scope &lt;br&gt;
and requirements.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Can you please keep all the discussion and updates related to your RFC &lt;br&gt;
within the same official discussion thread? Creating new threads for &lt;br&gt;
everything makes it much harder for users to find what opinions and &lt;br&gt;
changes went into the RFC, since there is no link between them.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;Due to some technical issues, the previous email thread is no longer &lt;br&gt;
accessible. To follow the recommendation of keeping all discussions in a &lt;br&gt;
single, official thread, we will be continuing the conversation regarding &lt;br&gt;
the array_str_contains() RFC here.&lt;/p&gt;
&lt;p&gt;Looking forward to your feedback and continuing the discussion in this &lt;br&gt;
thread.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5uFocOEnhy_zaTWCPETJNrX0mBwM5CHz=yVjTPpnHcx3A@mail.gmail.com</guid><pubDate>Mon, 14 Sep 2026 08:34:37 +0000</pubDate></item><item><title>Fwd: PHP feature suggestion (static property data access)</title><link>https://externals.io/message/132493</link><description>&lt;p&gt;Hey Vilius,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My suggestions would be to create something similar for class &lt;br&gt;
properties f.e. &lt;br&gt;
*MyClass::properties::name *could return &amp;quot;name&amp;quot; or some built-in meta &lt;br&gt;
data object of that property containing more information(type, &lt;br&gt;
nullable, public/private etc.). &lt;br&gt;
... &lt;br&gt;
Let me know what you think. I could spend some time defining more &lt;br&gt;
specific documentation of how I would solve it, maybe write and RFC. &lt;br&gt;
My first idea was to write you, maybe there is similar ideas already &lt;br&gt;
reached you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maybe you want to check out &lt;br&gt;
&lt;a href="https://news-web.php.net/php.internals/120256" rel="nofollow" target="_blank"&gt;https://news-web.php.net/php.internals/120256&lt;/a&gt; -- it's been discussed &lt;br&gt;
under this proposal, and likely has some helpful context.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Cheers &lt;br&gt;
Nick&lt;/p&gt;
</description><guid>6fb65b00-8805-4178-b66a-ed36ad853cb0@nicksdot.dev</guid><pubDate>Mon, 14 Sep 2026 06:52:03 +0000</pubDate></item><item><title>Account verification</title><link>https://externals.io/message/132492</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I recently registered an account on &lt;a href="http://wiki.php.net" rel="nofollow" target="_blank"&gt;wiki.php.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Username: mahdi&lt;/p&gt;
&lt;p&gt;As requested in the registration form, I am sending this email to &lt;br&gt;
confirm &lt;br&gt;
that I am a human, not a bot. I have 12 years of experience as a PHP &lt;br&gt;
developer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome! Can you please shortly explain what you are planning to do with &lt;br&gt;
your account? Do you have an RFC planned or a PR ready?&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>b0bc89f9f936f9b32b2caa5c80ff64ab@bastelstu.be</guid><pubDate>Mon, 14 Sep 2026 06:44:13 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132491</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Following recent discussions regarding performance benchmarking &lt;br&gt;
methodology &lt;br&gt;
for the array_str_contains proposal, the benchmark tests have been &lt;br&gt;
removed &lt;br&gt;
to better align with the feedback received on the project's testing &lt;br&gt;
scope &lt;br&gt;
and requirements.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Can you please keep all the discussion and updates related to your RFC &lt;br&gt;
within the same official discussion thread? Creating new threads for &lt;br&gt;
everything makes it much harder for users to find what opinions and &lt;br&gt;
changes went into the RFC, since there is no link between them.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>306f295492b337459d375e0974ee323e@bastelstu.be</guid><pubDate>Mon, 14 Sep 2026 06:42:47 +0000</pubDate></item><item><title>Fwd: PHP feature suggestion (static property data access)</title><link>https://externals.io/message/132490</link><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I am writing with PHP feature suggestion, regarding static information &lt;br&gt;
about &lt;em&gt;class properties.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now in PHP there's a feature feature letting you access full class name &lt;br&gt;
statically (getting static class name via &lt;em&gt;MyClass::class&lt;/em&gt;). &lt;br&gt;
It's very minimalistic but even that allows users to have one single point &lt;br&gt;
of truth for full class name.&lt;/p&gt;
&lt;p&gt;My suggestions would be to create something similar for class properties &lt;br&gt;
f.e. &lt;br&gt;
*MyClass::properties::name *could return &amp;quot;name&amp;quot; or some built-in meta data &lt;br&gt;
object of that property containing more information(type, nullable, &lt;br&gt;
public/private etc.).&lt;/p&gt;
&lt;p&gt;As weird as it sounds - even returning the same &amp;quot;name&amp;quot; value would let IDE &lt;br&gt;
and libraries to get information more statically. &lt;br&gt;
There are plenty of libraries that asks developers to use field names as &lt;br&gt;
strings. For example - Doctrine ORM, you need field names when defining &lt;br&gt;
relations or generating DQL queries. For classes you are using ::class &lt;br&gt;
syntax, but for fields you need to hardcode string values that are pain to &lt;br&gt;
refactor later on or to run static analysis.&lt;/p&gt;
&lt;p&gt;I understand that whole idea is kind of abstract but I am sure that a lot &lt;br&gt;
of PHP developers who are targeting to write cleaner code would approve of &lt;br&gt;
something similar to this to help reduce hardcoded value in their code.&lt;/p&gt;
&lt;p&gt;Let me know what you think. I could spend some time defining more specific &lt;br&gt;
documentation of how I would solve it, maybe write and RFC. My first idea &lt;br&gt;
was to write you, maybe there is similar ideas already reached you.&lt;/p&gt;
&lt;p&gt;Vilius Buividavičius&lt;/p&gt;
</description><guid>CALU87_s09mn2nu_tqn7qsi84t77m46o6HqiSSiRi41=1K9Cc8A@mail.gmail.com</guid><pubDate>Mon, 14 Sep 2026 06:03:09 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132489</link><description>&lt;p&gt;Hey everyone,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, there is one detail I would want to double check with you &lt;br&gt;
all. The RFC currently has this sentence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attempts to find solutions with PEAR maintainers, directly and &lt;br&gt;
through official channels, did not lead to results.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Given that Chuck now got in touch and is in favour, I am not happy &lt;br&gt;
leaving this sentence unchanged in the RFC. I'd much rather remove it &lt;br&gt;
(or strike it and amend the agreement?).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I made the following changes to the RFC:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Removed the mentioned sentence and added a section to reflect the new &lt;br&gt;
situation.&lt;/li&gt;
&lt;li&gt;Removed &amp;quot;Future Scope&amp;quot; and added explicit timeline to the proposal &lt;br&gt;
(coordinated with Derick).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a major change, which means the discussion remains open until at &lt;br&gt;
least 2026-09-27.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Additionally, there is another good news. Chuck from PEAR made an effort &lt;br&gt;
to recover the missing bug pages and was successful. Thankfully, he now &lt;br&gt;
can and will provide us with everything we need for the archive.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Cheers &lt;br&gt;
Nick&lt;/p&gt;
</description><guid>ccec9499-6568-4304-9f66-24264a6b8de2@nicksdot.dev</guid><pubDate>Mon, 14 Sep 2026 04:14:16 +0000</pubDate></item><item><title>[RFC Update] array_str_contains(): Removal of performance benchmark tests</title><link>https://externals.io/message/132488</link><description>&lt;p&gt;Following recent discussions regarding performance benchmarking methodology &lt;br&gt;
for the array_str_contains proposal, the benchmark tests have been removed &lt;br&gt;
to better align with the feedback received on the project's testing scope &lt;br&gt;
and requirements.&lt;/p&gt;
</description><guid>CA+Jcf5vfNVkTNK9E8bFYvJU33DzSN-RM4xNfmZNDxCYk-tThyw@mail.gmail.com</guid><pubDate>Sun, 13 Sep 2026 19:40:23 +0000</pubDate></item><item><title>EBNF</title><link>https://externals.io/message/132487</link><description>&lt;blockquote&gt;
&lt;p&gt;Dear internals&lt;/p&gt;
&lt;p&gt;After enviously looking at pythons grammar &lt;br&gt;
(&lt;a href="http://docs.python.org/dev/reference/grammar.html" rel="nofollow" target="_blank"&gt;http://docs.python.org/dev/reference/grammar.html&lt;/a&gt;) I keep feeling &lt;br&gt;
that PHP is missing out on a lot of interesting meta projects by not &lt;br&gt;
having an official EBNF.&lt;/p&gt;
&lt;p&gt;Building your own PHP parser is &lt;em&gt;very&lt;/em&gt; hard and is PhD (Paul Biggar:) &lt;br&gt;
level stuff if you wan't to get all the edge cases right. Having &lt;em&gt;the&lt;/em&gt; &lt;br&gt;
official EBNF would make this easier.&lt;/p&gt;
&lt;p&gt;I know there is a lot of historical reasons for this and that creating &lt;br&gt;
and maintaing said EBNF is a very serious task, one that is maybe too &lt;br&gt;
big for a non-paying open source project.&lt;/p&gt;
&lt;p&gt;But still I have to ask if I'm the only one thinking about this or is &lt;br&gt;
there something I'm being completely ignorant about?&lt;/p&gt;
&lt;p&gt;Happy newyear! &lt;br&gt;
Rune Kaagaard&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I see this post is already 15 years old, but having a well defined EBNF &lt;br&gt;
grammar for PHP would invaluable for 3rd party tool designers.&lt;/p&gt;
&lt;p&gt;We have just recently completed the first EBNF mapping for PHP 8.5 from &lt;br&gt;
source code, and plan to also map all future versions of PHP. I&lt;/p&gt;
&lt;p&gt;If there is enough interest we will also consider mapping older versions &lt;br&gt;
of PHP.&lt;/p&gt;
&lt;p&gt;You can browse, and download the EBNF in machine-readable and human &lt;br&gt;
reabile format from this website: &lt;br&gt;
&lt;a href="https://zoclee.com/php-grammar" rel="nofollow" target="_blank"&gt;https://zoclee.com/php-grammar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;or from the GitHub repository at &lt;br&gt;
&lt;a href="https://github.com/zoclee/php-grammar" rel="nofollow" target="_blank"&gt;https://github.com/zoclee/php-grammar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
{Zoclee}&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;/p&gt;
&lt;p&gt;Alwyn Bester&lt;/p&gt;
</description><guid>d254b9e9-b2aa-4d54-bbcc-51b330591851@zoclee.com</guid><pubDate>Sun, 13 Sep 2026 08:40:32 +0000</pubDate></item><item><title>Account verification</title><link>https://externals.io/message/132486</link><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I recently registered an account on &lt;a href="http://wiki.php.net" rel="nofollow" target="_blank"&gt;wiki.php.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Username: mahdi&lt;/p&gt;
&lt;p&gt;As requested in the registration form, I am sending this email to confirm &lt;br&gt;
that I am a human, not a bot. I have 12 years of experience as a PHP &lt;br&gt;
developer.&lt;/p&gt;
&lt;p&gt;You can view my GitHub profile here: &lt;a href="https://github.com/MahdiAkrami01" rel="nofollow" target="_blank"&gt;https://github.com/MahdiAkrami01&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you. Regards&lt;/p&gt;
</description><guid>CAP4jrZzQSgeqUCg2AFsepdsE5ZawmcNcnaLRBnEUkmSd=_GAFQ@mail.gmail.com</guid><pubDate>Sat, 12 Sep 2026 18:51:23 +0000</pubDate></item><item><title>php-grammar: source-backed EBNF grammar for PHP</title><link>https://externals.io/message/132485</link><description>&lt;p&gt;Hi all,&lt;/p&gt;
&lt;p&gt;I’d like to make the PHP development community aware of a project I’ve &lt;br&gt;
been working on called &lt;em&gt;php-grammar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The project provides versioned, source-backed EBNF grammar definitions &lt;br&gt;
for PHP language syntax, together with matching human-readable &lt;br&gt;
documentation.&lt;/p&gt;
&lt;p&gt;The current PHP 8.5 grammar has been developed and audited against the &lt;br&gt;
PHP parser source, with the goal of representing the language syntax as &lt;br&gt;
accurately and completely as possible while keeping the grammar useful &lt;br&gt;
to tooling authors and other consumers.&lt;/p&gt;
&lt;p&gt;The project is independent and is not presented as an official PHP &lt;br&gt;
specification. My main reason for posting here is to invite technical &lt;br&gt;
review from people familiar with the PHP parser and language implementation.&lt;/p&gt;
&lt;p&gt;In particular, I’d be very interested in feedback on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;places where the EBNF does not accurately represent parser behaviour;&lt;/li&gt;
&lt;li&gt;syntax that cannot reasonably be represented in pure EBNF without &lt;br&gt;
additional semantic restrictions;&lt;/li&gt;
&lt;li&gt;contextual or parser-specific constraints that should be documented &lt;br&gt;
more clearly; and&lt;/li&gt;
&lt;li&gt;whether the overall approach could be useful to parser, IDE, &lt;br&gt;
documentation, static-analysis, or other tooling projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Website: &lt;br&gt;
&lt;a href="https://zoclee.com/php-grammar" rel="nofollow" target="_blank"&gt;https://zoclee.com/php-grammar&lt;/a&gt; &lt;a href="https://zoclee.com/php-grammar"&gt;https://zoclee.com/php-grammar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHub: &lt;br&gt;
&lt;a href="https://github.com/Zoclee/php-grammar" rel="nofollow" target="_blank"&gt;https://github.com/Zoclee/php-grammar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Any corrections, criticism, or suggestions would be very welcome.&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
{Zoclee}&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;/p&gt;
&lt;p&gt;Alwyn Bester &lt;br&gt;
Founder and CEO&lt;/p&gt;
</description><guid>5c0fc289-8a5d-4556-8957-b84244825cf4@zoclee.com</guid><pubDate>Sat, 12 Sep 2026 17:50:27 +0000</pubDate></item><item><title> Architectural discussion: Composable functional patterns vs. specialized native functions in PHP's standard library</title><link>https://externals.io/message/132484</link><description>&lt;p&gt;در تاریخ شنبه ۱۲ سپتامبر ۲۰۲۶، ۰۳:۱۹ Kamil Tekiela &lt;a href="mailto:tekiela246@gmail.com"&gt;tekiela246@gmail.com&lt;/a&gt; &lt;br&gt;
نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Sepehr,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I believe discussing these fundamental trade-offs will help provide &lt;br&gt;
clearer guidelines for future RFC proposals and the continuous evolution of &lt;br&gt;
PHP's standard library.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What are you trying to accomplish with this discussion? What is the &lt;br&gt;
goal? I am asking because I don't quite understand your questions, and &lt;br&gt;
this whole topic seems very vague. What are these clearer guidelines?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Over recent major versions, modern PHP has embraced functional &lt;br&gt;
programming idioms with first-class callable syntax, arrow functions, and &lt;br&gt;
generic higher-order operations. While this compositional style &lt;br&gt;
significantly enhances code expressiveness and flexibility, it introduces &lt;br&gt;
notable architectural considerations:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would never consider first-class callables or arrow functions to be &lt;br&gt;
functional programming idioms. Sure, higher-order functions are &lt;br&gt;
heavily used in functional programming, but they are just as useful in &lt;br&gt;
object-oriented programming or procedural programming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Performance &amp;amp; Engine Overhead: &lt;br&gt;
When composing generic higher-order utilities (such as array/string &lt;br&gt;
transformers, filters, and mapping operations), what is the acceptable &lt;br&gt;
threshold for closure invocation overhead and VM context switching in &lt;br&gt;
performance-critical paths? In what scenarios do we consider this overhead &lt;br&gt;
significant enough to warrant dedicated, low-level C implementations in the &lt;br&gt;
engine?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don't know if that has ever been a major consideration. We consider &lt;br&gt;
performance on a case-by-case basis. Just like with your recent &lt;br&gt;
proposal, we ask for some hard evidence. How often is it causing a &lt;br&gt;
performance bottleneck in real projects? What kind of performance &lt;br&gt;
improvement would be expected if it were a dedicated function? Etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PHP has traditionally provided rich, specialized functions for common &lt;br&gt;
data manipulation tasks. How do we balance keeping the standard library &lt;br&gt;
lean and orthogonal versus providing high-utility, specialized native &lt;br&gt;
functions that eliminate recurring boilerplate across userland applications?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PHP has never been known as a good example in this regard. The &lt;br&gt;
standard library is a complete mess (everything but a kitchen sink). &lt;br&gt;
In recent years, the consensus has been that we only add functions &lt;br&gt;
that provide behaviour which is either impossible or very difficult to &lt;br&gt;
emulate in userland, or so ubiquitous that it deserves a dedicated &lt;br&gt;
function. For example, &lt;code&gt;str_contains&lt;/code&gt; was added to simplify &lt;code&gt;strpos !== false&lt;/code&gt;, &lt;code&gt;array_first&lt;/code&gt; was added to simplify &lt;br&gt;
&lt;code&gt;$array[array_key_first($array)]&lt;/code&gt;, &lt;code&gt;array_is_list&lt;/code&gt; was added to expose &lt;br&gt;
functionality which was quite difficult to emulate in userland. All of &lt;br&gt;
these are examples of very common patterns that were used verbatim &lt;br&gt;
sometimes hundreds of times in a single project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Performance Benchmarking &amp;amp; JIT Optimization: &lt;br&gt;
As the JIT compiler matures, should the engine rely more heavily on JIT &lt;br&gt;
optimizations to inline higher-order functional patterns, or will &lt;br&gt;
specialized native C functions always remain the preferred standard for &lt;br&gt;
mission-critical operations?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;JIT is only useful for highly specialised applications. For most &lt;br&gt;
applications, such as websites, JIT doesn't offer a lot of benefits. &lt;br&gt;
But besides that, I don't really understand this question. It seems &lt;br&gt;
like a non-sequitur to me.&lt;/p&gt;
&lt;p&gt;I won't even attempt to answer the last question, as it seems so vague &lt;br&gt;
to me; one could write a whole book about it and still have more to &lt;br&gt;
add.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Kamil&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Kamil,&lt;/p&gt;
&lt;p&gt;Thank you for the direct feedback. I appreciate you pointing out the &lt;br&gt;
vagueness in my initial questions; that was not my intention, but I see now &lt;br&gt;
that I was approaching the topic from too high an abstraction level.&lt;/p&gt;
&lt;p&gt;To clarify my goal: I am not looking for a philosophical treatise, but &lt;br&gt;
rather to understand the practical &amp;quot;threshold&amp;quot; the core team uses when &lt;br&gt;
deciding whether a common pattern (like string searching within an array) &lt;br&gt;
should be implemented as a specialized native function versus leaving it to &lt;br&gt;
userland composition (like array_filter with a closure).&lt;/p&gt;
&lt;p&gt;You mentioned that performance is considered on a case-by-case basis with &lt;br&gt;
hard evidence. That is exactly where I want to focus.&lt;/p&gt;
&lt;p&gt;Instead of discussing generalities, I will prepare a concrete benchmark. I &lt;br&gt;
plan to compare:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The overhead of common compositional patterns (e.g., array_filter + &lt;br&gt;
str_contains inside a closure).&lt;/li&gt;
&lt;li&gt;The performance of a potential specialized native implementation (e.g., &lt;br&gt;
a hypothetical array_str_contains).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal is to provide the &amp;quot;hard evidence&amp;quot; you mentioned, showing &lt;br&gt;
specifically where the overhead of closure invocation and VM context &lt;br&gt;
switching becomes a measurable bottleneck in common real-world scenarios.&lt;/p&gt;
&lt;p&gt;I will follow up with the results once the benchmarking is complete.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5tKXLGBhYK7sZoxm9C9890sPPTFxLDMxd7Kw4Hb9UAJjw@mail.gmail.com</guid><pubDate>Sat, 12 Sep 2026 00:50:09 +0000</pubDate></item><item><title> Architectural discussion: Composable functional patterns vs. specialized native functions in PHP's standard library</title><link>https://externals.io/message/132483</link><description>&lt;p&gt;Hi Sepehr,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I believe discussing these fundamental trade-offs will help provide clearer guidelines for future RFC proposals and the continuous evolution of PHP's standard library.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What are you trying to accomplish with this discussion? What is the &lt;br&gt;
goal? I am asking because I don't quite understand your questions, and &lt;br&gt;
this whole topic seems very vague. What are these clearer guidelines?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Over recent major versions, modern PHP has embraced functional programming idioms with first-class callable syntax, arrow functions, and generic higher-order operations. While this compositional style significantly enhances code expressiveness and flexibility, it introduces notable architectural considerations:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would never consider first-class callables or arrow functions to be &lt;br&gt;
functional programming idioms. Sure, higher-order functions are &lt;br&gt;
heavily used in functional programming, but they are just as useful in &lt;br&gt;
object-oriented programming or procedural programming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Performance &amp;amp; Engine Overhead: &lt;br&gt;
When composing generic higher-order utilities (such as array/string transformers, filters, and mapping operations), what is the acceptable threshold for closure invocation overhead and VM context switching in performance-critical paths? In what scenarios do we consider this overhead significant enough to warrant dedicated, low-level C implementations in the engine?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don't know if that has ever been a major consideration. We consider &lt;br&gt;
performance on a case-by-case basis. Just like with your recent &lt;br&gt;
proposal, we ask for some hard evidence. How often is it causing a &lt;br&gt;
performance bottleneck in real projects? What kind of performance &lt;br&gt;
improvement would be expected if it were a dedicated function? Etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PHP has traditionally provided rich, specialized functions for common data manipulation tasks. How do we balance keeping the standard library lean and orthogonal versus providing high-utility, specialized native functions that eliminate recurring boilerplate across userland applications?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PHP has never been known as a good example in this regard. The &lt;br&gt;
standard library is a complete mess (everything but a kitchen sink). &lt;br&gt;
In recent years, the consensus has been that we only add functions &lt;br&gt;
that provide behaviour which is either impossible or very difficult to &lt;br&gt;
emulate in userland, or so ubiquitous that it deserves a dedicated &lt;br&gt;
function. For example, &lt;code&gt;str_contains&lt;/code&gt; was added to simplify &lt;code&gt;strpos !== false&lt;/code&gt;, &lt;code&gt;array_first&lt;/code&gt; was added to simplify &lt;br&gt;
&lt;code&gt;$array[array_key_first($array)]&lt;/code&gt;, &lt;code&gt;array_is_list&lt;/code&gt; was added to expose &lt;br&gt;
functionality which was quite difficult to emulate in userland. All of &lt;br&gt;
these are examples of very common patterns that were used verbatim &lt;br&gt;
sometimes hundreds of times in a single project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Performance Benchmarking &amp;amp; JIT Optimization: &lt;br&gt;
As the JIT compiler matures, should the engine rely more heavily on JIT optimizations to inline higher-order functional patterns, or will specialized native C functions always remain the preferred standard for mission-critical operations?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;JIT is only useful for highly specialised applications. For most &lt;br&gt;
applications, such as websites, JIT doesn't offer a lot of benefits. &lt;br&gt;
But besides that, I don't really understand this question. It seems &lt;br&gt;
like a non-sequitur to me.&lt;/p&gt;
&lt;p&gt;I won't even attempt to answer the last question, as it seems so vague &lt;br&gt;
to me; one could write a whole book about it and still have more to &lt;br&gt;
add.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Kamil&lt;/p&gt;
</description><guid>CAGBsUrcQqNC1LVi5316tcdOeY7RnmH=47_344xFSWUsSJnnHtA@mail.gmail.com</guid><pubDate>Fri, 11 Sep 2026 23:49:05 +0000</pubDate></item><item><title>Architectural discussion: Composable functional patterns vs. specialized native functions in PHP's standard library</title><link>https://externals.io/message/132482</link><description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I would like to open a broader technical discussion regarding the long-term &lt;br&gt;
design philosophy of PHP's standard library, specifically focusing on the &lt;br&gt;
trade-offs between composable higher-order functions and dedicated native &lt;br&gt;
engine functions.&lt;/p&gt;
&lt;p&gt;Over recent major versions, modern PHP has embraced functional programming &lt;br&gt;
idioms with first-class callable syntax, arrow functions, and generic &lt;br&gt;
higher-order operations. While this compositional style significantly &lt;br&gt;
enhances code expressiveness and flexibility, it introduces notable &lt;br&gt;
architectural considerations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Performance &amp;amp; Engine Overhead: &lt;br&gt;
When composing generic higher-order utilities (such as array/string &lt;br&gt;
transformers, filters, and mapping operations), what is the acceptable &lt;br&gt;
threshold for closure invocation overhead and VM context switching in &lt;br&gt;
performance-critical paths? In what scenarios do we consider this overhead &lt;br&gt;
significant enough to warrant dedicated, low-level C implementations in the &lt;br&gt;
engine?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Standard Library Cohesion &amp;amp; API Surface: &lt;br&gt;
PHP has traditionally provided rich, specialized functions for common data &lt;br&gt;
manipulation tasks. How do we balance keeping the standard library lean and &lt;br&gt;
orthogonal versus providing high-utility, specialized native functions that &lt;br&gt;
eliminate recurring boilerplate across userland applications?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Performance Benchmarking &amp;amp; JIT Optimization: &lt;br&gt;
As the JIT compiler matures, should the engine rely more heavily on JIT &lt;br&gt;
optimizations to inline higher-order functional patterns, or will &lt;br&gt;
specialized native C functions always remain the preferred standard for &lt;br&gt;
mission-critical operations?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edge Cases, Type Consistency &amp;amp; Encodings: &lt;br&gt;
When designing or evolving standard functions across different data domains &lt;br&gt;
(strings, arrays, multibyte handling, streams), what architectural &lt;br&gt;
guidelines should we establish to ensure uniform behavior, strict typing &lt;br&gt;
semantics, and consistent error handling across the entire API surface?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I believe discussing these fundamental trade-offs will help provide clearer &lt;br&gt;
guidelines for future RFC proposals and the continuous evolution of PHP's &lt;br&gt;
standard library.&lt;/p&gt;
&lt;p&gt;I look forward to hearing your perspectives and insights.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5sZ4SH=9UOOGzO6Q79R7i4KNMZL90xigQ_OS1px-7iFhQ@mail.gmail.com</guid><pubDate>Fri, 11 Sep 2026 23:08:59 +0000</pubDate></item><item><title>PHP 8.6.0beta3 is available for testing</title><link>https://externals.io/message/132481</link><description>&lt;p&gt;PHP 8.6.0beta3 has just been released and may be downloaded from &lt;br&gt;
&lt;a href="https://downloads.php.net/~svpernova09/" rel="nofollow" target="_blank"&gt;https://downloads.php.net/~svpernova09/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or use the git tag: php-8.6.0beta3&lt;/p&gt;
&lt;p&gt;This is an early test release and not intended for production use.&lt;/p&gt;
&lt;p&gt;Windows binaries are available at: &lt;a href="https://windows.php.net/qa/" rel="nofollow" target="_blank"&gt;https://windows.php.net/qa/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please test it carefully, and report any bugs at &lt;br&gt;
&lt;a href="https://github.com/php/php-src/issues/new?template=bug_report.yml" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/issues/new?template=bug_report.yml&lt;/a&gt; &lt;br&gt;
on GitHub.&lt;/p&gt;
&lt;p&gt;8.6.0 RC1 should be expected in 2 weeks, i.e. on 24 Sep 2026.&lt;/p&gt;
&lt;p&gt;Hash values and PGP signatures can be found below or at &lt;br&gt;
&lt;a href="https://gist.github.com/svpernova09/b5dc0b7b2ec231b3a5db54793c7ec1aa" rel="nofollow" target="_blank"&gt;https://gist.github.com/svpernova09/b5dc0b7b2ec231b3a5db54793c7ec1aa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you, and happy testing!&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Matteo Beccati, Joe Ferguson &amp;amp; Daniel Scherzer&lt;/p&gt;
&lt;p&gt;php-8.6.0beta3.tar.bz2 &lt;br&gt;
SHA256 hash: &lt;br&gt;
e1517694d025b947430bc31afe41e6e134f68782d944542b962cf0b5132b1936 &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iQIzBAABCgAdFiEEXP8Xtk3BwkT10OrD5DU14usZAQ4FAmqgQm0ACgkQ5DU14usZ &lt;br&gt;
AQ5MOw//YswpeEyRxHl7p23a25ppbdetos/rIABsGBA5mfyRSx7xqvbWyFt/Fjhd &lt;br&gt;
Af8nN2rY8T7z4Wto6Q34fEzBCKpQZV23IM7spd89nBscJNG3HdtF5StYq4TFzg9W &lt;br&gt;
O5eS5zsslwGGWTz/iESthjqD6fiPTfzJ/Qc9DbWN5pNee7E+55fnJ6suGG9G+J4m &lt;br&gt;
g1M0v+vtWg3mmAsSIDJZ/Cnx6fuD2+nNYK31EwJot88J3TOQkiGnZN191zu0TjZG &lt;br&gt;
2m6yAX6Nfuie+NvwWCUi8lYh6AaMIta148DAQQDcL0GoN0heDh1uTTK7gmEkgd0R &lt;br&gt;
WWdtEQSWIN05/rCvm5eiL8BN945JQMBmmvFBjIac86to6WS35X0g7G7xVs79fuCZ &lt;br&gt;
y6BmUAIyekpP+wMFEcytfjQT07mzlvtc58DHbpDTXF5/KHSP1jeiweQVR1DlxlRW &lt;br&gt;
D/mColQiq9I3aaB5fH4U/z1HAUzDPsKh71tZvIFekgGJxz1afQPvrI68mJaQGBuu &lt;br&gt;
zIQ/vWjahxXol8o0DA9K7h90orn5MkNOg8eRyyA8Zono6JT9FgLErSEn2I1hqGOM &lt;br&gt;
VBWZuYpXgtLBTgfazg1FUxgAmJDadPvOdl3UwFyvvM+78VY/xBmvft5ep1QmfRC7 &lt;br&gt;
KF0rzzZNYjwoP33pJCyFz3YgHoXjm/0U2J5sskX71tkGu+nyR40= &lt;br&gt;
=6MMD &lt;br&gt;
-----END PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;php-8.6.0beta3.tar.gz &lt;br&gt;
SHA256 hash: &lt;br&gt;
2499bb217d77566319c0e971a36041484b8cb7181ef5adf282a751e132015e8c &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iQIzBAABCgAdFiEEXP8Xtk3BwkT10OrD5DU14usZAQ4FAmqgQm0ACgkQ5DU14usZ &lt;br&gt;
AQ4SYg//bLujzUXMuG5v9zHvfelOtlYxYT3eD2OuUtnZLLENi4+P+bLxCwj+Mk39 &lt;br&gt;
FztxJaAitUulrrARebAmVCCKX6o0nvCbA8jwB9i/tEeA4aGWevCRCKMBW7rlqZcH &lt;br&gt;
v9mXgQkDI5Uaq4e53IsTuTsXJtQVkd1LgDad/R3Aq1o48Vs+KRNcfuJcyAopYvgd &lt;br&gt;
Naph7iqAoUmlHotb7q46jtHJTq++IaKHhrKuQsdcUJWUYyYaYqXMeCaIvSPUp32l &lt;br&gt;
OMjfUpLL99rp0QuTvX0LtVkfkY46aZtva52xVAtG7tkOpIT7pHnULRIpFuHDzpM9 &lt;br&gt;
2dRB6/u87Ph3cG/VirLdFiKKuaNxVCF7A0yaFooW4BMz4VLATRhOgVuLndFO3Ffb &lt;br&gt;
OcxcHShnwJLH9BXut7P5dO4jIwrrpT5wbdt3mEQMppReGNhQ5rLSePdAeIJdMBdB &lt;br&gt;
ao4NBhT2jNQmUwFdo1mjGdm2gQB2wq5BlPgavijDh0xBPHfWt9xveHN/m89w/Dnh &lt;br&gt;
2z1XrqO4MEKPwHyJMyEj1KaPPSmdLedYuVkZi2DFf+DQoAVeAyHXyuPlf1Zx2kKB &lt;br&gt;
8R7jV/7PTDA+9ygqxd6UamoWjAVRfDC1rFnQXQC5iElh2Pn5xThO2C6lCgJqttoY &lt;br&gt;
7/uymG95+4dt8dPggwMhfBvWA4Eds/SZMGzv4OQTALfOhJJP7Og= &lt;br&gt;
=Udya &lt;br&gt;
-----END PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;php-8.6.0beta3.tar.xz &lt;br&gt;
SHA256 hash: &lt;br&gt;
e8daf9546c4d4244dad961b5412734db57823c2e967df3fcfbb819a62d520ea6 &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iQIzBAABCgAdFiEEXP8Xtk3BwkT10OrD5DU14usZAQ4FAmqgQm0ACgkQ5DU14usZ &lt;br&gt;
AQ7gIQ//dlQyQiBO49FNrXqa/GjYTK9FBOynRt90D6rbeiH6MRg8arePKK9Pm1bF &lt;br&gt;
Gulk4KQfH8kgS9fWyDswaA8ah00nK2n6GAH3wU1hpVskLcbMvuLugIvaMRefUcWS &lt;br&gt;
UiwabWY3RiPhmkSeAXI+n43h3gbD955ZuwwfLmWNUMWmu0CSc7VGwI5yiYa0c2V4 &lt;br&gt;
6NxS0M8S7D/glhZSwEq02hVG2P9dBPg8HIdNQOO06lGt+/URV+G1uFqJl1jidNKn &lt;br&gt;
SRRZZJH3OXOQBsqEZVVzf0vnWE3Dh5G/GQKdTV8FM1GfYCU3F8+rMj4pcC1+t8Y/ &lt;br&gt;
iLgnuu4tJ0FiHP0+dlca3Xck3AOe28S7qX616C4rm/XEA6rzVz8i0WAl2IWziwU4 &lt;br&gt;
VfLUtL20Xa4/0URiInhiYWQf6w/OK5OLGaMO3GRgPjHlF1SqaSu66+zZzTitn1hd &lt;br&gt;
lNLMVLULju/r8+KUFlZOusdw5Rp6kfxbyApIw+EkcN4nVtCzHVxlYwC6lJCOPtNB &lt;br&gt;
+kOScJ619mxv6odAuc6Oj9J/rxxZDfZw5P6eLEwCC2uGHNQBYzQybk0sjTWvMH6T &lt;br&gt;
uY8Hskw4EDfIfrQL+AaC4QA0Nz9li2jC1/oo6c4Pn4q7f/BEwxM13Rf5BnsS3IrU &lt;br&gt;
cFoGoNkfgNDRJbyN76+hAqlIfKFuckeuX9pBMKEJx7VIveTyKxk= &lt;br&gt;
=FO9O &lt;br&gt;
-----END PGP SIGNATURE&lt;/p&gt;
</description><guid>CABj1BaZMLMM5p+Y6QxokJftAJuTE-hhkdh7T1189Y=9g5aWJ6Q@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 22:29:19 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132480</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I would like to sincerely apologize to everyone, especially Yuya, for the &lt;br&gt;
tension in our recent discussions. Moving forward, I would like to keep &lt;br&gt;
this thread strictly focused on the technical merits of the proposed &lt;br&gt;
function.&lt;/p&gt;
&lt;p&gt;Larry, since you were the first to suggest this, I would like to ask for &lt;br&gt;
your feedback: I have prepared a benchmark script and would like to include &lt;br&gt;
it in the RFC so that everyone can run the tests themselves.&lt;/p&gt;
&lt;p&gt;Also, I have cleaned up the C implementation for the function, and I would &lt;br&gt;
appreciate it if you and the others could take a look at it.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
</description><guid>CA+Jcf5viDDRgyYeNwBNH+ChtR-wu2N1k37UFoXEiOWZQzuTwJw@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 21:34:39 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132479</link><description></description><guid>CA+Jcf5uqpFGHesqpjZ3zZfZtxUVkwwaf+e2FXCj36CFbnftLSw@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 21:14:56 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132478</link><description>&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۲۱:۴۴ Juris Evertovskis &lt;a href="mailto:juris@glaive.pro"&gt;juris@glaive.pro&lt;/a&gt; &lt;br&gt;
نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۰۶:۰۶ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;p&gt;‪2026年9月10日(木) 10:07 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I've been following the discussions and recent feedback regarding the &lt;br&gt;
array_str_contains() RFC closely. Performance and speed comparisons have &lt;br&gt;
come up as a key point, especially around whether a dedicated internal C &lt;br&gt;
implementation provides sufficient value compared to a userland foreach &lt;br&gt;
loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around the &lt;br&gt;
benchmarking methodology we're using here. Some of the initial numbers &lt;br&gt;
shared recently don't seem to reflect real-world scenarios or different &lt;br&gt;
data profiles (like varying array sizes, early exits vs worst-case lookups, &lt;br&gt;
UTF-8 strings, and compiler optimization flags like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be &lt;br&gt;
great if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to &lt;br&gt;
evaluate this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these &lt;br&gt;
metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is &lt;br&gt;
coming from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for &lt;br&gt;
everyday developers. I welcome any suggestions, insights, or benchmark &lt;br&gt;
reproductions from the community so we can evaluate this RFC based on &lt;br&gt;
solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals&lt;/p&gt;
&lt;p&gt;For your reference, I have attached the benchmark diff files. (commit &lt;br&gt;
hash is 4982bf45f4786faaa198558dd619f8a4d59e25f0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.diff&lt;/li&gt;
&lt;li&gt;.exp&lt;/li&gt;
&lt;li&gt;.log&lt;/li&gt;
&lt;li&gt;.out&lt;/li&gt;
&lt;li&gt;.php&lt;/li&gt;
&lt;li&gt;.phpt&lt;/li&gt;
&lt;li&gt;.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can not find definite improve performance. &lt;br&gt;
(My PC: WSL Ubuntu 24.04, Ryzen 7 7735HS, 32GB RAM)&lt;/p&gt;
&lt;p&gt;I don't familiar with Zend Engine's performance, However I think &lt;br&gt;
function's performance improvement is limited.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Internals,&lt;/p&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two critical &lt;br&gt;
issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my environment. It &lt;br&gt;
is scientifically impossible to derive any performance conclusions from &lt;br&gt;
code that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend Engine &lt;br&gt;
internals, the methodology applied here lacks the necessary technical rigor &lt;br&gt;
for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, and &lt;br&gt;
engine-aware performance analysis. However, as it stands, the provided &lt;br&gt;
material is effectively contentless and does not offer a basis for a &lt;br&gt;
technical evaluation.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Sepehr&lt;/p&gt;
&lt;p&gt;Hi Sepehr,&lt;/p&gt;
&lt;p&gt;I've also been following the discussions on the mailing list.&lt;/p&gt;
&lt;p&gt;My read is that Yuya has been the one most welcoming to you. He was &lt;br&gt;
putting in a word for you during the discussion about message phrasing, &lt;br&gt;
providing you some guidance and expressing willingness to involve you in &lt;br&gt;
the i18n work. His openness is visible even now — unlike most of us, he is &lt;br&gt;
trying out your code and giving you feedback.&lt;/p&gt;
&lt;p&gt;Therefore it is a bit sad to see you being angry and dismissive at him in &lt;br&gt;
the latest discussions. I think you are mistaking his short statements for &lt;br&gt;
hostility or gatekeeping. My suggestion: stop throwing away his goodwill. &lt;br&gt;
If an experienced contributor is giving you feedback, you should seriously &lt;br&gt;
consider that there might be something true and useful.&lt;/p&gt;
&lt;p&gt;Regarding the latest discussion I would like to add that admitting lack of &lt;br&gt;
expertise in zend engine (or anything else) is usually not seen here as a &lt;br&gt;
sign of weakness, but of honesty. Many of the readers and voters here are &lt;br&gt;
not experts on every detail either. If someone admits not entirely &lt;br&gt;
understanding what's going on, it gives you a chance to provide &lt;br&gt;
explanations and proof instead of dismissing his benchmarks as useless.&lt;/p&gt;
&lt;p&gt;By the way...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just for your information: someone praised my work who holds a high &lt;br&gt;
position in php-src and whom I truly respect—meaning your opinion doesn't &lt;br&gt;
really matter to me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Different open source communities may work differently, but in this one a &lt;br&gt;
reference to an unnamed figure is unlikely to earn you additional respect &lt;br&gt;
or authority. It's best to leave such statements out.&lt;/p&gt;
&lt;p&gt;BR, &lt;br&gt;
Juris&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi Juris,&lt;/p&gt;
&lt;p&gt;Thank you for taking the time to write this and share your perspective.&lt;/p&gt;
&lt;p&gt;You make very fair points, and reading this helped me see things from a &lt;br&gt;
better angle. I let my emotions get the better of me in that interaction &lt;br&gt;
with Yuya, and I genuinely appreciate you pointing it out.&lt;/p&gt;
&lt;p&gt;I will reach out to Yuya to clear the air, and I'll keep your advice in &lt;br&gt;
mind moving forward. Thanks again for the constructive feedback.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5ts+8PvYrdd42LWH0zqeUUj-x_nJhF-FNLO0qS0GoXUJg@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 20:07:00 +0000</pubDate></item><item><title>PHP 8.5.11C1 available for testing</title><link>https://externals.io/message/132477</link><description>&lt;p&gt;PHP 8.5.11RC1 has just been released and may be downloaded from &lt;br&gt;
&lt;a href="https://downloads.php.net/~edorian/" rel="nofollow" target="_blank"&gt;https://downloads.php.net/~edorian/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or use the git tag: php-8.5.11RC1&lt;/p&gt;
&lt;p&gt;Windows binaries are available at: &lt;br&gt;
&lt;a href="https://www.php.net/pre-release-builds.php?release=8.5.11RC1#windows" rel="nofollow" target="_blank"&gt;https://www.php.net/pre-release-builds.php?release=8.5.11RC1#windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please test it carefully and report any bugs at &lt;br&gt;
&lt;a href="https://github.com/php/php-src/issues" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/issues&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;8.5.11 should be expected in 2 weeks, on 24 Sept 2026.&lt;/p&gt;
&lt;p&gt;Hash values and PGP signatures can be found below or at &lt;br&gt;
&lt;a href="https://gist.github.com/edorian/4b08d5e2adbc3cebb1c5b8eed5988b25" rel="nofollow" target="_blank"&gt;https://gist.github.com/edorian/4b08d5e2adbc3cebb1c5b8eed5988b25&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you, and happy testing!&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Volker Dusch, Daniel Scherzer, and Pierrick Charron&lt;/p&gt;
&lt;p&gt;php-8.5.11RC1.tar.bz2 &lt;br&gt;
SHA256 hash: 24574eb0c8c1bceac833a5b984fcfb0cde50a019f6a757c35f28da3dc97300b9 &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iKIEABYKAEoWIQRJ2a9rxyqA1mkXGciqI/W+nHCX1AUCaqAtEBsUgAAAAAAEAA5t &lt;br&gt;
YW51MiwyLjUrMS4xMiwwLDMQHGVkb3JpYW5AcGhwLm5ldAAKCRCqI/W+nHCX1KDf &lt;br&gt;
AQDRBlaUzMBxo6g5P6z1G7Rzo5UqjjoXYVVblTK2/hhWNgEA0WYrv52DN7+zvWtb &lt;br&gt;
YFPhxGiPvN3YKYVZw3jQMOvVYQQ= &lt;br&gt;
=dsNV &lt;br&gt;
-----END PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;php-8.5.11RC1.tar.gz &lt;br&gt;
SHA256 hash: dd0a2dc233ee6dd6d8ef389b671fefc5cd0f49b859d16e53d875582c5e248bbb &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iKIEABYKAEoWIQRJ2a9rxyqA1mkXGciqI/W+nHCX1AUCaqAtEBsUgAAAAAAEAA5t &lt;br&gt;
YW51MiwyLjUrMS4xMiwwLDMQHGVkb3JpYW5AcGhwLm5ldAAKCRCqI/W+nHCX1PkJ &lt;br&gt;
AQDF+GtyYlGes1JY4h1QFH7ite88BurShl/YzQ1aWG2VbQEA98w9iUZzc2WAOMTC &lt;br&gt;
O9iL7E/7vusydH2KhwpL8xhhLgs= &lt;br&gt;
=Ni4S &lt;br&gt;
-----END PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;php-8.5.11RC1.tar.xz &lt;br&gt;
SHA256 hash: 84e5d0abc91f6b1f69de6c5ec5d3720124582417c7ce6c5df742dcbada179a82 &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iKIEABYKAEoWIQRJ2a9rxyqA1mkXGciqI/W+nHCX1AUCaqAtEBsUgAAAAAAEAA5t &lt;br&gt;
YW51MiwyLjUrMS4xMiwwLDMQHGVkb3JpYW5AcGhwLm5ldAAKCRCqI/W+nHCX1EtM &lt;br&gt;
AP9ggAbvewtH/Dkckf9Brtv+ZKb2togcVomklKZZBIuStAD9HYKxkv43vSqz/UI6 &lt;br&gt;
L1zMTRBbjpwIzc+JxHLnY96hSgI= &lt;br&gt;
=d7OJ &lt;br&gt;
-----END PGP SIGNATURE&lt;/p&gt;
</description><guid>CAMmyQQKtJb6dFD2k1G4dCjghzRhK2ucz4u78xOk8DE5dD7EcCA@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 18:27:33 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132476</link><description>&lt;blockquote&gt;
&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۰۶:۰۶ youkidearitai &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com"&gt;youkidearitai@gmail.com&lt;/a&gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 10:07 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I've been following the discussions and recent feedback regarding the &lt;br&gt;
array_str_contains() RFC closely. Performance and speed comparisons &lt;br&gt;
have come up as a key point, especially around whether a dedicated &lt;br&gt;
internal C implementation provides sufficient value compared to a &lt;br&gt;
userland foreach loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around &lt;br&gt;
the benchmarking methodology we're using here. Some of the initial &lt;br&gt;
numbers shared recently don't seem to reflect real-world scenarios or &lt;br&gt;
different data profiles (like varying array sizes, early exits vs &lt;br&gt;
worst-case lookups, UTF-8 strings, and compiler optimization flags &lt;br&gt;
like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be &lt;br&gt;
great if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to &lt;br&gt;
evaluate this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these &lt;br&gt;
metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is &lt;br&gt;
coming from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for &lt;br&gt;
everyday developers. I welcome any suggestions, insights, or &lt;br&gt;
benchmark reproductions from the community so we can evaluate this &lt;br&gt;
RFC based on solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals&lt;/p&gt;
&lt;p&gt;For your reference, I have attached the benchmark diff files. (commit &lt;br&gt;
hash is 4982bf45f4786faaa198558dd619f8a4d59e25f0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.diff&lt;/li&gt;
&lt;li&gt;.exp&lt;/li&gt;
&lt;li&gt;.log&lt;/li&gt;
&lt;li&gt;.out&lt;/li&gt;
&lt;li&gt;.php&lt;/li&gt;
&lt;li&gt;.phpt&lt;/li&gt;
&lt;li&gt;.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can not find definite improve performance. &lt;br&gt;
(My PC: WSL Ubuntu 24.04, Ryzen 7 7735HS, 32GB RAM)&lt;/p&gt;
&lt;p&gt;I don't familiar with Zend Engine's performance, However I think &lt;br&gt;
function's performance improvement is limited.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals,&lt;/p&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two critical &lt;br&gt;
issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my environment. &lt;br&gt;
It is scientifically impossible to derive any performance conclusions &lt;br&gt;
from code that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend Engine &lt;br&gt;
internals, the methodology applied here lacks the necessary technical &lt;br&gt;
rigor for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, and &lt;br&gt;
engine-aware performance analysis. However, as it stands, the provided &lt;br&gt;
material is effectively contentless and does not offer a basis for a &lt;br&gt;
technical evaluation.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Sepehr,&lt;/p&gt;
&lt;p&gt;I've also been following the discussions on the mailing list.&lt;/p&gt;
&lt;p&gt;My read is that Yuya has been the one most welcoming to you. He was &lt;br&gt;
putting in a word for you during the discussion about message phrasing, &lt;br&gt;
providing you some guidance and expressing willingness to involve you in &lt;br&gt;
the i18n work. His openness is visible even now -- unlike most of us, he &lt;br&gt;
is trying out your code and giving you feedback.&lt;/p&gt;
&lt;p&gt;Therefore it is a bit sad to see you being angry and dismissive at him &lt;br&gt;
in the latest discussions. I think you are mistaking his short &lt;br&gt;
statements for hostility or gatekeeping. My suggestion: stop throwing &lt;br&gt;
away his goodwill. If an experienced contributor is giving you feedback, &lt;br&gt;
you should seriously consider that there might be something true and &lt;br&gt;
useful.&lt;/p&gt;
&lt;p&gt;Regarding the latest discussion I would like to add that admitting lack &lt;br&gt;
of expertise in zend engine (or anything else) is usually not seen here &lt;br&gt;
as a sign of weakness, but of honesty. Many of the readers and voters &lt;br&gt;
here are not experts on every detail either. If someone admits not &lt;br&gt;
entirely understanding what's going on, it gives you a chance to provide &lt;br&gt;
explanations and proof instead of dismissing his benchmarks as useless.&lt;/p&gt;
&lt;p&gt;By the way...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just for your information: someone praised my work who holds a high &lt;br&gt;
position in php-src and whom I truly respect--meaning your opinion &lt;br&gt;
doesn't really matter to me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Different open source communities may work differently, but in this one &lt;br&gt;
a reference to an unnamed figure is unlikely to earn you additional &lt;br&gt;
respect or authority. It's best to leave such statements out.&lt;/p&gt;
&lt;p&gt;BR, &lt;br&gt;
Juris&lt;/p&gt;
</description><guid>79988df98c820a13fdc7f992d8ed9d96@glaive.pro</guid><pubDate>Thu, 10 Sep 2026 18:13:59 +0000</pubDate></item><item><title>PHP 8.4.26RC1 available for testing</title><link>https://externals.io/message/132475</link><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;PHP 8.4.26RC1 has just been released and may be downloaded from &lt;br&gt;
&lt;a href="https://downloads.php.net/~saki/" rel="nofollow" target="_blank"&gt;https://downloads.php.net/~saki/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or use the git tag: php-8.4.26RC1&lt;/p&gt;
&lt;p&gt;Windows binaries are available at: &lt;a href="https://www.php.net/pre-release-builds.php#windows" rel="nofollow" target="_blank"&gt;https://www.php.net/pre-release-builds.php#windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please test it carefully, and report any bugs at &lt;a href="https://github.com/php/php-src/issues" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/issues&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;8.4.26 should be expected in 2 weeks, i.e. on Sep 24th.&lt;/p&gt;
&lt;p&gt;Hash values and PGP signatures can be found below or at &lt;br&gt;
&lt;a href="https://gist.github.com/SakiTakamachi/7c50ca07945fdcad9a90d09fb7f7eaf8" rel="nofollow" target="_blank"&gt;https://gist.github.com/SakiTakamachi/7c50ca07945fdcad9a90d09fb7f7eaf8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you, and happy testing!&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Saki Takamachi, Calvin Buckley, and Eric Mann&lt;/p&gt;
&lt;p&gt;php-8.4.26RC1.tar.bz2 &lt;br&gt;
SHA256 hash: afaf140fa8f2593b3e08e3cff2ec81f62d1d8b21834439309e456c90a9ca1312 &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iQIzBAABCAAdFiEEBhbpPZWvRxJD4mdhdwQm4X67s90FAmqgJE0ACgkQdwQm4X67 &lt;br&gt;
s91KWw//Qdumom2nZY8KqSvpJ+bRPcveuQdjVIogWWkM7Rg9sMFaRvJE38lWZx32 &lt;br&gt;
6akexo7nml/YVZ+WPvxWe40uB1mKkTPZtGQzUjalIDON+Au0ABlxr4NKklr5xTcP &lt;br&gt;
RrwgJjnawd/fvW+DvxYDuv1AilNBkEpd4NBKmBed42UdhrosC/Y09DWvZITDAcGp &lt;br&gt;
LQZPovfjQQ2eo9GHgHb9Os63zoHjAs5ROW/ExZ6Y2b6HLMxbAkHwexFc+u8uQD96 &lt;br&gt;
nIxUbYSoPidn6PG8Ky7O6jOdjAkzqXmE5Y+0+qJhcW4Cq6+J9s2dI4ObbxUCJLFf &lt;br&gt;
cHuyvWws4/Twpky0rTkmdDWHEqMVWek+3a/6BygXEjMlYw4r7TsU2eHlYTSRMbpB &lt;br&gt;
atr11kyCMhDl9WZxFQb/nafgeNLQTBP8FmMnI/HR4rGIt99SDJUtjuCOMkWH+BAf &lt;br&gt;
SlWOLKo74RUznGICe9+K5hmdyrI/xRLxOrqxcliB1sEeskOzaj43oSpB7vzN+hSH &lt;br&gt;
hWlYI/vW13PwdVWJ09EZYvoh7OvK17t9fa775NG80pfXXg7pco2PNic4fmdfofHv &lt;br&gt;
VNK258mltIpBrIVVwnVrjO4azWWQ4oUZG5dlKA5+UqQA42v4eowsf+DgLnp/rBgQ &lt;br&gt;
28Ylj5AxqP4epGSdRpfnFJjCbwvSpOYz7kYAGeU73iWayLh9deI= &lt;br&gt;
=kouZ &lt;br&gt;
-----END PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;php-8.4.26RC1.tar.gz &lt;br&gt;
SHA256 hash: 48a559ba2cb17f21a4bbbf21624e616e5c7e3d4ce92eba7ffbc260c3b52bba5f &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iQIzBAABCAAdFiEEBhbpPZWvRxJD4mdhdwQm4X67s90FAmqgJE4ACgkQdwQm4X67 &lt;br&gt;
s92wWBAAkOs6DB26g44IXPVaTTYNt6ch6CCU+uS1e79vKSXBjYN++T/01WN9N3mr &lt;br&gt;
dxzObadXPFtBEeMzGVX27JLUNbN+CkNlaRNXXeX78FpuEr4McWCvgLW+MJtEIZY3 &lt;br&gt;
BKkaV/yqf7Wf+GM8KzwaJmaz7VBIyqOo2uDAabpL1PSRTIbQlk8lNudv784zqLsI &lt;br&gt;
otZVHJ2/oP4Is0Qgq0XpZUgISsi69L7U4fsC6wRoZKbTq25FYYYHyKObOAK8HlmZ &lt;br&gt;
HVGfH0v+CnwZcxUA+UM3sl5CdZabVGpcD2assPRBRMSN/iIAJn2Vq6YZkMckvERg &lt;br&gt;
63xruoOKmuNBn+fWrfJHlj38KbT1f3mtKQ7ZoNv+pK9/+RrOnZC2Y+iDZPijJMYk &lt;br&gt;
GpRZQNrkZhE21ChWgfM63qwtkA/0ju1DsrwLvRqzjnGBPGsEBSJBUvkFOR+Rva0F &lt;br&gt;
nY+aMFnDh6wiRctjqLsuxDZdSg9JHArX/VYcVF2OFm2GiPJfId8/cFqtQfba3Mfp &lt;br&gt;
f7pzfVZxb+18kaNLFhOq7n//Tv4K1XhXk9Pe6Fgtsblkj+iNguPsSCjIAH5rsVTg &lt;br&gt;
zuW0Bsy37L8dlYgSBK4kYqX0VvDWA2p5kdUlcxjZFvZFtn7kxtcisC/A912Oq3Ba &lt;br&gt;
YcrTGlQZB3nGt0cTdXwwPlw/xR01uqhCJdcEtGic9oHMCICx0yE= &lt;br&gt;
=EdEg &lt;br&gt;
-----END PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;php-8.4.26RC1.tar.xz &lt;br&gt;
SHA256 hash: c6e6f52752510c3b3fbaf9e34a9ec37fb17f6741fb8b2637d6804a8a71c4fc37 &lt;br&gt;
PGP signature: &lt;br&gt;
-----BEGIN PGP SIGNATURE-----&lt;/p&gt;
&lt;p&gt;iQIzBAABCAAdFiEEBhbpPZWvRxJD4mdhdwQm4X67s90FAmqgJE4ACgkQdwQm4X67 &lt;br&gt;
s92LxRAAnZl/soguNn8wB5fUzCvEkT4qFkKIa6oY+h3Ngagw6Xqp51mLZEE5FhOq &lt;br&gt;
nf5zOIMuiWEDKJzQ8AMsGrnqgs97dTeQCTLWIHkG/3AEvVKakFKksMwtMNFxwb7F &lt;br&gt;
TxQ6Io/yJMYDuVubyUf6qDbd9UgxJAVOkEzEBkVQJQnDJZbkMKfV9ov13LrUJjtD &lt;br&gt;
dP2b2CWOpbBWeGUttNFhySIw2OUM8UFkwCrGGusDUcqbrE0BSD42MICHVAvpOmON &lt;br&gt;
R9OSPpoBc4uaVdM5OgfAZ36pp+HaPaLDKluFQI+iqLOlsFlUNAZF0c50kdFLudpn &lt;br&gt;
eFm07rjn4Xwb09wBBL2MZ8rMC7pfH4Q/tUIb+udeGKe3xiInabZ48YCJBomkVUgp &lt;br&gt;
iEr9Fr8qzQnFSP3mW4og/pa4F/w4M8YJ9odkBb8xMwNUxi8wbbS9JeWkuVMvtfTG &lt;br&gt;
c+e7aKLX6ZJ5PeEgA9Igmcvx96thvyORkp2Qpzy30QQC6pLxE8AoJNC073o6vvbJ &lt;br&gt;
bN+JP/FvqnUEI51+itrMyHJdctHvy+0SV6xvr+POMs/DS/xkiKWqmqkwaUyFzm48 &lt;br&gt;
dSlNJfgl588Fvr3LmWHfn7zHX2n2ZuYcZEa/W4VJqWlvdIfW4gWknv/skp1J5ulK &lt;br&gt;
5zivia5ug0S0n1KUYWqvE7EsVnbNT+NpkRbFO/1Hr1agk716hCE= &lt;br&gt;
=X/15 &lt;br&gt;
-----END PGP SIGNATURE&lt;/p&gt;
</description><guid>8C6D46A0-7F09-44AB-9623-CEFC3FF5FB08@php.net</guid><pubDate>Thu, 10 Sep 2026 15:16:09 +0000</pubDate></item><item><title>SNMP RFC amendments and clarification</title><link>https://externals.io/message/132474</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The following RFC &lt;a href="https://wiki.php.net/rfc/snmp_improvements_2026" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/snmp_improvements_2026&lt;/a&gt; &lt;br&gt;
stipulated that the proposed PHP versions for this RFC are: &amp;quot;Next &lt;br&gt;
stable release for all currently supported PHP versions.&amp;quot;&lt;/p&gt;
&lt;p&gt;This goes against our policy regarding versioning &lt;br&gt;
(&lt;a href="https://github.com/php/policies/blob/main/release-process.rst#patch-version-number" rel="nofollow" target="_blank"&gt;https://github.com/php/policies/blob/main/release-process.rst#patch-version-number&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;As such these changes will &lt;em&gt;only&lt;/em&gt; land in PHP 8.6.&lt;/p&gt;
&lt;p&gt;Moreover, I suggested replacing the new integer constants for the &lt;br&gt;
&amp;quot;Implement more MIB parsing and value output controls&amp;quot; part of the &lt;br&gt;
RFC by PHP enums to improve type safety from the userland perspective. &lt;br&gt;
I think this is an improvement on multiple levels as it also &lt;br&gt;
effectively &amp;quot;translates&amp;quot; the C enums defined by SNMP to PHP enums &lt;br&gt;
exposed to userland.&lt;/p&gt;
&lt;p&gt;The plan is to have this merged in time for PHP 8.6.0beta2 so people &lt;br&gt;
can test this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thank you. Both amendments make sense do me.&lt;/p&gt;
&lt;p&gt;Can you (or Steven) shortly mention the changes in an Errata section &lt;br&gt;
in the RFC so that it's clear to everyone reading the RFC that the &lt;br&gt;
final version differs from what was being voted on? See &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/partial_function_application_v2#errata" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/partial_function_application_v2#errata&lt;/a&gt; or &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/redact_parameters_in_back_traces#errata" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/redact_parameters_in_back_traces#errata&lt;/a&gt; as an &lt;br&gt;
example.&lt;/p&gt;
&lt;p&gt;The “Status: Accepted” at the top RFC could be updated to &lt;br&gt;
“Implemented” at the same time.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I've updated the wiki with both the new status and the errata section.&lt;/p&gt;
&lt;p&gt;regards&lt;/p&gt;
&lt;p&gt;Steve&lt;/p&gt;
</description><guid>122a2552-4f43-44c6-a344-90bdbd23bb70@fluentit.au</guid><pubDate>Thu, 10 Sep 2026 13:20:08 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132473</link><description>&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۱۵:۳۷ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 20:40 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۰۶:۰۶ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 10:07 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I’ve been following the discussions and recent feedback regarding the &lt;br&gt;
array_str_contains() RFC closely. Performance and speed comparisons have &lt;br&gt;
come up as a key point, especially around whether a dedicated internal C &lt;br&gt;
implementation provides sufficient value compared to a userland foreach &lt;br&gt;
loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around &lt;br&gt;
the benchmarking methodology we're using here. Some of the initial numbers &lt;br&gt;
shared recently don't seem to reflect real-world scenarios or different &lt;br&gt;
data profiles (like varying array sizes, early exits vs worst-case lookups, &lt;br&gt;
UTF-8 strings, and compiler optimization flags like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be &lt;br&gt;
great if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to &lt;br&gt;
evaluate this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these &lt;br&gt;
metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is &lt;br&gt;
coming from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for &lt;br&gt;
everyday developers. I welcome any suggestions, insights, or benchmark &lt;br&gt;
reproductions from the community so we can evaluate this RFC based on &lt;br&gt;
solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals&lt;/p&gt;
&lt;p&gt;For your reference, I have attached the benchmark diff files. (commit &lt;br&gt;
hash is 4982bf45f4786faaa198558dd619f8a4d59e25f0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.diff&lt;/li&gt;
&lt;li&gt;.exp&lt;/li&gt;
&lt;li&gt;.log&lt;/li&gt;
&lt;li&gt;.out&lt;/li&gt;
&lt;li&gt;.php&lt;/li&gt;
&lt;li&gt;.phpt&lt;/li&gt;
&lt;li&gt;.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can not find definite improve performance. &lt;br&gt;
(My PC: WSL Ubuntu 24.04, Ryzen 7 7735HS, 32GB RAM)&lt;/p&gt;
&lt;p&gt;I don't familiar with Zend Engine's performance, However I think &lt;br&gt;
function's performance improvement is limited.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals,&lt;/p&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two critical &lt;br&gt;
issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my environment. It &lt;br&gt;
is scientifically impossible to derive any performance conclusions from &lt;br&gt;
code that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend Engine &lt;br&gt;
internals, the methodology applied here lacks the necessary technical rigor &lt;br&gt;
for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, and &lt;br&gt;
engine-aware performance analysis. However, as it stands, the provided &lt;br&gt;
material is effectively contentless and does not offer a basis for a &lt;br&gt;
technical evaluation.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;PLEASE UNZIP ATTACHED FILE. YOUR CODE.&lt;/p&gt;
&lt;p&gt;Regards. &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mr. Hamada,&lt;/p&gt;
&lt;p&gt;If you lack a solid grasp of Zend Engine internals and core data structures &lt;br&gt;
like zval—which is the very backbone of PHP’s C runtime—it feels like you &lt;br&gt;
are simply relying on an AI assistant rather than technical understanding. &lt;br&gt;
Without mastering zval and Zend memory handling, working at this level in C &lt;br&gt;
is effectively crippled.&lt;/p&gt;
&lt;p&gt;To answer your question: I am testing this on high-end industrial 64-bit &lt;br&gt;
hardware, and your provided files still completely fail to build.&lt;/p&gt;
&lt;p&gt;Perhaps you should tell your AI to think a bit harder before generating &lt;br&gt;
patches and benchmarks.&lt;/p&gt;
</description><guid>CA+Jcf5ukX2fprar4pBjskeX4A3xay+WFeOY7MgDSUYmEDzqDEg@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 12:39:36 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132472</link><description>&lt;p&gt;‪2026年9月10日(木) 20:40 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۰۶:۰۶ youkidearitai &lt;a href="mailto:youkidearitai@gmail.com"&gt;youkidearitai@gmail.com&lt;/a&gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 10:07 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I’ve been following the discussions and recent feedback regarding the array_str_contains() RFC closely. Performance and speed comparisons have come up as a key point, especially around whether a dedicated internal C implementation provides sufficient value compared to a userland foreach loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around the benchmarking methodology we're using here. Some of the initial numbers shared recently don't seem to reflect real-world scenarios or different data profiles (like varying array sizes, early exits vs worst-case lookups, UTF-8 strings, and compiler optimization flags like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be great if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to evaluate this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is coming from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for everyday developers. I welcome any suggestions, insights, or benchmark reproductions from the community so we can evaluate this RFC based on solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals&lt;/p&gt;
&lt;p&gt;For your reference, I have attached the benchmark diff files. (commit &lt;br&gt;
hash is 4982bf45f4786faaa198558dd619f8a4d59e25f0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.diff&lt;/li&gt;
&lt;li&gt;.exp&lt;/li&gt;
&lt;li&gt;.log&lt;/li&gt;
&lt;li&gt;.out&lt;/li&gt;
&lt;li&gt;.php&lt;/li&gt;
&lt;li&gt;.phpt&lt;/li&gt;
&lt;li&gt;.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can not find definite improve performance. &lt;br&gt;
(My PC: WSL Ubuntu 24.04, Ryzen 7 7735HS, 32GB RAM)&lt;/p&gt;
&lt;p&gt;I don't familiar with Zend Engine's performance, However I think &lt;br&gt;
function's performance improvement is limited.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals,&lt;/p&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two critical issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my environment. It is scientifically impossible to derive any performance conclusions from code that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend Engine internals, the methodology applied here lacks the necessary technical rigor for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, and engine-aware performance analysis. However, as it stands, the provided material is effectively contentless and does not offer a basis for a technical evaluation.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;PLEASE UNZIP ATTACHED FILE. YOUR CODE.&lt;/p&gt;
&lt;p&gt;Regards. &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><guid>CAEPPVa1H4LT_VYyDtLcT_ES9K3Ym6_x=FfPztGiu9Q9VqyjMPQ@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 12:04:43 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132471</link><description>&lt;p&gt;در تاریخ پنجشنبه ۱۰ سپتامبر ۲۰۲۶، ۰۶:۰۶ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;‪2026年9月10日(木) 10:07 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I’ve been following the discussions and recent feedback regarding the &lt;br&gt;
array_str_contains() RFC closely. Performance and speed comparisons have &lt;br&gt;
come up as a key point, especially around whether a dedicated internal C &lt;br&gt;
implementation provides sufficient value compared to a userland foreach &lt;br&gt;
loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around the &lt;br&gt;
benchmarking methodology we're using here. Some of the initial numbers &lt;br&gt;
shared recently don't seem to reflect real-world scenarios or different &lt;br&gt;
data profiles (like varying array sizes, early exits vs worst-case lookups, &lt;br&gt;
UTF-8 strings, and compiler optimization flags like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be &lt;br&gt;
great if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to &lt;br&gt;
evaluate this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these &lt;br&gt;
metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is &lt;br&gt;
coming from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for &lt;br&gt;
everyday developers. I welcome any suggestions, insights, or benchmark &lt;br&gt;
reproductions from the community so we can evaluate this RFC based on &lt;br&gt;
solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals&lt;/p&gt;
&lt;p&gt;For your reference, I have attached the benchmark diff files. (commit &lt;br&gt;
hash is 4982bf45f4786faaa198558dd619f8a4d59e25f0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.diff&lt;/li&gt;
&lt;li&gt;.exp&lt;/li&gt;
&lt;li&gt;.log&lt;/li&gt;
&lt;li&gt;.out&lt;/li&gt;
&lt;li&gt;.php&lt;/li&gt;
&lt;li&gt;.phpt&lt;/li&gt;
&lt;li&gt;.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can not find definite improve performance. &lt;br&gt;
(My PC: WSL Ubuntu 24.04, Ryzen 7 7735HS, 32GB RAM)&lt;/p&gt;
&lt;p&gt;I don't familiar with Zend Engine's performance, However I think &lt;br&gt;
function's performance improvement is limited.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals,&lt;/p&gt;
&lt;p&gt;Thank you all for the time and effort invested in this discussion.&lt;/p&gt;
&lt;p&gt;Regarding the benchmarks provided by Yuya, I must address two critical &lt;br&gt;
issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The provided implementation does not even build in my environment. It is &lt;br&gt;
scientifically impossible to derive any performance conclusions from code &lt;br&gt;
that fails to compile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given your own admission of limited familiarity with the Zend Engine &lt;br&gt;
internals, the methodology applied here lacks the necessary technical rigor &lt;br&gt;
for a valid assessment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am more than willing to engage with constructive, reproducible, and &lt;br&gt;
engine-aware performance analysis. However, as it stands, the provided &lt;br&gt;
material is effectively contentless and does not offer a basis for a &lt;br&gt;
technical evaluation.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5spnukGtrq_pfzZK48DVrM0aopYYJtkuyoLRBHT_8ZZQg@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 11:39:49 +0000</pubDate></item><item><title>[Pre-RFC] Opt-in JSON comments and trailing commas</title><link>https://externals.io/message/132470</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That is a language known as Microsoft's JSONC or Nigel Tao's JWCC (JSON &lt;br&gt;
with Comments and Commas) they are effectively equivalent&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think this proposal makes sense and with regarding to Otar's questions &lt;br&gt;
regarding naming, I think a single JSON_ALLOW_JSONC flag to allow both &lt;br&gt;
comments and trailing commas would be the best option. If there's an &lt;br&gt;
existing, reasonably widely accepted standard for that, we should just &lt;br&gt;
reference it and not add separate flags that result in a combinatorial &lt;br&gt;
explosion.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>2a08b07b531b269fa65eff88c2f488bc@bastelstu.be</guid><pubDate>Thu, 10 Sep 2026 10:56:10 +0000</pubDate></item><item><title>SNMP RFC amendments and clarification</title><link>https://externals.io/message/132469</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The following RFC &lt;a href="https://wiki.php.net/rfc/snmp_improvements_2026" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/snmp_improvements_2026&lt;/a&gt; &lt;br&gt;
stipulated that the proposed PHP versions for this RFC are: &amp;quot;Next &lt;br&gt;
stable release for all currently supported PHP versions.&amp;quot;&lt;/p&gt;
&lt;p&gt;This goes against our policy regarding versioning &lt;br&gt;
(&lt;a href="https://github.com/php/policies/blob/main/release-process.rst#patch-version-number" rel="nofollow" target="_blank"&gt;https://github.com/php/policies/blob/main/release-process.rst#patch-version-number&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;As such these changes will &lt;em&gt;only&lt;/em&gt; land in PHP 8.6.&lt;/p&gt;
&lt;p&gt;Moreover, I suggested replacing the new integer constants for the &lt;br&gt;
&amp;quot;Implement more MIB parsing and value output controls&amp;quot; part of the RFC &lt;br&gt;
by PHP enums to improve type safety from the userland perspective. &lt;br&gt;
I think this is an improvement on multiple levels as it also &lt;br&gt;
effectively &amp;quot;translates&amp;quot; the C enums defined by SNMP to PHP enums &lt;br&gt;
exposed to userland.&lt;/p&gt;
&lt;p&gt;The plan is to have this merged in time for PHP 8.6.0beta2 so people &lt;br&gt;
can test this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thank you. Both amendments make sense do me.&lt;/p&gt;
&lt;p&gt;Can you (or Steven) shortly mention the changes in an Errata section in &lt;br&gt;
the RFC so that it's clear to everyone reading the RFC that the final &lt;br&gt;
version differs from what was being voted on? See &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/partial_function_application_v2#errata" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/partial_function_application_v2#errata&lt;/a&gt; or &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/redact_parameters_in_back_traces#errata" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/redact_parameters_in_back_traces#errata&lt;/a&gt; as an &lt;br&gt;
example.&lt;/p&gt;
&lt;p&gt;The “Status: Accepted” at the top RFC could be updated to “Implemented” &lt;br&gt;
at the same time.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>5cbc8b944848df033945efbef71c9ecb@bastelstu.be</guid><pubDate>Thu, 10 Sep 2026 10:52:12 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132468</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First...wrapping couples the exception you catch to the flag. &lt;br&gt;
Without it, &lt;code&gt;preg_replace_callback()&lt;/code&gt; throws whatever the callback &lt;br&gt;
throws. &lt;br&gt;
With it, the same call always throws a &lt;code&gt;PregException&lt;/code&gt;. &lt;br&gt;
So the flag silently changes which exception a caller has to handle, &lt;br&gt;
and the two have to move together:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try {
    preg_replace_callback(
        '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
        function ($matches) {
            return mask_credit_card($matches[0]); // throws 
MaskException
        },
        $contents,
    );
} catch (MaskException $e) {
    // becomes dead the moment the flag is added, and comes back the
moment it's removed
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is correct, but as I mentioned before, the new flag is an entirely &lt;br&gt;
new feature that requires an explicit opt-in. Adopting a new feature &lt;br&gt;
without reading the associated documentation to find out how it works &lt;br&gt;
will generally result in sadness, and I believe this case is no &lt;br&gt;
different. Also adding and removing the flag would not just affect &lt;br&gt;
&lt;code&gt;MaskException&lt;/code&gt;, but would of course also affect whether or not a &lt;br&gt;
&lt;code&gt;PregException&lt;/code&gt; is thrown and whether or not the code proceeds after an &lt;br&gt;
error was encountered. Any existing error handling would need to adapted &lt;br&gt;
as well. So the changes required to adopt the flag are much more &lt;br&gt;
far-reaching than whether or not a catch block for a custom exception &lt;br&gt;
would need to be adjusted.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Second...wrapping a callback's exception in a &lt;code&gt;PregException&lt;/code&gt; produces &lt;br&gt;
a &lt;code&gt;PregException&lt;/code&gt; that maps to no preg error.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think that is fine: Just add a new PREG_CALLBACK_ERROR that is only &lt;br&gt;
emitted when PREG_THROW_ON_ERROR is set.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can be holding a &lt;code&gt;PregException&lt;/code&gt; while &lt;code&gt;preg_last_error()&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt; report no error at all. That is an exception &lt;br&gt;
whose type says a regex error happened when, by preg's own state, none &lt;br&gt;
did.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ah, good that you mention this, because it's not mentioned in the RFC &lt;br&gt;
and I didn't check the implementation: The &lt;code&gt;preg_last_error()&lt;/code&gt; value &lt;br&gt;
should &lt;em&gt;not&lt;/em&gt; be touched when the PREG_THROW_ON_ERROR flag is set. Once &lt;br&gt;
you opt into exception-based error handling, the other error handling &lt;br&gt;
path should be bypassed entirely. This is consistent with how &lt;br&gt;
&lt;code&gt;JSON_THROW_ON_ERROR&lt;/code&gt; already works: &lt;a href="https://3v4l.org/Ijt3R#veol" rel="nofollow" target="_blank"&gt;https://3v4l.org/Ijt3R#veol&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;amp;lt;?php

 echo &amp;quot;Start\n&amp;quot;;
 var_dump(json_last_error());
 echo &amp;quot;\n&amp;quot;;

 echo &amp;quot;Error without flag\n&amp;quot;;
 json_decode('{');
 var_dump(json_last_error());
 echo &amp;quot;\n&amp;quot;;

 echo &amp;quot;Clear error\n&amp;quot;;
 json_decode('true'); // clear error
 var_dump(json_last_error());
 echo &amp;quot;\n&amp;quot;;

 echo &amp;quot;Error with flag\n&amp;quot;;
 try { json_decode('{', flags: JSON_THROW_ON_ERROR); } catch 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(\JsonException $e) { echo $e-&amp;gt;getMessage(), &amp;quot;\n&amp;quot;; } &lt;br&gt;
var_dump(json_last_error()); &lt;br&gt;
echo &amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; echo &amp;quot;Set different error\n&amp;quot;;
 json_decode(str_repeat('[', 1000));
 var_dump(json_last_error());

 echo &amp;quot;and check that it is not overwritten when `JSON_THROW_ON_ERROR` 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;is set\n&amp;quot;; &lt;br&gt;
try { json_decode('{', flags: JSON_THROW_ON_ERROR); } catch &lt;br&gt;
(\JsonException $e) { echo $e-&amp;gt;getMessage(), &amp;quot;\n&amp;quot;; } &lt;br&gt;
var_dump(json_last_error());&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is separate from the &lt;code&gt;$e-&amp;gt;getMessage() === &lt;/code&gt;preg_last_error_msg()`` &lt;br&gt;
guarantee I raised before. Even setting that aside, it's incoherent on &lt;br&gt;
its own terms, because the flag is &lt;code&gt;PREG_THROW_ON_ERROR&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;preg_last_error()&lt;/code&gt; is what an error is.&lt;/p&gt;
&lt;p&gt;So keeping that honest means a bare &lt;code&gt;PregException&lt;/code&gt; can no longer &lt;br&gt;
stand for two different things at once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So with the above note that &lt;code&gt;preg_last_error()&lt;/code&gt; should remain untouched, &lt;br&gt;
I believe having a single PregException for everything is fine (or &lt;br&gt;
PregError + PregException, as pointed out by Robert).&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>547f6692e54d7704384983b6b99124b3@bastelstu.be</guid><pubDate>Thu, 10 Sep 2026 10:41:26 +0000</pubDate></item><item><title>[Meta] This Week In PHP Internals | September 9, 2026</title><link>https://externals.io/message/132467</link><description>&lt;p&gt;Hi Contributors,&lt;/p&gt;
&lt;p&gt;This week's episode is out. Here's the video, plus everywhere else it landed &lt;br&gt;
for visibility.&lt;/p&gt;
&lt;p&gt;Two editorial notes. Last week's corrections are at the top of this episode: &lt;br&gt;
8.4.25 was a bug-fix release, not a security one (thanks, Daniel), and the two &lt;br&gt;
libxml-rs contributors I described without naming were James Gilliland and &lt;br&gt;
David Carlier (thanks, Tim — the From header was right there).&lt;/p&gt;
&lt;p&gt;Same invitation as always: if I got something wrong, reply in this thread and &lt;br&gt;
I'll make corrections. That includes how I'm pronouncing your names.&lt;/p&gt;
&lt;p&gt;If you'd rather read than watch, the &lt;a href="http://dev.to" rel="nofollow" target="_blank"&gt;dev.to&lt;/a&gt; post carries the full episode as &lt;br&gt;
an article, which also makes it the easiest version to quote when correcting &lt;br&gt;
me: &lt;a href="https://dev.to/projektgopher/this-week-in-php-internals-sept-9-2026-1dao" rel="nofollow" target="_blank"&gt;https://dev.to/projektgopher/this-week-in-php-internals-sept-9-2026-1dao&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;youtube &lt;a href="https://youtu.be/AoMmbSOknmw" rel="nofollow" target="_blank"&gt;https://youtu.be/AoMmbSOknmw&lt;/a&gt; &lt;br&gt;
r/php &lt;a href="https://www.reddit.com/r/PHP/comments/1wc9mwz/this_week_in_php_internals_sept_9_2026/" rel="nofollow" target="_blank"&gt;https://www.reddit.com/r/PHP/comments/1wc9mwz/this_week_in_php_internals_sept_9_2026/&lt;/a&gt; &lt;br&gt;
r/symfony &lt;a href="https://www.reddit.com/r/symfony/comments/1wc9usw/this_week_in_php_internals_sept_9_2026/" rel="nofollow" target="_blank"&gt;https://www.reddit.com/r/symfony/comments/1wc9usw/this_week_in_php_internals_sept_9_2026/&lt;/a&gt; &lt;br&gt;
r/laravel &lt;a href="https://www.reddit.com/r/laravel/comments/1wca342/this_week_in_php_internals_sept_9_2026/" rel="nofollow" target="_blank"&gt;https://www.reddit.com/r/laravel/comments/1wca342/this_week_in_php_internals_sept_9_2026/&lt;/a&gt; &lt;br&gt;
&lt;a href="http://dev.to" rel="nofollow" target="_blank"&gt;dev.to&lt;/a&gt; &lt;a href="https://dev.to/projektgopher/this-week-in-php-internals-sept-9-2026-1dao" rel="nofollow" target="_blank"&gt;https://dev.to/projektgopher/this-week-in-php-internals-sept-9-2026-1dao&lt;/a&gt; &lt;br&gt;
mastodon &lt;a href="https://phpc.social/@ProjektGopher/117245178070805498" rel="nofollow" target="_blank"&gt;https://phpc.social/@ProjektGopher/117245178070805498&lt;/a&gt; &lt;br&gt;
threads &lt;a href="https://www.threads.com/@projektgopher/post/DdGI_TEFJte" rel="nofollow" target="_blank"&gt;https://www.threads.com/@projektgopher/post/DdGI_TEFJte&lt;/a&gt; &lt;br&gt;
bsky &lt;a href="https://bsky.app/profile/projektgopher.com/post/3mv5ex3nphd2z" rel="nofollow" target="_blank"&gt;https://bsky.app/profile/projektgopher.com/post/3mv5ex3nphd2z&lt;/a&gt; &lt;br&gt;
twitter &lt;a href="https://x.com/ProjektGopher/status/2097933365915906537" rel="nofollow" target="_blank"&gt;https://x.com/ProjektGopher/status/2097933365915906537&lt;/a&gt; &lt;br&gt;
linkedin &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7503701996701569024/" rel="nofollow" target="_blank"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7503701996701569024/&lt;/a&gt; &lt;br&gt;
pinkary &lt;a href="https://pinkary.com/@ProjektGopher/questions/01a089ed-e4e3-7105-8d20-a61e0d6a9bff" rel="nofollow" target="_blank"&gt;https://pinkary.com/@ProjektGopher/questions/01a089ed-e4e3-7105-8d20-a61e0d6a9bff&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cheers, &lt;br&gt;
Len&lt;/p&gt;
</description><guid>CAEwAiAFaG4DCVz4t75tyVTGMf-==mmiEQmNqUGJ-Li+7cki-8w@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 06:43:20 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132466</link><description>&lt;p&gt;‪2026年9月10日(木) 10:07 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I’ve been following the discussions and recent feedback regarding the array_str_contains() RFC closely. Performance and speed comparisons have come up as a key point, especially around whether a dedicated internal C implementation provides sufficient value compared to a userland foreach loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around the benchmarking methodology we're using here. Some of the initial numbers shared recently don't seem to reflect real-world scenarios or different data profiles (like varying array sizes, early exits vs worst-case lookups, UTF-8 strings, and compiler optimization flags like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be great if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to evaluate this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is coming from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for everyday developers. I welcome any suggestions, insights, or benchmark reproductions from the community so we can evaluate this RFC based on solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Internals&lt;/p&gt;
&lt;p&gt;For your reference, I have attached the benchmark diff files. (commit &lt;br&gt;
hash is 4982bf45f4786faaa198558dd619f8a4d59e25f0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.diff&lt;/li&gt;
&lt;li&gt;.exp&lt;/li&gt;
&lt;li&gt;.log&lt;/li&gt;
&lt;li&gt;.out&lt;/li&gt;
&lt;li&gt;.php&lt;/li&gt;
&lt;li&gt;.phpt&lt;/li&gt;
&lt;li&gt;.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can not find definite improve performance. &lt;br&gt;
(My PC: WSL Ubuntu 24.04, Ryzen 7 7735HS, 32GB RAM)&lt;/p&gt;
&lt;p&gt;I don't familiar with Zend Engine's performance, However I think &lt;br&gt;
function's performance improvement is limited.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><guid>CAEPPVa2Vg=2NHA481OOv1oudppsXJP0QXia0S7tw5XnomehUig@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 02:33:41 +0000</pubDate></item><item><title>Discussion on array_str_contains() RFC and performance benchmarking methodology</title><link>https://externals.io/message/132465</link><description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I hope you're all having a great week.&lt;/p&gt;
&lt;p&gt;I’ve been following the discussions and recent feedback regarding the &lt;br&gt;
array_str_contains() RFC closely. Performance and speed comparisons have &lt;br&gt;
come up as a key point, especially around whether a dedicated internal C &lt;br&gt;
implementation provides sufficient value compared to a userland foreach &lt;br&gt;
loop.&lt;/p&gt;
&lt;p&gt;I'd love to open up a constructive and transparent discussion around the &lt;br&gt;
benchmarking methodology we're using here. Some of the initial numbers &lt;br&gt;
shared recently don't seem to reflect real-world scenarios or different &lt;br&gt;
data profiles (like varying array sizes, early exits vs worst-case lookups, &lt;br&gt;
UTF-8 strings, and compiler optimization flags like -O2 / -O3).&lt;/p&gt;
&lt;p&gt;Before drawing final conclusions on performance, I think it would be great &lt;br&gt;
if we could align on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The exact benchmark scripts and test datasets we should use to evaluate &lt;br&gt;
this fairly.&lt;/li&gt;
&lt;li&gt;The compilation environment and flags used for generating these metrics.&lt;/li&gt;
&lt;li&gt;Where the potential overhead in the current C implementation is coming &lt;br&gt;
from and how we can optimize it together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My goal has always been to make PHP more expressive and efficient for &lt;br&gt;
everyday developers. I welcome any suggestions, insights, or benchmark &lt;br&gt;
reproductions from the community so we can evaluate this RFC based on &lt;br&gt;
solid, agreed-upon data.&lt;/p&gt;
&lt;p&gt;Thanks for your time and feedback!&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5uqEA=28qAy0xv_ajBtLmz0Ndaf4QM43az1YgxgCZ_eRA@mail.gmail.com</guid><pubDate>Thu, 10 Sep 2026 01:03:10 +0000</pubDate></item><item><title></title><link>https://externals.io/message/132464</link><description>&lt;p&gt;Hi Yuya, the &amp;quot;genius&amp;quot;,&lt;/p&gt;
&lt;p&gt;Look—I don't just talk.&lt;/p&gt;
&lt;p&gt;First, when I introduced the RFC, before the discussion started, many &lt;br&gt;
people asked: &amp;quot;How is this different from other functions like &lt;br&gt;
array_search?&amp;quot; I provided the analysis, and there were many questions like &lt;br&gt;
that.&lt;/p&gt;
&lt;p&gt;You told me to run a real-world test, and you saw that my function &lt;br&gt;
performed better than those functions.&lt;/p&gt;
&lt;p&gt;All the code was designed based on proper principles, and I am sure you saw &lt;br&gt;
that yourself. You didn't even leave a single comment during the discussion &lt;br&gt;
period because you knew you would face a completely technical response.&lt;/p&gt;
&lt;p&gt;Just for your information: someone praised my work who holds a high &lt;br&gt;
position in php-src and whom I truly respect—meaning your opinion doesn't &lt;br&gt;
really matter to me.&lt;/p&gt;
&lt;p&gt;Respectfully, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;p&gt;در تاریخ چهارشنبه ۹ سپتامبر ۲۰۲۶، ۱۹:۴۷ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No, If you are a skilled engineer, you should accept criticism. &lt;br&gt;
Your skill is not enough php-src development.&lt;/p&gt;
&lt;p&gt;To begin with, To unable resolving issue, You must compile and test on &lt;br&gt;
your PC. &lt;br&gt;
Otherwise, Your problem is CI is red, but your test code is broken. &lt;br&gt;
Not CI's problem. &lt;br&gt;
Fix below..&lt;/p&gt;
&lt;p&gt;========DIFF======== &lt;br&gt;
001- === BENCHMARK RESULTS (%d iterations) === &lt;br&gt;
002- [Match at start] &lt;br&gt;
003-   C (array_str_contains) : %f ms &lt;br&gt;
004-   Userland (foreach)     : %f ms &lt;br&gt;
005-   Speedup                : %f x faster &lt;br&gt;
001+ === BENCHMARK RESULTS (1,000 iterations)label&lt;/p&gt;
&lt;p&gt;007- [Match in middle] &lt;br&gt;
008-   C (array_str_contains) : %f ms &lt;br&gt;
009-   Userland (foreach)     : %f ms &lt;br&gt;
010-   Speedup                : %f x faster &lt;br&gt;
003+ [Match at start] &lt;br&gt;
004+   C (array_str_contains) :   11.40 ms &lt;br&gt;
005+   Userland (foreach)     :    2.74 ms &lt;br&gt;
006+   Speedup                :    0.24x faster&lt;/p&gt;
&lt;p&gt;012- [Match at end] &lt;br&gt;
013-   C (array_str_contains) : %f ms &lt;br&gt;
014-   Userland (foreach)     : %f ms &lt;br&gt;
015-   Speedup                : %f x faster &lt;br&gt;
008+ [Match in middle] &lt;br&gt;
009+   C (array_str_contains) :   12.85 ms &lt;br&gt;
010+   Userland (foreach)     :    5.94 ms &lt;br&gt;
011+   Speedup                :    0.46x faster&lt;/p&gt;
&lt;h1&gt;017- [No match (all)] &lt;br&gt;
018-   C (array_str_contains) : %f ms &lt;br&gt;
019-   Userland (foreach)     : %f ms &lt;br&gt;
020-   Speedup                : %f x faster &lt;br&gt;
013+ [Match at end] &lt;br&gt;
014+   C (array_str_contains) :   11.58 ms &lt;br&gt;
015+   Userland (foreach)     :    7.16 ms &lt;br&gt;
016+   Speedup                :    0.62x faster &lt;br&gt;
017+ &lt;br&gt;
018+ [No match (all)] &lt;br&gt;
019+   C (array_str_contains) :    6.47 ms &lt;br&gt;
020+   Userland (foreach)     :    8.22 ms &lt;br&gt;
021+   Speedup                :    1.27x faster &lt;br&gt;
========DONE======== &lt;br&gt;
FAIL Benchmark array_str_contains vs userland implementations &lt;br&gt;
[ext/standard/tests/array_str_contains_benchmark.phpt]&lt;/h1&gt;
&lt;p&gt;Furthermore, seems don't increase speed. This approach is maybe wrong.&lt;/p&gt;
&lt;p&gt;Anyway, You seems don't hear from people. &lt;br&gt;
Please hear from people.&lt;/p&gt;
&lt;p&gt;Yuya&lt;/p&gt;
&lt;p&gt;‪2026年9月9日(水) 20:56 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ چهارشنبه ۹ سپتامبر ۲۰۲۶، ۱۳:۵۹ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No,&lt;/p&gt;
&lt;p&gt;‪2026年9月9日(水) 0:40 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Yua,&lt;/p&gt;
&lt;p&gt;Thanks for your follow-up and for the time you've dedicated to this.&lt;/p&gt;
&lt;p&gt;As you know, we've been encountering &lt;code&gt;Segmentation Fault&lt;/code&gt; or &lt;br&gt;
&lt;code&gt;Timeout&lt;/code&gt; errors in the CI tests. I've reduced the benchmark iterations &lt;br&gt;
from 100,000 to 1,000 to see if the issue was due to excessive system load, &lt;br&gt;
but unfortunately, the CI error persists, and it seems the problem lies &lt;br&gt;
elsewhere.&lt;/p&gt;
&lt;p&gt;The exact cause of this error is still unclear at this moment.&lt;/p&gt;
&lt;p&gt;Following this function, I plan to work on graphics-related functions &lt;br&gt;
such as &lt;code&gt;mask&lt;/code&gt;, &lt;code&gt;str_mask&lt;/code&gt;, and others.&lt;/p&gt;
&lt;p&gt;در تاریخ سه‌شنبه ۸ سپتامبر ۲۰۲۶، ۰۸:۰۹ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Sepehr&lt;/p&gt;
&lt;p&gt;That PR fails your test. &lt;br&gt;
Please compile and test from your PC before push the CI. &lt;br&gt;
You can check php-src's README &lt;br&gt;
&lt;a href="https://github.com/php/php-src/blob/master/README.md" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/blob/master/README.md&lt;/a&gt;, If you don't &lt;br&gt;
understand how to build and test.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  ========DIFF========
  001- === BENCHMARK RESULTS (%d iterations) ===
  002- \[Match at start\]
  003-   C (array_str_contains) : %f ms
  004-   Userland (foreach)     : %f ms
  005-   Speedup                : %f x faster
  001+ === BENCHMARK RESULTS (100,000 iterations) ===

  007- \[Match in middle\]
  008-   C (array_str_contains) : %f ms
  009-   Userland (foreach)     : %f ms
  010-   Speedup                : %f x faster
  003+ [Match at start]
  004+   C (array_str_contains) :  577.66 ms
  005+   Userland (foreach)     :   13.74 ms
  006+   Speedup                :    0.02x faster

  012- \[Match at end\]
  013-   C (array_str_contains) : %f ms
  014-   Userland (foreach)     : %f ms
  015-   Speedup                : %f x faster
  008+ [Match in middle]
  009+   C (array_str_contains) :  632.95 ms
  010+   Userland (foreach)     :  251.77 ms
  011+   Speedup                :    0.40x faster

  017- \[No match (all)\]
  018-   C (array_str_contains) : %f ms
  019-   Userland (foreach)     : %f ms
  020-   Speedup                : %f x faster
  013+ [Match at end]
  014+   C (array_str_contains) :  625.46 ms
  015+   Userland (foreach)     :  482.63 ms
  016+   Speedup                :    0.77x faster
  017+
  018+ [No match (all)]
  019+   C (array_str_contains) :  465.12 ms
  020+   Userland (foreach)     :  474.41 ms
  021+   Speedup                :    1.02x faster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;p&gt;‪2026年9月8日(火) 2:21 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Yuya,&lt;/p&gt;
&lt;p&gt;Could you please take a look at the failed CI checks in my PR when &lt;br&gt;
you have time?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/php/php-src/pull/23512/checks" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23512/checks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’m getting 503 Service Unavailable errors when trying to access &lt;br&gt;
the logs, so I haven’t been able to determine whether the failures &lt;br&gt;
are related to my changes.&lt;/p&gt;
&lt;p&gt;I’m particularly concerned about the Tracing JIT and FreeBSD &lt;br&gt;
failures. &lt;br&gt;
I’d appreciate your help understanding them, or rerunning the &lt;br&gt;
failed &lt;br&gt;
jobs if appropriate.&lt;/p&gt;
&lt;p&gt;Thank you for your time.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I mentioned on GitHub, &lt;br&gt;
&lt;a href="https://github.com/php/php-src/pull/23512#issuecomment-5594220142" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23512#issuecomment-5594220142&lt;/a&gt; &lt;br&gt;
CI red is your test code is wrong, It's not CI timeout. &lt;br&gt;
You can confirm when build &amp;amp; test on your local PC.&lt;/p&gt;
&lt;p&gt;I'm telling you straight, If you cannot hear from PHP internals &lt;br&gt;
people, You are not enough ability on php-src yet. &lt;br&gt;
You can choose other way to contribute in PHP.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hello Yuya, &lt;br&gt;
Mr. Hamada—several prominent figures in the PHP community have praised &lt;br&gt;
my work. &lt;br&gt;
Please bear in mind that I am just preparing my very first function—and &lt;br&gt;
yes, it had a minor issue that I shared with you. &lt;br&gt;
There was a time when you, too, were creating your first function and &lt;br&gt;
surely encountered a small glitch—unless, of course, you happen to be Larry &lt;br&gt;
Page. So, instead of being so critical, please offer your support and &lt;br&gt;
encouragement to someone who—arguably—is among the first one or two &lt;br&gt;
Iranians to reach this level through exceptional programming skills. &lt;br&gt;
Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description><guid>CA+Jcf5t-DQfhKWZtH8dTsvNE4A5prNqSzw_K9SGmv_ggTJtAmQ@mail.gmail.com</guid><pubDate>Wed, 09 Sep 2026 20:35:45 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132463</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It also violates the exception policy in &lt;br&gt;
&lt;a href="https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables" rel="nofollow" target="_blank"&gt;https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables&lt;/a&gt;, &lt;br&gt;
which states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If an extension uses external functionality that may throw an exception it MUST wrap any exception thrown by that functionality into an appropriate exception of its own. It MUST set the $previous property to the original exception when doing so.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've read this last week and this interpretation of the exception &lt;br&gt;
policy has taunted me since then. Tim, I think you are mistaken in your &lt;br&gt;
point of view on this. I'm not aware of any point where exceptions &lt;br&gt;
thrown in user callback methods are wrapped, but at least autoloading, &lt;br&gt;
a very prominent one, does not. &lt;a href="https://3v4l.org/vYmts" rel="nofollow" target="_blank"&gt;https://3v4l.org/vYmts&lt;/a&gt; Changing this &lt;br&gt;
(in general for all user callbacks)  would be a very inconvenient BC &lt;br&gt;
break for many projects.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, much of the existing standard library predates the policy and more &lt;br&gt;
generally also predates any kind of API &lt;em&gt;design&lt;/em&gt; regarding exceptions. &lt;br&gt;
The first part of the standard library where the Exception hierarchy got &lt;br&gt;
any real design is the new random API in PHP 8.2 - and that served as &lt;br&gt;
the blueprint for the new URI extension and the exception policy.&lt;/p&gt;
&lt;p&gt;Regarding your specific example of autoloading, I'd argue that the &lt;br&gt;
correct behavior for autoloading is to wrap all exceptions. From a user &lt;br&gt;
perspective, autoloading is a blackbox service and it thus should behave &lt;br&gt;
like any other service (e.g. like the session example I have given in a &lt;br&gt;
previous email in this thread). In particular autoloading shows up &lt;br&gt;
“implicitly” in many cases and having a clear indicator that autoloading &lt;br&gt;
is what failed is useful. As an example, when using &lt;code&gt;class_exists()&lt;/code&gt;, I &lt;br&gt;
don't want arbitrary exceptions to show up: &lt;a href="https://3v4l.org/m0DIP#veol" rel="nofollow" target="_blank"&gt;https://3v4l.org/m0DIP#veol&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think this policy should be read differently. I think as a language &lt;br&gt;
user you should not have to be aware of the implementation of a &lt;br&gt;
functions internals. if some function is using something that could &lt;br&gt;
throw an exception this implementation detail should be hidden from the &lt;br&gt;
user. Also because if the function is re-implemented another way this &lt;br&gt;
exception could change. From the perspective of the language user, a &lt;br&gt;
callable provided to a function is not part of the functions internals.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would agree for functions like &lt;code&gt;array_map()&lt;/code&gt; or &lt;code&gt;array_filter()&lt;/code&gt; where &lt;br&gt;
the sole purpose is executing the user callback and which cannot fail &lt;br&gt;
for other reasons. But for &lt;code&gt;preg_replace_callback()&lt;/code&gt; and similar, the &lt;br&gt;
high level operation is “perform a replacement” and the provided &lt;br&gt;
callback is just an implementation detail. I would find it unexpected &lt;br&gt;
that &lt;code&gt;preg_replace()&lt;/code&gt; with a broken replacement string (e.g. &lt;br&gt;
hypothetically referencing a group that doesn't exist, this case &lt;br&gt;
currently doesn't seem to emit an error) would throw &lt;code&gt;PregException&lt;/code&gt;, &lt;br&gt;
but &lt;code&gt;preg_replace_callback()&lt;/code&gt; with a broken replacement callback would &lt;br&gt;
throw arbitrary errors.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhusp&lt;/p&gt;
</description><guid>5213e06ecdc3bf4734ea609b14f7de88@bastelstu.be</guid><pubDate>Wed, 09 Sep 2026 12:35:52 +0000</pubDate></item><item><title></title><link>https://externals.io/message/132462</link><description>&lt;p&gt;در تاریخ چهارشنبه ۹ سپتامبر ۲۰۲۶، ۱۳:۵۹ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No,&lt;/p&gt;
&lt;p&gt;‪2026年9月9日(水) 0:40 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Yua,&lt;/p&gt;
&lt;p&gt;Thanks for your follow-up and for the time you've dedicated to this.&lt;/p&gt;
&lt;p&gt;As you know, we've been encountering &lt;code&gt;Segmentation Fault&lt;/code&gt; or &lt;code&gt;Timeout&lt;/code&gt; &lt;br&gt;
errors in the CI tests. I've reduced the benchmark iterations from 100,000 &lt;br&gt;
to 1,000 to see if the issue was due to excessive system load, but &lt;br&gt;
unfortunately, the CI error persists, and it seems the problem lies &lt;br&gt;
elsewhere.&lt;/p&gt;
&lt;p&gt;The exact cause of this error is still unclear at this moment.&lt;/p&gt;
&lt;p&gt;Following this function, I plan to work on graphics-related functions &lt;br&gt;
such as &lt;code&gt;mask&lt;/code&gt;, &lt;code&gt;str_mask&lt;/code&gt;, and others.&lt;/p&gt;
&lt;p&gt;در تاریخ سه‌شنبه ۸ سپتامبر ۲۰۲۶، ۰۸:۰۹ youkidearitai &amp;lt; &lt;br&gt;
&lt;a href="mailto:youkidearitai@gmail.com" rel="nofollow" target="_blank"&gt;youkidearitai@gmail.com&lt;/a&gt;&amp;gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Sepehr&lt;/p&gt;
&lt;p&gt;That PR fails your test. &lt;br&gt;
Please compile and test from your PC before push the CI. &lt;br&gt;
You can check php-src's README &lt;br&gt;
&lt;a href="https://github.com/php/php-src/blob/master/README.md" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/blob/master/README.md&lt;/a&gt;, If you don't &lt;br&gt;
understand how to build and test.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  ========DIFF========
  001- === BENCHMARK RESULTS (%d iterations) ===
  002- \[Match at start\]
  003-   C (array_str_contains) : %f ms
  004-   Userland (foreach)     : %f ms
  005-   Speedup                : %f x faster
  001+ === BENCHMARK RESULTS (100,000 iterations) ===

  007- \[Match in middle\]
  008-   C (array_str_contains) : %f ms
  009-   Userland (foreach)     : %f ms
  010-   Speedup                : %f x faster
  003+ [Match at start]
  004+   C (array_str_contains) :  577.66 ms
  005+   Userland (foreach)     :   13.74 ms
  006+   Speedup                :    0.02x faster

  012- \[Match at end\]
  013-   C (array_str_contains) : %f ms
  014-   Userland (foreach)     : %f ms
  015-   Speedup                : %f x faster
  008+ [Match in middle]
  009+   C (array_str_contains) :  632.95 ms
  010+   Userland (foreach)     :  251.77 ms
  011+   Speedup                :    0.40x faster

  017- \[No match (all)\]
  018-   C (array_str_contains) : %f ms
  019-   Userland (foreach)     : %f ms
  020-   Speedup                : %f x faster
  013+ [Match at end]
  014+   C (array_str_contains) :  625.46 ms
  015+   Userland (foreach)     :  482.63 ms
  016+   Speedup                :    0.77x faster
  017+
  018+ [No match (all)]
  019+   C (array_str_contains) :  465.12 ms
  020+   Userland (foreach)     :  474.41 ms
  021+   Speedup                :    1.02x faster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;p&gt;‪2026年9月8日(火) 2:21 ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt;:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Yuya,&lt;/p&gt;
&lt;p&gt;Could you please take a look at the failed CI checks in my PR when &lt;br&gt;
you have time?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/php/php-src/pull/23512/checks" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23512/checks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’m getting 503 Service Unavailable errors when trying to access &lt;br&gt;
the logs, so I haven’t been able to determine whether the failures &lt;br&gt;
are related to my changes.&lt;/p&gt;
&lt;p&gt;I’m particularly concerned about the Tracing JIT and FreeBSD failures. &lt;br&gt;
I’d appreciate your help understanding them, or rerunning the failed &lt;br&gt;
jobs if appropriate.&lt;/p&gt;
&lt;p&gt;Thank you for your time.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I mentioned on GitHub, &lt;br&gt;
&lt;a href="https://github.com/php/php-src/pull/23512#issuecomment-5594220142" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23512#issuecomment-5594220142&lt;/a&gt; &lt;br&gt;
CI red is your test code is wrong, It's not CI timeout. &lt;br&gt;
You can confirm when build &amp;amp; test on your local PC.&lt;/p&gt;
&lt;p&gt;I'm telling you straight, If you cannot hear from PHP internals &lt;br&gt;
people, You are not enough ability on php-src yet. &lt;br&gt;
You can choose other way to contribute in PHP.&lt;/p&gt;
&lt;p&gt;Regards &lt;br&gt;
Yuya&lt;/p&gt;
&lt;h2&gt;--&lt;/h2&gt;
&lt;p&gt;Yuya Hamada (tekimen)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekitoh-memdhoi.info" rel="nofollow" target="_blank"&gt;https://tekitoh-memdhoi.info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/youkidearitai" rel="nofollow" target="_blank"&gt;https://github.com/youkidearitai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Hello Yuya, &lt;br&gt;
Mr. Hamada—several prominent figures in the PHP community have praised my work. &lt;br&gt;
Please bear in mind that I am just preparing my very first &lt;br&gt;
function—and yes, it had a minor issue that I shared with you. &lt;br&gt;
There was a time when you, too, were creating your first function and &lt;br&gt;
surely encountered a small glitch—unless, of course, you happen to be &lt;br&gt;
Larry Page. So, instead of being so critical, please offer your &lt;br&gt;
support and encouragement to someone who—arguably—is among the first &lt;br&gt;
one or two Iranians to reach this level through exceptional &lt;br&gt;
programming skills. &lt;br&gt;
Best regards, &lt;br&gt;
Sepehr&lt;/em&gt;&lt;/p&gt;
</description><guid>CA+Jcf5s9h3v_tLGCLHsqQRaiAx80KKjYOq=3XYxR-t_VWJeyCg@mail.gmail.com</guid><pubDate>Wed, 09 Sep 2026 11:56:25 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132461</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of &lt;br&gt;
the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in &lt;br&gt;
spirit. &lt;br&gt;
The goal of the throwable policy generally, and also with regard to &lt;br&gt;
that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously you wrote the policy and so are best placed to interpret it &lt;br&gt;
(and I am not a core developer / person with voting rights); however I &lt;br&gt;
agree with the angle Osama is coming from here - I wouldn't say this &lt;br&gt;
is an error that is (always) part of the same group. There wasn't any &lt;br&gt;
error in the call to &lt;code&gt;preg_replace_callback&lt;/code&gt; itself (or any of its &lt;br&gt;
functionality) - the error was in a way during the processing of the&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, I agree that this case is not entirely clear-cut - and it's good &lt;br&gt;
we're having this discussion now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I have understood the other example correctly, this contradicts &lt;br&gt;
quite significantly with the CSPRNG throwing an Exception that &lt;br&gt;
&lt;code&gt;RandomException&lt;/code&gt; contains - as the failure is a core issue within the &lt;br&gt;
function call itself as opposed to logic that occurs in userland.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think there might be a misunderstanding based on how you phrased that &lt;br&gt;
paragraph. To provide a more specific example:&lt;/p&gt;
&lt;p&gt;Consider I have a session implementation that uses Redis as its session &lt;br&gt;
storage backend. Session IDs need to be created using secure randomness, &lt;br&gt;
i.e. using the CSPRNG. Both the Redis backend and the CSPRNG can &lt;br&gt;
theoretically fail. As a user when create a new session I want to be &lt;br&gt;
able to just catch (SessionInitializedFailedException) and not care &lt;br&gt;
about whether the CSPRNG or the Redis connection failed, and I might not &lt;br&gt;
even know if it's Redis, Memcache, a File System or a MySQL database. &lt;br&gt;
Thus any underlying issues must be wrapped into a session-specific &lt;br&gt;
exception.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;preg_replace_callback()&lt;/code&gt; is different in that I explicitly pass in a &lt;br&gt;
callback and thus I'm technically in full control over the code that is &lt;br&gt;
being executed and I can theoretically know what exceptions could &lt;br&gt;
possibly be thrown and might intentionally want to handle them &lt;br&gt;
explicitly. On the other hand, failing to execute the callback means &lt;br&gt;
that the replacing operation failed, no further callbacks will be called &lt;br&gt;
and &lt;code&gt;preg_replace_callback()&lt;/code&gt; will not return anything - and that is a &lt;br&gt;
“running this regex failed” a.k.a. PregException situation to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If anything, I would argue that under the policy this should go the &lt;br&gt;
other way and become &lt;code&gt;PregError&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Error hierarchy MUST NOT be used for errors that are expected to &lt;br&gt;
be thrown (and caught) during normal operation of a PHP program. &lt;br&gt;
In terms of the possible errors that could occur, I would expect at &lt;br&gt;
least &lt;code&gt;PREG_INTERNAL_ERROR&lt;/code&gt;, &lt;code&gt;PREG_BAD_UTF8_ERROR&lt;/code&gt; &amp;amp; &lt;br&gt;
&lt;code&gt;PREG_JIT_STACKLIMIT_ERROR&lt;/code&gt; to be code errors that require a developer &lt;br&gt;
to need to correct their code (as my understanding of these would be &lt;br&gt;
that the pattern is invalid, or not quoted correctly, etc. Although &lt;br&gt;
&lt;code&gt;PREG_BACKTRACK_LIMIT_ERROR&lt;/code&gt; &amp;amp; &lt;code&gt;PREG_RECURSION_LIMIT_ERROR&lt;/code&gt; are more &lt;br&gt;
likely to occur based on user input, then the limit for both is &lt;br&gt;
controlled by an ini setting - so again, this likely isn't something I &lt;br&gt;
would say is expected to be thrown and caught during normal operation &lt;br&gt;
of a PHP program. The final error (&lt;code&gt;PREG_BAD_UTF8_OFFSET_ERROR&lt;/code&gt;) I &lt;br&gt;
&lt;em&gt;think&lt;/em&gt; would still likely need a code change to fix it occurring - &lt;br&gt;
although I have only done a quick Google to see &lt;em&gt;when&lt;/em&gt; it may occur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a good point. I agree that things like pattern compilation &lt;br&gt;
failures should be a PregError, since this is a clear programmer error &lt;br&gt;
and regular expressions are not supposed to be untrusted inputs. For the &lt;br&gt;
error error situations I would need to check as well if they are &lt;br&gt;
expected during regular operation or not. The backtrack or recursion &lt;br&gt;
limits I can see being caught intentionally to provide better error &lt;br&gt;
messages to a user (thus PregException).&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Tim,&lt;/p&gt;
&lt;p&gt;A couple of updates after digging into this further...&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I found a case that makes the &lt;code&gt;$e-&amp;gt;getMessage() === &lt;/code&gt;preg_last_error_msg()`` guarantee I leaned on not really hold in general. &lt;br&gt;
A &lt;code&gt;PregException&lt;/code&gt; freezes its message and code when it is thrown, but &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt; reads the per-request global. &lt;br&gt;
And so the two agree only while nothing runs between the throw and the read. &lt;br&gt;
A callback that makes its own flagged call breaks that...when the inner &lt;br&gt;
call throws, the outer operation bails and overwrites the global with &lt;br&gt;
&lt;code&gt;INTERNAL_ERROR&lt;/code&gt; (why it lands on that code is point 2) before you read it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try {
    preg_replace_callback(
        '/\w/',
        function ($m) {
            preg_match('//u', &amp;quot;\xff&amp;quot;, $inner, PREG_THROW_ON_ERROR);   //
the inner call throws
            return 'Y';
        },
        'a',
        flags: PREG_THROW_ON_ERROR,
    );
} catch (\PregException $e) {
    var_dump($e-&amp;gt;getMessage());        // &amp;quot;Malformed UTF-8 characters, ...&amp;quot;
 frozen in the exception
    var_dump(preg_last_error_msg());   // &amp;quot;Internal error&amp;quot; the global,
already overwritten
    var_dump($e-&amp;gt;getCode());           // 4   PREG_BAD_UTF8_ERROR
    var_dump(preg_last_error());       // 1   `PREG_INTERNAL_ERROR` 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So the equality is a property of a single flagged call, not an &lt;br&gt;
invariant...and the exception is a faithful snapshot of its own call, while &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt; is a global the next call moves.&lt;/p&gt;
&lt;p&gt;I should have stated it that narrowly.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;I was also wrong about the callback case. &lt;br&gt;
When a user callback throws, PHP does set &lt;code&gt;preg_last_error()&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt;. &lt;br&gt;
They come back as &lt;code&gt;PREG_INTERNAL_ERROR&lt;/code&gt; and &amp;quot;Internal error&amp;quot;, not &amp;quot;No &lt;br&gt;
error&amp;quot;, so my earlier claim that a callback throw leaves the error state &lt;br&gt;
untouched was incorrect.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I dug in the C code to see how that works, and how that value gets set &lt;br&gt;
changes what it means. &lt;br&gt;
When the callback throws, the replacement bails out ( &lt;br&gt;
&lt;a href="https://github.com/php/php-src/blob/82a15338e298142f52854b64d803695d4e5252df/ext/pcre/php_pcre.c#L1960" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/blob/82a15338e298142f52854b64d803695d4e5252df/ext/pcre/php_pcre.c#L1960&lt;/a&gt;), &lt;br&gt;
and the &lt;code&gt;error:&lt;/code&gt; path calls &lt;code&gt;pcre_handle_exec_error(count)&lt;/code&gt; ( &lt;br&gt;
&lt;a href="https://github.com/php/php-src/blob/82a15338e298142f52854b64d803695d4e5252df/ext/pcre/php_pcre.c#L2032-L2033" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/blob/82a15338e298142f52854b64d803695d4e5252df/ext/pcre/php_pcre.c#L2032-L2033&lt;/a&gt; &lt;br&gt;
). &lt;br&gt;
At that point &lt;code&gt;count&lt;/code&gt; is the successful match count, not a PCRE error code, &lt;br&gt;
and &lt;code&gt;pcre_handle_exec_error()&lt;/code&gt; has no case for a non-negative value, so it &lt;br&gt;
falls through to its default and returns &lt;code&gt;PHP_PCRE_INTERNAL_ERROR&lt;/code&gt; ( &lt;br&gt;
&lt;a href="https://github.com/php/php-src/blob/82a15338e298142f52854b64d803695d4e5252df/ext/pcre/php_pcre.c#L132" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/blob/82a15338e298142f52854b64d803695d4e5252df/ext/pcre/php_pcre.c#L132&lt;/a&gt; &lt;br&gt;
). &lt;br&gt;
The engine matched fine, but the &lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt; is a fallback the &lt;br&gt;
bail-out path leaves behind, not a diagnosis of anything PCRE did wrong.&lt;/p&gt;
&lt;p&gt;That means there is no real message for this case... &lt;br&gt;
A genuine PCRE error carries a specific reason (&lt;code&gt;&amp;quot;Malformed UTF-8 ...&amp;quot;&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;&amp;quot;Backtrack limit exhausted&amp;quot;&lt;/code&gt;, and so on...)... &lt;br&gt;
A callback throw only ever yields the generic &lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt;, because &lt;br&gt;
nothing in PCRE actually failed. &lt;br&gt;
The real information is the exception the callback threw, which carries its &lt;br&gt;
own message and type.&lt;/p&gt;
&lt;p&gt;So I would say this case is unlike the PCRE errors in a concrete way...that &lt;br&gt;
is for them the error state describes the failure, but here it does not.&lt;/p&gt;
&lt;p&gt;To me that leans (though it does not settle) toward letting the callback's &lt;br&gt;
exception propagate rather than wrapping it. &lt;br&gt;
Wrapping would turn a specific userland exception into a &lt;code&gt;PregException&lt;/code&gt; &lt;br&gt;
whose own message can only be &lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt;. &lt;br&gt;
Whether that lean is enough, or whether not wrapping here is still a &lt;br&gt;
violation of the throwable policy, I think is your call as its author. I am &lt;br&gt;
only laying out what the code does.&lt;/p&gt;
&lt;p&gt;With that said, I think the things we have so far that make the case for &lt;br&gt;
letting the callback's exception propagate are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A callback throwing is not a PCRE error. The engine matched, and &lt;br&gt;
userland threw. The &lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt; it records is the fallback above, &lt;br&gt;
not a diagnosis.&lt;/li&gt;
&lt;li&gt;There is no real message to deliver. The genuine message and type are &lt;br&gt;
in the callback's own exception. A &lt;code&gt;PregException&lt;/code&gt; here would carry only &lt;br&gt;
&lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Wrapping destroys catch-by-type. Domain exceptions from the callback &lt;br&gt;
all collapse into &lt;code&gt;PregException&lt;/code&gt;, so callers can no longer catch them by &lt;br&gt;
type and have to inspect &lt;code&gt;-&amp;gt;getPrevious()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It is the more flexible default. A caller who wants a single catch can &lt;br&gt;
throw a &lt;code&gt;PregException&lt;/code&gt; from their own callback. A caller who wants their &lt;br&gt;
own types back under wrapping cannot get them without catch-and-rethrow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now whether any of these is a knockout on its own is probably &lt;br&gt;
arguable...But I think together they justify letting the callback's &lt;br&gt;
exception propagate.&lt;/p&gt;
&lt;p&gt;But of course it turns on how the throwable policy should apply, so I need &lt;br&gt;
your judgement here.&lt;/p&gt;
&lt;p&gt;Thanks, &lt;br&gt;
Osama&lt;/p&gt;
</description><guid>CABE7Eu_1eO2e4sn42=ejqwZY7sLNE85-SmG_1Zv5qR9qNdfj-g@mail.gmail.com</guid><pubDate>Wed, 09 Sep 2026 11:34:01 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132460</link><description>&lt;blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;I disagree with the behavior of not wrapping Exceptions thrown in &lt;br&gt;
user callbacks: I believe the correct choice is to throw a &lt;br&gt;
\PregException with the Exception thrown in the callback as the &lt;br&gt;
&lt;code&gt;-&amp;gt;previous&lt;/code&gt; exception. Not wrapping the user callback exception means &lt;br&gt;
that one needs a &lt;code&gt;catch(Exception)&lt;/code&gt; with a try just around the preg_ &lt;br&gt;
call to reliably handle all errors during regular expression execution, &lt;br&gt;
which nullifies much of the benefit of having a dedicated exception &lt;br&gt;
class in the first place.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It also violates the exception policy in &lt;br&gt;
&lt;a href="https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables" rel="nofollow" target="_blank"&gt;https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables&lt;/a&gt;, &lt;br&gt;
which states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If an extension uses external functionality that may throw an exception it MUST wrap any exception thrown by that functionality into an appropriate exception of its own. It MUST set the $previous property to the original exception when doing so.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've read this last week and this interpretation of the exception policy has taunted me since then. Tim, I think you are mistaken in your point of view on this. I'm not aware of any point where exceptions thrown in user callback methods are wrapped, but at least autoloading, a very prominent one, does not. &lt;a href="https://3v4l.org/vYmts" rel="nofollow" target="_blank"&gt;https://3v4l.org/vYmts&lt;/a&gt; Changing this (in general for all user callbacks)  would be a very inconvenient BC break for many projects.&lt;/p&gt;
&lt;p&gt;I think this policy should be read differently. I think as a language user you should not have to be aware of the implementation of a functions internals. if some function is using something that could throw an exception this implementation detail should be hidden from the user. Also because if the function is re-implemented another way this exception could change. From the perspective of the language user, a callable provided to a function is not part of the functions internals.&lt;/p&gt;
&lt;p&gt;Specifically for this case, wrapping the users' exceptions in this RFC to me is very contra-intuïtive because it is inconsistent with other callbacks. Do you have an example where this wrapping currently takes place?&lt;/p&gt;
&lt;p&gt;Greetings, Casper&lt;/p&gt;
</description><guid>a5728143-5eda-4dc2-b52f-0b848f4d2856@app.fastmail.com</guid><pubDate>Wed, 09 Sep 2026 08:48:12 +0000</pubDate></item><item><title>Categorising engine bugs caused by nonsensical/malicious callback handlers as Undefined Behaviour and to not fix them</title><link>https://externals.io/message/132459</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My perspective is that memory issues in PHP that cause crashes are &lt;br&gt;
generally not good and should be resolved wherever possible. While PHP &lt;br&gt;
9 &lt;br&gt;
may address many of these issues, it is still far off and production &lt;br&gt;
code &lt;br&gt;
migration will take even longer. Therefore, fixes now are still &lt;br&gt;
relevant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree with that. Also even if PHP 9 will remove all current &lt;br&gt;
deprecations, there will certainly be new (engine) deprecations in the &lt;br&gt;
PHP 9.x cycle and we're back to the status quo.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>06537ed39a6e0d76b71f76c826cdd381@bastelstu.be</guid><pubDate>Tue, 08 Sep 2026 13:30:33 +0000</pubDate></item><item><title>Categorising engine bugs caused by nonsensical/malicious callback handlers as Undefined Behaviour and to not fix them</title><link>https://externals.io/message/132458</link><description>&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;As such I'd like to hear the opinions of Internals on if we can come to &lt;br&gt;
a consensus (ideally without an RFC...) that registering callbacks that &lt;br&gt;
mess around with state in non-intended ways is Undefined Behaviour (UB).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'd still very much be in favor of fixing these issues, mainly because &lt;br&gt;
they are a big time sink for the security team as well, due to &lt;br&gt;
false-positive reports. Arnaud and I were planning on proposing an RFC &lt;br&gt;
that mitigates at least a large portion of them, before we got occupied &lt;br&gt;
with other things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is absolutely the ideal fix for this class of issues.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I absolutely do not think each case should be considered individually, &lt;br&gt;
because we already tried this and the issues never stop coming.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;True, but UB exists outside that class and those issues are worth the &lt;br&gt;
attention imho.&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
Ilia Alshanetsky &lt;br&gt;
Technologist, CTO, Entrepreneur &lt;br&gt;
E: &lt;a href="mailto:ilia@ilia.ws" rel="nofollow" target="_blank"&gt;ilia@ilia.ws&lt;/a&gt; &lt;br&gt;
T: @iliaa &lt;br&gt;
B: &lt;a href="http://ilia.ws" rel="nofollow" target="_blank"&gt;http://ilia.ws&lt;/a&gt;&lt;/p&gt;
</description><guid>CALkpNnTnG88pgaPM1gGR+aDJ06PbRK1o_a-51gaYJEzt4ZPanQ@mail.gmail.com</guid><pubDate>Tue, 08 Sep 2026 13:28:15 +0000</pubDate></item><item><title>Categorising engine bugs caused by nonsensical/malicious callback handlers as Undefined Behaviour and to not fix them</title><link>https://externals.io/message/132457</link><description>&lt;p&gt;Hi Gina&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Over the last few years, more and more issues have been opened where a user defined error handler (or other callbacks) causes a Use After Free (UAF) when said error handler modifiers the variable/property that triggered the warning/deprecation/whatever. &lt;br&gt;
These issues are usually found via fuzzing, or more recently LLMs. &lt;br&gt;
&lt;em&gt;snip&lt;/em&gt; &lt;br&gt;
One potential idea that has been floating around is to delay error handlers. [1] &lt;br&gt;
However, these issue are likely to also happen from other callbacks such as a class autoloader, a tick handler, an output handler, etc. as nothing prevents them from messing around with $GLOBALS or binding a variable to its scope.&lt;/p&gt;
&lt;p&gt;While having C memory bugs is &lt;em&gt;far&lt;/em&gt; from ideal, the fact that a majority of them will disappear with PHP 9 when deprecation are removed and warnings are promoted to Error makes this whackamole bug chase a waste of time. Especially as these issues have been present for &lt;em&gt;decades&lt;/em&gt; and nobody except fuzzers and LLMs have run into these issues.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I very much share this sentiment. Yes, ideally there are no ways to &lt;br&gt;
trigger memory violations in PHP. However, while such bugs can be &lt;br&gt;
catastrophic for other languages like JavaScript where it's expected to &lt;br&gt;
run untrusted code on your computer, the same doesn't apply to PHP. &lt;br&gt;
These bugs are effectively impossible to trigger by accident and thus &lt;br&gt;
have no real-world consequence, and yet take up a very large chunk of &lt;br&gt;
our time (both in terms of issues and reviews.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As such I'd like to hear the opinions of Internals on if we can come to a consensus (ideally without an RFC...) that registering callbacks that mess around with state in non-intended ways is Undefined Behaviour (UB).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'd still very much be in favor of fixing these issues, mainly because &lt;br&gt;
they are a big time sink for the security team as well, due to &lt;br&gt;
false-positive reports. Arnaud and I were planning on proposing an RFC &lt;br&gt;
that mitigates at least a large portion of them, before we got occupied &lt;br&gt;
with other things.&lt;/p&gt;
&lt;p&gt;I absolutely do not think each case should be considered individually, &lt;br&gt;
because we already tried this and the issues never stop coming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While UB is far from desirable, it is not unprecedented in PHP. &lt;br&gt;
Prior to PHP 8, the behaviour of internal functions when given values of invalid types was considered UB, sometimes it returned false, sometimes, null, sometimes it threw an Error. &lt;br&gt;
This was fixed by throwing TypeErrors consistently.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The above might not all be problematic. E.g. the number of handlers that &lt;br&gt;
produce output are fairly limited. The reports we do get that use them &lt;br&gt;
rely on warnings printed to the output buffer, but if we can delay &lt;br&gt;
warnings then this goes away as well. Similarly, not that many handlers &lt;br&gt;
trigger autoloading. So this might be easier to control. But I did not &lt;br&gt;
verify my claims here. But if cases remain that aren't possible to fix, &lt;br&gt;
I wouldn't mind officially disallowing them.&lt;/p&gt;
&lt;p&gt;Ilija&lt;/p&gt;
</description><guid>049183c9-981b-49b9-8b85-f164f8bf76ea@gmail.com</guid><pubDate>Tue, 08 Sep 2026 13:04:40 +0000</pubDate></item><item><title>Categorising engine bugs caused by nonsensical/malicious callback handlers as Undefined Behaviour and to not fix them</title><link>https://externals.io/message/132456</link><description>&lt;blockquote&gt;
&lt;p&gt;While having C memory bugs is &lt;em&gt;far&lt;/em&gt; from ideal, the fact that a majority &lt;br&gt;
of them will disappear with PHP 9 when deprecation are removed and warnings &lt;br&gt;
are promoted to Error makes this whackamole bug chase a waste of time. &lt;br&gt;
Especially as these issues have been present for &lt;em&gt;decades&lt;/em&gt; and nobody &lt;br&gt;
except fuzzers and LLMs have run into these issues.&lt;/p&gt;
&lt;p&gt;As such I'd like to hear the opinions of Internals on if we can come to a &lt;br&gt;
consensus (ideally without an RFC...) that registering callbacks that mess &lt;br&gt;
around with state in non-intended ways is Undefined Behaviour (UB).&lt;/p&gt;
&lt;p&gt;While UB is far from desirable, it is not unprecedented in PHP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My perspective is that memory issues in PHP that cause crashes are &lt;br&gt;
generally not good and should be resolved wherever possible. While PHP 9 &lt;br&gt;
may address many of these issues, it is still far off and production code &lt;br&gt;
migration will take even longer. Therefore, fixes now are still relevant. &lt;br&gt;
That being said, I agree that fixes addressing odd/unlikely corner-cases &lt;br&gt;
with a measurable performance impact are probably not-desired. My &lt;br&gt;
suggestion is that this is handles on a case-by-case basis, balancing &lt;br&gt;
performance impact to crash likelyhood.&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
Ilia Alshanetsky &lt;br&gt;
Technologist, CTO, Entrepreneur &lt;br&gt;
E: &lt;a href="mailto:ilia@ilia.ws" rel="nofollow" target="_blank"&gt;ilia@ilia.ws&lt;/a&gt; &lt;br&gt;
T: @iliaa &lt;br&gt;
B: &lt;a href="http://ilia.ws" rel="nofollow" target="_blank"&gt;http://ilia.ws&lt;/a&gt;&lt;/p&gt;
</description><guid>CALkpNnQjPPAr703D0ELpwfGODy1qSBz6pnJXYEc3bUkatN1NRA@mail.gmail.com</guid><pubDate>Tue, 08 Sep 2026 12:17:28 +0000</pubDate></item><item><title>Categorising engine bugs caused by nonsensical/malicious callback handlers as Undefined Behaviour and to not fix them</title><link>https://externals.io/message/132455</link><description>&lt;p&gt;Hello internals,&lt;/p&gt;
&lt;p&gt;Over the last few years, more and more issues have been opened where a user defined error handler (or other callbacks) causes a Use After Free (UAF) when said error handler modifiers the variable/property that triggered the warning/deprecation/whatever. &lt;br&gt;
These issues are usually found via fuzzing, or more recently LLMs.&lt;/p&gt;
&lt;p&gt;One such example is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Victim {
    public $tag = &amp;quot;alive&amp;quot;;
    public function target() {
        echo $this-&amp;gt;tag;
    }
}

class Holder extends Victim {}

set_error_handler(function ($n, $s) {
    if (str_contains($s, 'Callables of the form')) {
        $GLOBALS['cb'] = null;
        `gc_collect_cycles()`;
    }
    return true;
});

$cb = [new Holder(), 'Victim::target'];
call_user_func($cb); // `SIGSEGV` 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Taken from &lt;a href="https://github.com/php/php-src/pull/23014" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/23014&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Nobody that wants to use PHP to do anything useful would write such an error handler, however mitigating these bugs requires tedious and intrusive fixes usually acting in the following way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Store the underlying zval value&lt;/li&gt;
&lt;li&gt;Increment the refcount of the stored value&lt;/li&gt;
&lt;li&gt;Emit the warning/deprecation/whatever&lt;/li&gt;
&lt;li&gt;If the zval was modified in some way, restore it (usually) by destroying the new value, or decrement the refcount&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This reference tracking dance adds complexity to the engine, but also has negative performance implications for the vast majority of users not doing anything stupid in their error handlers (or other callbacks). &lt;br&gt;
Especially as the most common triggering vector are engine deprecation or warnings that will be remove/promoted to throwing Errors in the future, where it will be very &lt;em&gt;easy&lt;/em&gt; to miss removing this refcounting dance.&lt;/p&gt;
&lt;p&gt;One potential idea that has been floating around is to delay error handlers. [1] &lt;br&gt;
However, these issue are likely to also happen from other callbacks such as a class autoloader, a tick handler, an output handler, etc. as nothing prevents them from messing around with $GLOBALS or binding a variable to its scope.&lt;/p&gt;
&lt;p&gt;While having C memory bugs is &lt;em&gt;far&lt;/em&gt; from ideal, the fact that a majority of them will disappear with PHP 9 when deprecation are removed and warnings are promoted to Error makes this whackamole bug chase a waste of time. Especially as these issues have been present for &lt;em&gt;decades&lt;/em&gt; and nobody except fuzzers and LLMs have run into these issues.&lt;/p&gt;
&lt;p&gt;As such I'd like to hear the opinions of Internals on if we can come to a consensus (ideally without an RFC...) that registering callbacks that mess around with state in non-intended ways is Undefined Behaviour (UB).&lt;/p&gt;
&lt;p&gt;While UB is far from desirable, it is not unprecedented in PHP. &lt;br&gt;
Prior to PHP 8, the behaviour of internal functions when given values of invalid types was considered UB, sometimes it returned false, sometimes, null, sometimes it threw an Error. &lt;br&gt;
This was fixed by throwing TypeErrors consistently.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Gina P. Banyard&lt;/p&gt;
&lt;p&gt;PS: This is also why removing warnings from the engine by converting them to exceptions is highly desirable, as exceptions have none of these issues as the execution is stopped. &lt;br&gt;
Error handlers specifically run in the middle of an operation which is how they can cause so much chaos. Tick handlers may also have these issues but this might actually be prevented by only calling them at sensible times after an operation has been fully performed.&lt;/p&gt;
&lt;p&gt;[1] &lt;a href="https://github.com/php/php-src/issues/20018" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/issues/20018&lt;/a&gt;&lt;/p&gt;
</description><guid>xuVqnmrgnm2BXIQnxWAbnWdtBWqaac81axDqfyOR1XF4hAkotIe0CPrpmqczzoav09mvAHsJAJQl7_xPEPhq8zMaI_HWhCfmRoMGGghrL_4=@gpb.moe</guid><pubDate>Tue, 08 Sep 2026 12:06:49 +0000</pubDate></item><item><title>[RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132454</link><description>&lt;p&gt;Hi Tim,&lt;/p&gt;
&lt;p&gt;Yes. The clone was necessary because ICU takes ownership &lt;br&gt;
of the UNumberFormat passed to it.&lt;/p&gt;
&lt;p&gt;And yes, this would be unexpected. Technically it is possible &lt;br&gt;
for us to fix this in the php side. My idea is to make the internal &lt;br&gt;
ICU formatter refreshed lazily before the next format() or &lt;br&gt;
formatnumeric() call, and by refreshing we observe if there is &lt;br&gt;
updates to the internal retained numberformatter.&lt;/p&gt;
&lt;p&gt;I think this is a good catch user-side. Will add this in the RFC &lt;br&gt;
and implementation. Thanks!&lt;/p&gt;
&lt;p&gt;Weilin&lt;/p&gt;
</description><guid>tencent_5265FD2E5DE8CAC5CF09C45C5D4A45BD5709@qq.com</guid><pubDate>Tue, 08 Sep 2026 08:46:35 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132453</link><description>&lt;blockquote&gt;
&lt;p&gt;Hey Rowan,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In other news, I noticed the mirror you created didn't yet have much styling, so I've put together a quick PR copying in the colours and basic styles from the existing site, plus an idea I had for a &amp;quot;locked PEAR&amp;quot; logo: &lt;a href="https://github.com/NickSdot/pear/pull/1" rel="nofollow" target="_blank"&gt;https://github.com/NickSdot/pear/pull/1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks, Rowan! I am fine with that. One thing I'd add: I think having the &amp;quot;locked PEAR&amp;quot; is nice. Not sure about the favicon change. It's will be a The PHP Group hosted archive, not the successor of the PEAR project. Keeping the PHP favicon feels more sound to me, personally. But I happily leave that decision to you and others (infra team?).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don't care what the favicon is, as long as there is one.&lt;/p&gt;
&lt;p&gt;cheers &lt;br&gt;
Derick&lt;/p&gt;
</description><guid>30C99279-537D-4783-86FF-337800AA1C05@php.net</guid><pubDate>Tue, 08 Sep 2026 08:27:38 +0000</pubDate></item><item><title>[RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132452</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am posting this as an &amp;quot;intent to vote&amp;quot; email to announce that &lt;br&gt;
the voting process of this RFC will be opened at 15 Sept if no &lt;br&gt;
further opinions/objections emerge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Similarly to the PREG_THROW_ON_ERROR one, I didn't yet get around to &lt;br&gt;
this one after my vacation. I've given it a very quick read, but not &lt;br&gt;
much thought. One point for now:&lt;/p&gt;
&lt;p&gt;The RFC specifies that the given ICU UNumberFormat is cloned internally. &lt;br&gt;
Does that mean if I pass in a NumberFormatter instance and later &lt;br&gt;
reconfigure using &lt;code&gt;-&amp;gt;setAttribute()&lt;/code&gt;, the changes will not be applied to &lt;br&gt;
IntlRelativeDateTimeFormatter? I believe this would be very unexpected &lt;br&gt;
behavior.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>e3492e6352eda89d84f9412d51f614a2@bastelstu.be</guid><pubDate>Tue, 08 Sep 2026 08:12:52 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132451</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would consider that a Minor change, so 1 week cool down, and you can &lt;br&gt;
post an intent to vote basically any time during that week as it has a &lt;br&gt;
1 week allowance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree. This change in circumstances seems substantial enough that it &lt;br&gt;
might cause folks to vote differently, without changing the actual &lt;br&gt;
proposal.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>bcddb6a609d279ef690f7fe2df576c8f@bastelstu.be</guid><pubDate>Tue, 08 Sep 2026 08:05:02 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132450</link><description>&lt;blockquote&gt;
&lt;p&gt;Hey Rowan,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That's great that someone finally got in touch. Does he have access to provide a database dump, so we can fill in the missing bug data?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was brought up. Unfortunately, the user accounts are gone. Hence, the bug data cannot be provided.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's a pity. In hindsight, if we'd acted sooner we could have rescued that content before it disappeared; but we couldn't have known that.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chuck is the one who had the authority to archive the repos in the PEAR GitHub organisation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would make a distinction between technical &lt;em&gt;ability&lt;/em&gt; and moral &lt;em&gt;authority&lt;/em&gt;. For example, many people have access to commit to the php-src repo; they have the &lt;em&gt;ability&lt;/em&gt; to make whatever changes they want, but they only have the &lt;em&gt;authority&lt;/em&gt; to make changes within our agreed process.&lt;/p&gt;
&lt;p&gt;In this case, Derick has the &lt;em&gt;ability&lt;/em&gt; to repoint the DNS for &lt;a href="http://pear.php.net" rel="nofollow" target="_blank"&gt;pear.php.net&lt;/a&gt;, but holding this discussion and an RFC vote is a way to grant &lt;em&gt;authority&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Chuck has apparently been keeping parts of the PEAR project running after others drifted off, and I thank him for that. If he &lt;em&gt;disagreed&lt;/em&gt; with the plan, that would have been significant - but so would anyone replying on the four PEAR mailing lists I posted to last October. Hearing that he is in favour is welcome, but it doesn't change much in terms of moral authority.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks, Rowan! I am fine with that. One thing I'd add: I think having the &amp;quot;locked PEAR&amp;quot; is nice. Not sure about the favicon change. It's will be a The PHP Group hosted archive, not the successor of the PEAR project. Keeping the PHP favicon feels more sound to me, personally. But I happily leave that decision to you and others (infra team?).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, I kept the favicon part in a separate commit in case it was controversial; feel free to cherry-pick the main styling and skip that one if you prefer.&lt;/p&gt;
&lt;p&gt;Cheers,&lt;/p&gt;
&lt;p&gt;Rowan Tommins &lt;br&gt;
[IMSoP]&lt;/p&gt;
</description><guid>C4EF9034-A663-4C96-AC1B-45EF15558F80@rwec.co.uk</guid><pubDate>Tue, 08 Sep 2026 07:55:37 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132449</link><description>&lt;p&gt;Hey Rowan,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That's great that someone finally got in touch. Does he have access to &lt;br&gt;
provide a database dump, so we can fill in the missing bug data?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was brought up. Unfortunately, the user accounts are gone. Hence, &lt;br&gt;
the bug data cannot be provided.&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This is great, because A) everyone involved agrees on the goal and B) &lt;br&gt;
this makes the vote a formality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unless you know something I don't, Chuck's agreement is just one vote, &lt;br&gt;
not any kind of final authority. He is listed at &lt;br&gt;
&lt;a href="https://pear.php.net/group/" rel="nofollow" target="_blank"&gt;https://pear.php.net/group/&lt;/a&gt; as one of eight members of &amp;quot;the PEAR &lt;br&gt;
Group&amp;quot;, so in theory the other seven could decide they want to &lt;br&gt;
continue the project. In fact, the Group was supposed to be re-elected &lt;br&gt;
annually, so even their collective authority is shaky if anyone really &lt;br&gt;
wanted to replace them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chuck is the one who had the authority to archive the repos in the PEAR &lt;br&gt;
GitHub organisation.&lt;/p&gt;
&lt;p&gt;Also, allow me to highlight the &amp;quot;Non-goals&amp;quot; section of the RFC:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal is not to take over the governance of the independent PEAR &lt;br&gt;
package ecosystem. &lt;em&gt;If an independent PEAR team wants to continue PEAR &lt;br&gt;
as an active project, they remain free to do so under domains they control.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In practice, he's the only person involved who anyone has managed to &lt;br&gt;
track down, and even that took several months, so I think we're safe &lt;br&gt;
to say nobody's that interested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That too, yes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In other news, I noticed the mirror you created didn't yet have much &lt;br&gt;
styling, so I've put together a quick PR copying in the colours and &lt;br&gt;
basic styles from the existing site, plus an idea I had for a &amp;quot;locked &lt;br&gt;
PEAR&amp;quot; logo: &lt;a href="https://github.com/NickSdot/pear/pull/1" rel="nofollow" target="_blank"&gt;https://github.com/NickSdot/pear/pull/1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks, Rowan! I am fine with that. One thing I'd add: I think having &lt;br&gt;
the &amp;quot;locked PEAR&amp;quot; is nice. Not sure about the favicon change. It's will &lt;br&gt;
be a The PHP Group hosted archive, not the successor of the PEAR &lt;br&gt;
project. Keeping the PHP favicon feels more sound to me, personally. But &lt;br&gt;
I happily leave that decision to you and others (infra team?).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Cheers &lt;br&gt;
Nick&lt;/p&gt;
</description><guid>64d87bea-94d1-4e4e-817e-2bb3b33f87b1@nicksdot.dev</guid><pubDate>Tue, 08 Sep 2026 05:03:08 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132448</link><description>&lt;blockquote&gt;
&lt;p&gt;Got news. The tl;dr is that Chuck Burgess from PEAR got in touch with &lt;br&gt;
me (and also Elizabeth from the foundation). He did let me know that &lt;br&gt;
he is good with looking at sunsetting the website and removing PEAR &lt;br&gt;
from PHP source.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's great that someone finally got in touch. Does he have access to &lt;br&gt;
provide a database dump, so we can fill in the missing bug data?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is great, because A) everyone involved agrees on the goal and B) &lt;br&gt;
this makes the vote a formality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unless you know something I don't, Chuck's agreement is just one vote, &lt;br&gt;
not any kind of final authority. He is listed at &lt;br&gt;
&lt;a href="https://pear.php.net/group/" rel="nofollow" target="_blank"&gt;https://pear.php.net/group/&lt;/a&gt; as one of eight members of &amp;quot;the PEAR Group&amp;quot;, &lt;br&gt;
so in theory the other seven could decide they want to continue the &lt;br&gt;
project. In fact, the Group was supposed to be re-elected annually, so &lt;br&gt;
even their collective authority is shaky if anyone really wanted to &lt;br&gt;
replace them.&lt;/p&gt;
&lt;p&gt;In practice, he's the only person involved who anyone has managed to &lt;br&gt;
track down, and even that took several months, so I think we're safe to &lt;br&gt;
say nobody's that interested.&lt;/p&gt;
&lt;p&gt;In other news, I noticed the mirror you created didn't yet have much &lt;br&gt;
styling, so I've put together a quick PR copying in the colours and &lt;br&gt;
basic styles from the existing site, plus an idea I had for a &amp;quot;locked &lt;br&gt;
PEAR&amp;quot; logo: &lt;a href="https://github.com/NickSdot/pear/pull/1" rel="nofollow" target="_blank"&gt;https://github.com/NickSdot/pear/pull/1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks again,&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
Rowan Tommins &lt;br&gt;
[IMSoP]&lt;/p&gt;
</description><guid>7145f3f4-b6c4-4744-b6ad-1c0f030d1a17@rwec.co.uk</guid><pubDate>Mon, 07 Sep 2026 22:17:28 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132447</link><description>&lt;p&gt;I would consider that a Minor change, so 1 week cool down, and you can post an intent to vote basically any time during that week as it has a 1 week allowance.&lt;/p&gt;
</description><guid>b24dafd5-e1a5-4d81-a884-c74a273d60b0@garfieldtech.com</guid><pubDate>Mon, 07 Sep 2026 20:37:15 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132446</link><description>&lt;p&gt;Hey everyone,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would like to open the discussion to &amp;quot;End PEAR Project Endorsement&amp;quot;: &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/end_pear_endorsement" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/end_pear_endorsement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Got news. The tl;dr is that Chuck Burgess from PEAR got in touch with me &lt;br&gt;
(and also Elizabeth from the foundation). He did let me know that he is &lt;br&gt;
good with looking at sunsetting the website and removing PEAR from PHP &lt;br&gt;
source.&lt;/p&gt;
&lt;p&gt;This is great, because A) everyone involved agrees on the goal and B) &lt;br&gt;
this makes the vote a formality.&lt;/p&gt;
&lt;p&gt;He said he doesn't read here, but anyway from me a thank you to Chuck!&lt;/p&gt;
&lt;p&gt;That said, I would soon bring this to vote -- so this mail could be seen &lt;br&gt;
as my &amp;quot;intend to vote&amp;quot; mail. However, there is one detail I would want &lt;br&gt;
to double check with you all. The RFC currently has this sentence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attempts to find solutions with PEAR maintainers, directly and &lt;br&gt;
through official channels, did not lead to results.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Given that Chuck now got in touch and is in favour, I am not happy &lt;br&gt;
leaving this sentence unchanged in the RFC. I'd much rather remove it &lt;br&gt;
(or strike it and amend the agreement?).&lt;/p&gt;
&lt;p&gt;The question is, when the &amp;quot;Proposal&amp;quot; section remains explicitly &lt;br&gt;
unchanged does it count as a minor change? Given the state of the PEAR &lt;br&gt;
website, and that the vote will be a formality, it would be pity to have &lt;br&gt;
to wait another two weeks to open the vote. Thoughts?&lt;/p&gt;
&lt;p&gt;Since this is a policy question I added Tim in CC.&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;Cheers &lt;br&gt;
Nick&lt;/p&gt;
</description><guid>7f12145a-ad3f-4b4f-a97e-cc05417bad43@nicksdot.dev</guid><pubDate>Mon, 07 Sep 2026 19:24:03 +0000</pubDate></item><item><title>[RFC] IntlRelativeDateTimeFormatter</title><link>https://externals.io/message/132445</link><description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I am posting this as an &amp;quot;intent to vote&amp;quot; email to announce that &lt;br&gt;
the voting process of this RFC will be opened at 15 Sept if no &lt;br&gt;
further opinions/objections emerge.&lt;/p&gt;
&lt;p&gt;RFC: &lt;a href="https://wiki.php.net/rfc/reldateformatter" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/reldateformatter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I hope you love this RFC :)&lt;/p&gt;
&lt;p&gt;Cheers, &lt;br&gt;
Weilin Du&lt;/p&gt;
</description><guid>tencent_5FD13B5456EC7289AE4C3C8A40C2D5A0F405@qq.com</guid><pubDate>Mon, 07 Sep 2026 17:19:03 +0000</pubDate></item><item><title>[RFC][Discussion] Add #[NoSerialize] attribute for excluding properties or classes from serialization</title><link>https://externals.io/message/132444</link><description>&lt;p&gt;Hi Nicolas,&lt;/p&gt;
&lt;p&gt;Thank you for the review, and sorry for the delay.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I checked code bases I know well, Symfony in particular, and I had a &lt;br&gt;
hard time finding any implementation of __serialize()/__sleep() that &lt;br&gt;
the property-level attribute would replace&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You are right, and the RFC was wrong to imply otherwise. There is no &lt;br&gt;
such __sleep() in Symfony.&lt;/p&gt;
&lt;p&gt;The class-level case is there, six times, written identically in &lt;br&gt;
Lock\Lock, Semaphore\Semaphore, Process\Pipes\UnixPipes, &lt;br&gt;
ErrorHandler\BufferingLogger, HttpClient\Chunk\ErrorChunk and &lt;br&gt;
Form\Util\OrderedHashMapIterator:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function __serialize(): array
{
    throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the property-level case, Magento 2 has 31 classes with __sleep(), &lt;br&gt;
chained so that each level strips its own injected services. Each &lt;br&gt;
class below extends the one above it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Framework\Model\AbstractModel: -8 properties
Framework\Model\AbstractExtensibleModel: -2
Eav\Model\Entity\Attribute\AbstractAttribute: -12
Eav\Model\Entity\Attribute: -4
Catalog\Model\ResourceModel\Eav\Attribute: -4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every level is array_diff(parent::__sleep(), [...]) with a mirrored &lt;br&gt;
__wakeup() re-injecting the same services, so each property is named &lt;br&gt;
twice. Same shape in their collection hierarchy, in Store and in User &lt;br&gt;
(13 properties). Smaller whitelist form: Laravel's RateLimited and &lt;br&gt;
Doctrine's PersistentCollection.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;having objects that embed both value-state and a PDO connection looks like a design smell&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Agreed as a principle, and PDO was a bad headline example. But this is &lt;br&gt;
the normal shape of an ORM model in Magento and Laravel, and it will &lt;br&gt;
not be redesigned away. __serialize() is not a substitute: it requires &lt;br&gt;
describing the whole format by hand, which is what produces those &lt;br&gt;
&lt;code&gt;array_diff()&lt;/code&gt; chains.&lt;/p&gt;
&lt;p&gt;The introduction has been rewritten around these examples.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;contracts propagate naturally to child classes. Attributes don't, and &lt;br&gt;
making this one an exception raises the question: why break attribute &lt;br&gt;
rules&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is not an exception. #[AllowDynamicProperties] already behaves this &lt;br&gt;
way, since 8.2:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#[AllowDynamicProperties]
class P {}
class C extends P {}

$c = new C;
$c-&amp;gt;dyn = 1;                 // no deprecation: flag is inherited
$r = new ReflectionClass('C');
$r-&amp;gt;getAttributes(AllowDynamicProperties::class);   // array(0) {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;zend_inheritance.c copies ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES from the &lt;br&gt;
parent, alongside ZEND_ACC_NOT_SERIALIZABLE.&lt;/p&gt;
&lt;p&gt;The interface alternative was argued at length in the 2024 thread and &lt;br&gt;
the list did not converge: Eberlei, Banyard and Dusk for the &lt;br&gt;
attribute, you and Larry for the interface.&lt;/p&gt;
&lt;p&gt;One cost that was not raised there: this RFC migrates 107 internal &lt;br&gt;
classes across 64 stub files. As an interface, all of them would gain &lt;br&gt;
a new entry in &lt;code&gt;class_implements()&lt;/code&gt; — observable userland state, and a &lt;br&gt;
larger BC surface than an attribute.&lt;/p&gt;
&lt;p&gt;If the list prefers an interface, that is the list's call, but it &lt;br&gt;
should be made deliberately rather than as a side effect here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;we would need reflection-based checks on every property during both &lt;br&gt;
serialization and unserialization&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I checked var-exporter. The cost is per-class on 7.x, and on 8.1 it is &lt;br&gt;
not reflection at all.&lt;/p&gt;
&lt;p&gt;Class-level is free: it sets the existing ZEND_ACC_NOT_SERIALIZABLE. &lt;br&gt;
On 7.x Registry::unserialize() calls native &lt;code&gt;unserialize()&lt;/code&gt;, which &lt;br&gt;
already guards that flag, and getClassReflector() probes with &lt;br&gt;
serialize($proto) once per class. ext-deepclone tests the flag &lt;br&gt;
directly (deepclone.c:519, :5234).&lt;/p&gt;
&lt;p&gt;Property-level on 8.1: VarExporter::export() delegates to &lt;br&gt;
deepclone_to_array(), whose fast path already iterates &lt;br&gt;
ce-&amp;gt;properties_info_table and tests prop_info-&amp;gt;flags — &lt;br&gt;
ZEND_ACC_STATIC, ZEND_ACC_PUBLIC, ZEND_ACC_PROTECTED_SET, &lt;br&gt;
ZEND_ACC_PRIVATE_SET (deepclone.c:2453-2489). ZEND_ACC_NO_SERIALIZE is &lt;br&gt;
one more condition in a loop that already runs. The polyfill does use &lt;br&gt;
reflection, but per class on both sides: $scopeMaps for export &lt;br&gt;
(DeepClone.php:785-795), $propertyScopes for hydration (:453).&lt;/p&gt;
&lt;p&gt;For the engine the comparison runs the other way: a ce_flags bit test &lt;br&gt;
is cheaper than instanceof, which is why the engine uses a flag.&lt;/p&gt;
&lt;p&gt;Three changes to the RFC since your message:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The introduction cites the codebases above instead of asserting that &lt;br&gt;
the use case is common.&lt;/li&gt;
&lt;li&gt;Internal classes are migrated explicitly, as @deprecated was &lt;br&gt;
migrated to #[\Deprecated] in 8.4, rather than having the attribute &lt;br&gt;
injected during code generation. @not-serializable stays supported for &lt;br&gt;
third-party extensions. This follows Tim's suggestion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unserialize()&lt;/code&gt; is now symmetric: a #[NoSerialize] property present in &lt;br&gt;
the payload is parsed and discarded rather than restored. The &lt;br&gt;
attribute now means &amp;quot;not part of the serialized form&amp;quot; in both &lt;br&gt;
directions, matching transient in Java and [NonSerialized] in C#, and &lt;br&gt;
removing an injection surface. The old behaviour is recorded under &lt;br&gt;
Rejected Features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Dmytro Kulyk&lt;/p&gt;
</description><guid>CAPqq82vQ2M_P9HY63c7y+KRtMNn3UiDx8AJ_JVwY57U_CcOuOA@mail.gmail.com</guid><pubDate>Mon, 07 Sep 2026 13:18:28 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132443</link><description>&lt;blockquote&gt;
&lt;p&gt;I think there might be a misunderstanding based on how you phrased that &lt;br&gt;
paragraph. To provide a more specific example:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sorry - I think I might have just worded my message poorly, as your &lt;br&gt;
more detailed example is how I understood the &lt;code&gt;RandomException&lt;/code&gt; to &lt;br&gt;
look like. I think the core is that in both cases; but specifically &lt;br&gt;
with the session example, the action is what has failed (and &lt;br&gt;
regardless of cause then it is desired to have a single catch to &lt;br&gt;
handle that).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;preg_replace_callback()&lt;/code&gt; is different in that I explicitly pass in a &lt;br&gt;
callback and thus I'm technically in full control over the code that is &lt;br&gt;
being executed and I can theoretically know what exceptions could &lt;br&gt;
possibly be thrown and might intentionally want to handle them &lt;br&gt;
explicitly&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking at this from a different angle - the first part (in that the &lt;br&gt;
developer is in full control of the code) might be the most important &lt;br&gt;
part here. If the developer wants any failure (a non-zero &lt;br&gt;
&lt;code&gt;preg_last_error()&lt;/code&gt; result or an error that occurs during the &lt;br&gt;
callback) to have a single catch block then the developer is able to &lt;br&gt;
throw a &lt;code&gt;PregException&lt;/code&gt; themselves (or a child of &lt;code&gt;PregException&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;However if &lt;code&gt;PregException&lt;/code&gt; wraps any &lt;code&gt;Throwable&lt;/code&gt;s in the userland &lt;br&gt;
callbacks, a developer who wants to have multiple catch blocks (or &lt;br&gt;
throw some exceptions that propagate to a higher scope in their &lt;br&gt;
callback) can only do that by catching and rethrowing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of &lt;br&gt;
the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in &lt;br&gt;
spirit. &lt;br&gt;
The goal of the throwable policy generally, and also with regard to &lt;br&gt;
that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously you wrote the policy and so are best placed to interpret it &lt;br&gt;
(and I am not a core developer / person with voting rights); however I &lt;br&gt;
agree with the angle Osama is coming from here - I wouldn't say this &lt;br&gt;
is an error that is (always) part of the same group. There wasn't any &lt;br&gt;
error in the call to &lt;code&gt;preg_replace_callback&lt;/code&gt; itself (or any of its &lt;br&gt;
functionality) - the error was in a way during the processing of the&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, I agree that this case is not entirely clear-cut - and it's good &lt;br&gt;
we're having this discussion now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I have understood the other example correctly, this contradicts &lt;br&gt;
quite significantly with the CSPRNG throwing an Exception that &lt;br&gt;
&lt;code&gt;RandomException&lt;/code&gt; contains - as the failure is a core issue within the &lt;br&gt;
function call itself as opposed to logic that occurs in userland.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think there might be a misunderstanding based on how you phrased that &lt;br&gt;
paragraph. To provide a more specific example:&lt;/p&gt;
&lt;p&gt;Consider I have a session implementation that uses Redis as its session &lt;br&gt;
storage backend. Session IDs need to be created using secure randomness, &lt;br&gt;
i.e. using the CSPRNG. Both the Redis backend and the CSPRNG can &lt;br&gt;
theoretically fail. As a user when create a new session I want to be &lt;br&gt;
able to just catch (SessionInitializedFailedException) and not care &lt;br&gt;
about whether the CSPRNG or the Redis connection failed, and I might not &lt;br&gt;
even know if it's Redis, Memcache, a File System or a MySQL database. &lt;br&gt;
Thus any underlying issues must be wrapped into a session-specific &lt;br&gt;
exception.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;preg_replace_callback()&lt;/code&gt; is different in that I explicitly pass in a &lt;br&gt;
callback and thus I'm technically in full control over the code that is &lt;br&gt;
being executed and I can theoretically know what exceptions could &lt;br&gt;
possibly be thrown and might intentionally want to handle them &lt;br&gt;
explicitly. On the other hand, failing to execute the callback means &lt;br&gt;
that the replacing operation failed, no further callbacks will be called &lt;br&gt;
and &lt;code&gt;preg_replace_callback()&lt;/code&gt; will not return anything - and that is a &lt;br&gt;
“running this regex failed” a.k.a. PregException situation to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If anything, I would argue that under the policy this should go the &lt;br&gt;
other way and become &lt;code&gt;PregError&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Error hierarchy MUST NOT be used for errors that are expected to &lt;br&gt;
be thrown (and caught) during normal operation of a PHP program. &lt;br&gt;
In terms of the possible errors that could occur, I would expect at &lt;br&gt;
least &lt;code&gt;PREG_INTERNAL_ERROR&lt;/code&gt;, &lt;code&gt;PREG_BAD_UTF8_ERROR&lt;/code&gt; &amp;amp; &lt;br&gt;
&lt;code&gt;PREG_JIT_STACKLIMIT_ERROR&lt;/code&gt; to be code errors that require a developer &lt;br&gt;
to need to correct their code (as my understanding of these would be &lt;br&gt;
that the pattern is invalid, or not quoted correctly, etc. Although &lt;br&gt;
&lt;code&gt;PREG_BACKTRACK_LIMIT_ERROR&lt;/code&gt; &amp;amp; &lt;code&gt;PREG_RECURSION_LIMIT_ERROR&lt;/code&gt; are more &lt;br&gt;
likely to occur based on user input, then the limit for both is &lt;br&gt;
controlled by an ini setting - so again, this likely isn't something I &lt;br&gt;
would say is expected to be thrown and caught during normal operation &lt;br&gt;
of a PHP program. The final error (&lt;code&gt;PREG_BAD_UTF8_OFFSET_ERROR&lt;/code&gt;) I &lt;br&gt;
&lt;em&gt;think&lt;/em&gt; would still likely need a code change to fix it occurring - &lt;br&gt;
although I have only done a quick Google to see &lt;em&gt;when&lt;/em&gt; it may occur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a good point. I agree that things like pattern compilation &lt;br&gt;
failures should be a PregError, since this is a clear programmer error &lt;br&gt;
and regular expressions are not supposed to be untrusted inputs. For the &lt;br&gt;
error error situations I would need to check as well if they are &lt;br&gt;
expected during regular operation or not. The backtrack or recursion &lt;br&gt;
limits I can see being caught intentionally to provide better error &lt;br&gt;
messages to a user (thus PregException).&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
</description><guid>CADjdLZ+aT8yq9BGMva0n+4mxf+Gj9g3sqzO=2WYU0-s7SxfC5w@mail.gmail.com</guid><pubDate>Mon, 07 Sep 2026 13:04:49 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132442</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of &lt;br&gt;
the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in &lt;br&gt;
spirit. &lt;br&gt;
The goal of the throwable policy generally, and also with regard to &lt;br&gt;
that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously you wrote the policy and so are best placed to interpret it &lt;br&gt;
(and I am not a core developer / person with voting rights); however I &lt;br&gt;
agree with the angle Osama is coming from here - I wouldn't say this &lt;br&gt;
is an error that is (always) part of the same group. There wasn't any &lt;br&gt;
error in the call to &lt;code&gt;preg_replace_callback&lt;/code&gt; itself (or any of its &lt;br&gt;
functionality) - the error was in a way during the processing of the&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, I agree that this case is not entirely clear-cut - and it's good &lt;br&gt;
we're having this discussion now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I have understood the other example correctly, this contradicts &lt;br&gt;
quite significantly with the CSPRNG throwing an Exception that &lt;br&gt;
&lt;code&gt;RandomException&lt;/code&gt; contains - as the failure is a core issue within the &lt;br&gt;
function call itself as opposed to logic that occurs in userland.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think there might be a misunderstanding based on how you phrased that &lt;br&gt;
paragraph. To provide a more specific example:&lt;/p&gt;
&lt;p&gt;Consider I have a session implementation that uses Redis as its session &lt;br&gt;
storage backend. Session IDs need to be created using secure randomness, &lt;br&gt;
i.e. using the CSPRNG. Both the Redis backend and the CSPRNG can &lt;br&gt;
theoretically fail. As a user when create a new session I want to be &lt;br&gt;
able to just catch (SessionInitializedFailedException) and not care &lt;br&gt;
about whether the CSPRNG or the Redis connection failed, and I might not &lt;br&gt;
even know if it's Redis, Memcache, a File System or a MySQL database. &lt;br&gt;
Thus any underlying issues must be wrapped into a session-specific &lt;br&gt;
exception.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;preg_replace_callback()&lt;/code&gt; is different in that I explicitly pass in a &lt;br&gt;
callback and thus I'm technically in full control over the code that is &lt;br&gt;
being executed and I can theoretically know what exceptions could &lt;br&gt;
possibly be thrown and might intentionally want to handle them &lt;br&gt;
explicitly. On the other hand, failing to execute the callback means &lt;br&gt;
that the replacing operation failed, no further callbacks will be called &lt;br&gt;
and &lt;code&gt;preg_replace_callback()&lt;/code&gt; will not return anything - and that is a &lt;br&gt;
“running this regex failed” a.k.a. PregException situation to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If anything, I would argue that under the policy this should go the &lt;br&gt;
other way and become &lt;code&gt;PregError&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Error hierarchy MUST NOT be used for errors that are expected to &lt;br&gt;
be thrown (and caught) during normal operation of a PHP program. &lt;br&gt;
In terms of the possible errors that could occur, I would expect at &lt;br&gt;
least &lt;code&gt;PREG_INTERNAL_ERROR&lt;/code&gt;, &lt;code&gt;PREG_BAD_UTF8_ERROR&lt;/code&gt; &amp;amp; &lt;br&gt;
&lt;code&gt;PREG_JIT_STACKLIMIT_ERROR&lt;/code&gt; to be code errors that require a developer &lt;br&gt;
to need to correct their code (as my understanding of these would be &lt;br&gt;
that the pattern is invalid, or not quoted correctly, etc. Although &lt;br&gt;
&lt;code&gt;PREG_BACKTRACK_LIMIT_ERROR&lt;/code&gt; &amp;amp; &lt;code&gt;PREG_RECURSION_LIMIT_ERROR&lt;/code&gt; are more &lt;br&gt;
likely to occur based on user input, then the limit for both is &lt;br&gt;
controlled by an ini setting - so again, this likely isn't something I &lt;br&gt;
would say is expected to be thrown and caught during normal operation &lt;br&gt;
of a PHP program. The final error (&lt;code&gt;PREG_BAD_UTF8_OFFSET_ERROR&lt;/code&gt;) I &lt;br&gt;
&lt;em&gt;think&lt;/em&gt; would still likely need a code change to fix it occurring - &lt;br&gt;
although I have only done a quick Google to see &lt;em&gt;when&lt;/em&gt; it may occur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a good point. I agree that things like pattern compilation &lt;br&gt;
failures should be a PregError, since this is a clear programmer error &lt;br&gt;
and regular expressions are not supposed to be untrusted inputs. For the &lt;br&gt;
error error situations I would need to check as well if they are &lt;br&gt;
expected during regular operation or not. The backtrack or recursion &lt;br&gt;
limits I can see being caught intentionally to provide better error &lt;br&gt;
messages to a user (thus PregException).&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>bb16c3a073a51259cef42c8eacb7ce74@bastelstu.be</guid><pubDate>Mon, 07 Sep 2026 12:31:23 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132441</link><description>&lt;blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in spirit. &lt;br&gt;
The goal of the throwable policy generally, and also with regard to that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously you wrote the policy and so are best placed to interpret it &lt;br&gt;
(and I am not a core developer / person with voting rights); however I &lt;br&gt;
agree with the angle Osama is coming from here - I wouldn't say this &lt;br&gt;
is an error that is (always) part of the same group. There wasn't any &lt;br&gt;
error in the call to &lt;code&gt;preg_replace_callback&lt;/code&gt; itself (or any of its &lt;br&gt;
functionality) - the error was in a way during the processing of the &lt;br&gt;
result of the function. Taking your example - what if instead of &lt;br&gt;
&lt;code&gt;CustomException&lt;/code&gt; you had &lt;code&gt;InvalidLengthException&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;IncorrectFormatException&lt;/code&gt;, &lt;code&gt;NotKnownBIN&lt;/code&gt;, etc. Instead of being able &lt;br&gt;
to catch say &lt;code&gt;InvalidLengthException&lt;/code&gt; &amp;amp; &lt;code&gt;IncorrectFormatException&lt;/code&gt; to &lt;br&gt;
return a validation error asking the user to check their input; &lt;br&gt;
&lt;code&gt;NotKnownBIN&lt;/code&gt; to return that the user can not use that particular card &lt;br&gt;
with you, and &lt;code&gt;PregException&lt;/code&gt; to note a system failure occurred then &lt;br&gt;
you have to catch &lt;code&gt;PregException&lt;/code&gt; (or &lt;code&gt;Exception&lt;/code&gt;) and then use &lt;br&gt;
&lt;code&gt;switch&lt;/code&gt; / &lt;code&gt;match&lt;/code&gt; on &lt;code&gt;$previous&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If I have understood the other example correctly, this contradicts &lt;br&gt;
quite significantly with the CSPRNG throwing an Exception that &lt;br&gt;
&lt;code&gt;RandomException&lt;/code&gt; contains - as the failure is a core issue within the &lt;br&gt;
function call itself as opposed to logic that occurs in userland.&lt;/p&gt;
&lt;p&gt;If anything, I would argue that under the policy this should go the &lt;br&gt;
other way and become &lt;code&gt;PregError&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Error hierarchy MUST NOT be used for errors that are expected to be thrown (and caught) during normal operation of a PHP program. &lt;br&gt;
In terms of the possible errors that could occur, I would expect at &lt;br&gt;
least &lt;code&gt;PREG_INTERNAL_ERROR&lt;/code&gt;, &lt;code&gt;PREG_BAD_UTF8_ERROR&lt;/code&gt; &amp;amp; &lt;br&gt;
&lt;code&gt;PREG_JIT_STACKLIMIT_ERROR&lt;/code&gt; to be code errors that require a developer &lt;br&gt;
to need to correct their code (as my understanding of these would be &lt;br&gt;
that the pattern is invalid, or not quoted correctly, etc. Although &lt;br&gt;
&lt;code&gt;PREG_BACKTRACK_LIMIT_ERROR&lt;/code&gt; &amp;amp; &lt;code&gt;PREG_RECURSION_LIMIT_ERROR&lt;/code&gt; are more &lt;br&gt;
likely to occur based on user input, then the limit for both is &lt;br&gt;
controlled by an ini setting - so again, this likely isn't something I &lt;br&gt;
would say is expected to be thrown and caught during normal operation &lt;br&gt;
of a PHP program. The final error (&lt;code&gt;PREG_BAD_UTF8_OFFSET_ERROR&lt;/code&gt;) I &lt;br&gt;
&lt;em&gt;think&lt;/em&gt; would still likely need a code change to fix it occurring - &lt;br&gt;
although I have only done a quick Google to see &lt;em&gt;when&lt;/em&gt; it may occur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I do admit that overall - my only real experience with the &lt;code&gt;preg_*&lt;/code&gt; &lt;br&gt;
functions erroring is where the pattern itself is not valid in some &lt;br&gt;
way; so there may be more common use-cases that fit the exception path&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;but hopefully explaining why my viewpoint is to treat it as an &lt;br&gt;
&lt;code&gt;Error&lt;/code&gt; hierarchy &lt;code&gt;Throwable&lt;/code&gt; as opposed to &lt;code&gt;Exception&lt;/code&gt; covers why not &lt;br&gt;
wrapping any throws from the userland callbacks makes sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now what I would suggest instead of breaking that guarantee, is to pull &lt;br&gt;
enriching the anemic &lt;code&gt;preg_last_error_msg()&lt;/code&gt; error message forward into &lt;br&gt;
this RFC instead of leaving it for later, store the real reason in the &lt;br&gt;
error state, and the exception inherits it through the very same channel, &lt;br&gt;
with the guarantee intact.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That would also work for me. But the &lt;code&gt;E_WARNING&lt;/code&gt; should remain when the &lt;br&gt;
PREG_THROW_ON_ERROR flag is not set, because some users might rely on &lt;br&gt;
the warning being emitted to turn it into an Exception themselves by &lt;br&gt;
means of an error handler.&lt;/p&gt;
&lt;p&gt;What is important to me is that the new flag cleanly results in an &lt;br&gt;
Exception and only an Exception for all possible errors, because this is &lt;br&gt;
what users will expect from it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On your second point, if this is a violation of a policy, then there isn't &lt;br&gt;
much to argue. I will just retract the vote and fix that.&lt;/p&gt;
&lt;p&gt;But I think I got confused here, and I would appreciate you explaining how &lt;br&gt;
that violates the policy.&lt;/p&gt;
&lt;p&gt;To make sure we're on the same ground, this is what I understood from your &lt;br&gt;
statement about wrapping exceptions thrown in user callbacks:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;preg_replace_callback(
     $pattern,
     fn () =&amp;gt; throw new CustomException(), // &amp;lt;- You want this wrapped in
PregException?
     $subject,
     flags: PREG_THROW_ON_ERROR,
);
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes. I expect a PregException where $e-&amp;gt;getPrevious() instanceof &lt;br&gt;
CustomException().&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I got it right (and I suspect I did), then how does that violate the &lt;br&gt;
policy? &lt;br&gt;
A user callback isn't external functionality, is it? Because as far as I &lt;br&gt;
understand, external functionality is something the extension itself &lt;br&gt;
depends on as part of its own implementation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in spirit.&lt;/p&gt;
&lt;p&gt;The goal of the throwable policy generally, and also with regard to that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block. Consider this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; try {
     $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');

     // sanitize credit card numbers
     $contents = preg_replace_callback(
         '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
         function ($matches) {
             return mask_credit_card($matches[0]);
         },
         $contents,
         falgs: PREG_THROW_ON_ERROR,
     );

     echo $contents;
 } catch (PregException $e) {
     echo &amp;quot;Sanitization failed\n&amp;quot;;
 } catch (HttpException $e) {
     echo &amp;quot;Download failed\n&amp;quot;;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I am catching the PregException to handle failures during the credit &lt;br&gt;
card sanitization step. If mask_credit_card() throws its own exception &lt;br&gt;
that is not wrapped, my catch blocks are insufficient and I would &lt;br&gt;
instead need to write it something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; try {
     $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');
 } catch (HttpException $e) {
     echo &amp;quot;Download failed\n&amp;quot;;
     return;
 }
 try {
     // sanitize credit card numbers
     $contents = preg_replace_callback(
         '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
         function ($matches) {
             return mask_credit_card($matches[0]);
         },
         $contents,
         falgs: PREG_THROW_ON_ERROR,
     );
 } catch (Exception $e) {
     echo &amp;quot;Sanitization failed\n&amp;quot;;
     return;
 }
 echo $contents;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To reliably handle just the exceptions that happen during sanitization &lt;br&gt;
and nothing else. This is a lot of extra boilerplate code and noise.&lt;/p&gt;
&lt;p&gt;Now if I am still interested in the inner exception for the callback &lt;br&gt;
failure, something like this would work:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; } catch (PregException $e) {
     if ($e-&amp;gt;getCode() === PregException::CALLBACK_FAILURE) {
         echo &amp;quot;Sanitization callback failed: &amp;quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$e-&amp;gt;getPrevious()-&amp;gt;getMessage(); &lt;br&gt;
} else { &lt;br&gt;
echo &amp;quot;Sanitization failed\n&amp;quot;; &lt;br&gt;
} &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;Because if the error code is callback failure, I know that there is a &lt;br&gt;
previous Exception. So I don't lose any functionality / information.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am also unaware of any functions that behave like that (wraps exceptions &lt;br&gt;
thrown in user callbacks in its own exception).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are a few cases where the CSPRNG (which throws RandomException on &lt;br&gt;
failure) is used internally and the exception on CSPRNG failure is &lt;br&gt;
wrapped. However much of the standard library predates the throwable &lt;br&gt;
policy (which was accepted in May 2025; &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/extension_exceptions" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/extension_exceptions&lt;/a&gt;), that's why it doesn't &lt;br&gt;
follow it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In fact, the opposite is the case for one of the precedents this RFC &lt;br&gt;
follows (&lt;code&gt;json_encode()&lt;/code&gt; with &lt;code&gt;JSON_THROW_ON_ERROR&lt;/code&gt; - although it doesn't &lt;br&gt;
accept a user callback): &lt;a href="https://3v4l.org/CtHYH#v8.5.10" rel="nofollow" target="_blank"&gt;https://3v4l.org/CtHYH#v8.5.10&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, that flag and JsonSerializable itself is much older than the policy.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
</description><guid>CADjdLZJhsqemO2NsSrij9NAoeuOuEeg=KunR+1_wTCxhb5PJ-g@mail.gmail.com</guid><pubDate>Mon, 07 Sep 2026 11:58:51 +0000</pubDate></item><item><title>[RFC] End PEAR Project Endorsement</title><link>https://externals.io/message/132440</link><description>&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We win nothing by further stalling a decision; I believe we should &lt;br&gt;
stop the endorsement for PEAR.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think this is the key: a lot of the comments on previous discussions &lt;br&gt;
were about &amp;quot;giving a chance&amp;quot; for one or other individual or group to &lt;br&gt;
revive the website. Multiple attempted contacts were made, and many &lt;br&gt;
months have gone by, with nobody reporting a positive result.&lt;/p&gt;
&lt;p&gt;If that's not long enough, how long is? If the site stays alive in its &lt;br&gt;
current state for 10 years, it will continue to be exploited by &lt;br&gt;
spammers and probably worse. That's not in anyone's interest.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Coincidentally, Andrew Nesbitt, who writes tooling and analysis &lt;br&gt;
comparing different packaging systems, wrote a recent post about &lt;br&gt;
approaches to sunsetting: &lt;br&gt;
&lt;a href="https://nesbitt.io/2026/06/23/sunsetting-a-package-manager.html"&gt;https://nesbitt.io/2026/06/23/sunsetting-a-package-manager.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of the points he discusses is that freezing a channel rather than &lt;br&gt;
taking it offline means that security vulnerabilities are also frozen &lt;br&gt;
in place, with no way to supersede them for anyone still using the old &lt;br&gt;
tooling.&lt;/p&gt;
&lt;p&gt;I think readonly is probably the right approach in this case at least &lt;br&gt;
in the short term, but actively sunsetting later is maybe something to &lt;br&gt;
consider.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree. I think we should commit to leaving it on for a specified &lt;br&gt;
amount only (a year), and then also turn off the archival variant of the &lt;br&gt;
site. We can move a tarball onto our &lt;a href="http://museum.php.net" rel="nofollow" target="_blank"&gt;museum.php.net&lt;/a&gt; property for &lt;br&gt;
archeologists.&lt;/p&gt;
&lt;p&gt;cheers, &lt;br&gt;
Derick&lt;/p&gt;
&lt;p&gt;-- &lt;br&gt;
&lt;a href="https://derickrethans.nl" rel="nofollow" target="_blank"&gt;https://derickrethans.nl&lt;/a&gt; | &lt;a href="https://xdebug.org" rel="nofollow" target="_blank"&gt;https://xdebug.org&lt;/a&gt; | &lt;a href="https://xdebug.cloud" rel="nofollow" target="_blank"&gt;https://xdebug.cloud&lt;/a&gt; &lt;br&gt;
Author of Xdebug. Like it? Consider supporting me: &lt;a href="https://xdebug.org/support" rel="nofollow" target="_blank"&gt;https://xdebug.org/support&lt;/a&gt; &lt;br&gt;
mastodon: @&lt;a href="mailto:derickr@phpc.social" rel="nofollow" target="_blank"&gt;derickr@phpc.social&lt;/a&gt; @&lt;a href="mailto:xdebug@phpc.social" rel="nofollow" target="_blank"&gt;xdebug@phpc.social&lt;/a&gt;&lt;/p&gt;
</description><guid>41b07544-07e0-d056-ad20-df05502bb706@php.net</guid><pubDate>Mon, 07 Sep 2026 09:03:46 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132439</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now what I would suggest instead of breaking that guarantee, is to pull &lt;br&gt;
enriching the anemic &lt;code&gt;preg_last_error_msg()&lt;/code&gt; error message forward into &lt;br&gt;
this RFC instead of leaving it for later, store the real reason in the &lt;br&gt;
error state, and the exception inherits it through the very same channel, &lt;br&gt;
with the guarantee intact.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That would also work for me. But the &lt;code&gt;E_WARNING&lt;/code&gt; should remain when the &lt;br&gt;
PREG_THROW_ON_ERROR flag is not set, because some users might rely on &lt;br&gt;
the warning being emitted to turn it into an Exception themselves by &lt;br&gt;
means of an error handler.&lt;/p&gt;
&lt;p&gt;What is important to me is that the new flag cleanly results in an &lt;br&gt;
Exception and only an Exception for all possible errors, because this is &lt;br&gt;
what users will expect from it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On your second point, if this is a violation of a policy, then there isn't &lt;br&gt;
much to argue. I will just retract the vote and fix that.&lt;/p&gt;
&lt;p&gt;But I think I got confused here, and I would appreciate you explaining how &lt;br&gt;
that violates the policy.&lt;/p&gt;
&lt;p&gt;To make sure we're on the same ground, this is what I understood from your &lt;br&gt;
statement about wrapping exceptions thrown in user callbacks:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;preg_replace_callback(
     $pattern,
     fn () =&amp;gt; throw new CustomException(), // &amp;lt;- You want this wrapped in
PregException?
     $subject,
     flags: PREG_THROW_ON_ERROR,
);
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes. I expect a PregException where $e-&amp;gt;getPrevious() instanceof &lt;br&gt;
CustomException().&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I got it right (and I suspect I did), then how does that violate the &lt;br&gt;
policy? &lt;br&gt;
A user callback isn't external functionality, is it? Because as far as I &lt;br&gt;
understand, external functionality is something the extension itself &lt;br&gt;
depends on as part of its own implementation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in spirit.&lt;/p&gt;
&lt;p&gt;The goal of the throwable policy generally, and also with regard to that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block. Consider this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; try {
     $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');

     // sanitize credit card numbers
     $contents = preg_replace_callback(
         '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
         function ($matches) {
             return mask_credit_card($matches[0]);
         },
         $contents,
         falgs: PREG_THROW_ON_ERROR,
     );

     echo $contents;
 } catch (PregException $e) {
     echo &amp;quot;Sanitization failed\n&amp;quot;;
 } catch (HttpException $e) {
     echo &amp;quot;Download failed\n&amp;quot;;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I am catching the PregException to handle failures during the credit &lt;br&gt;
card sanitization step. If mask_credit_card() throws its own exception &lt;br&gt;
that is not wrapped, my catch blocks are insufficient and I would &lt;br&gt;
instead need to write it something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; try {
     $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');
 } catch (HttpException $e) {
     echo &amp;quot;Download failed\n&amp;quot;;
     return;
 }
 try {
     // sanitize credit card numbers
     $contents = preg_replace_callback(
         '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
         function ($matches) {
             return mask_credit_card($matches[0]);
         },
         $contents,
         falgs: PREG_THROW_ON_ERROR,
     );
 } catch (Exception $e) {
     echo &amp;quot;Sanitization failed\n&amp;quot;;
     return;
 }
 echo $contents;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To reliably handle just the exceptions that happen during sanitization &lt;br&gt;
and nothing else. This is a lot of extra boilerplate code and noise.&lt;/p&gt;
&lt;p&gt;Now if I am still interested in the inner exception for the callback &lt;br&gt;
failure, something like this would work:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; } catch (PregException $e) {
     if ($e-&amp;gt;getCode() === PregException::CALLBACK_FAILURE) {
         echo &amp;quot;Sanitization callback failed: &amp;quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$e-&amp;gt;getPrevious()-&amp;gt;getMessage(); &lt;br&gt;
} else { &lt;br&gt;
echo &amp;quot;Sanitization failed\n&amp;quot;; &lt;br&gt;
} &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;Because if the error code is callback failure, I know that there is a &lt;br&gt;
previous Exception. So I don't lose any functionality / information.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am also unaware of any functions that behave like that (wraps exceptions &lt;br&gt;
thrown in user callbacks in its own exception).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are a few cases where the CSPRNG (which throws RandomException on &lt;br&gt;
failure) is used internally and the exception on CSPRNG failure is &lt;br&gt;
wrapped. However much of the standard library predates the throwable &lt;br&gt;
policy (which was accepted in May 2025; &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/extension_exceptions" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/extension_exceptions&lt;/a&gt;), that's why it doesn't &lt;br&gt;
follow it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In fact, the opposite is the case for one of the precedents this RFC &lt;br&gt;
follows (&lt;code&gt;json_encode()&lt;/code&gt; with &lt;code&gt;JSON_THROW_ON_ERROR&lt;/code&gt; - although it doesn't &lt;br&gt;
accept a user callback): &lt;a href="https://3v4l.org/CtHYH#v8.5.10" rel="nofollow" target="_blank"&gt;https://3v4l.org/CtHYH#v8.5.10&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, that flag and JsonSerializable itself is much older than the policy.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Tim,&lt;/p&gt;
&lt;p&gt;Thank you for the elaboration.&lt;/p&gt;
&lt;p&gt;The first thing that came to my mind reading your example is that &lt;br&gt;
without wrapping, an extra &lt;code&gt;catch&lt;/code&gt; block would be enough:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try {
    $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');

    $contents = preg_replace_callback(
        '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
        function ($matches) {
            return mask_credit_card($matches[0]); // throws MaskException
        },
        $contents,
        flags: PREG_THROW_ON_ERROR,
    );

    echo $contents;
} catch (MaskException $e) {
    echo &amp;quot;Sanitization failed\n&amp;quot;;
} catch (PregException $e) {
    echo &amp;quot;Regex failed\n&amp;quot;;
} catch (HttpException $e) {
    echo &amp;quot;Download failed\n&amp;quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The caveat of course is that this only works when you know the &lt;br&gt;
exception a callback can throw...which you don't always control.&lt;/p&gt;
&lt;p&gt;But since you've made clear this is a violation of the throwable &lt;br&gt;
policy, I've retracted the vote until we get it resolved.&lt;/p&gt;
&lt;p&gt;Following the idea of wrapping the callback's exception, I see two problems... &lt;br&gt;
One is a footgun I'd want explicitly addressed. &lt;br&gt;
The other, I'm afraid, forces an exception hierarchy in place of a &lt;br&gt;
single &lt;code&gt;PregException&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First...wrapping couples the exception you catch to the flag. &lt;br&gt;
Without it, &lt;code&gt;preg_replace_callback()&lt;/code&gt; throws whatever the callback throws. &lt;br&gt;
With it, the same call always throws a &lt;code&gt;PregException&lt;/code&gt;. &lt;br&gt;
So the flag silently changes which exception a caller has to handle, &lt;br&gt;
and the two have to move together:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try {
    preg_replace_callback(
        '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
        function ($matches) {
            return mask_credit_card($matches[0]); // throws MaskException
        },
        $contents,
    );
} catch (MaskException $e) {
    // becomes dead the moment the flag is added, and comes back the
moment it's removed
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Second...wrapping a callback's exception in a &lt;code&gt;PregException&lt;/code&gt; produces &lt;br&gt;
a &lt;code&gt;PregException&lt;/code&gt; that maps to no preg error. &lt;br&gt;
You can be holding a &lt;code&gt;PregException&lt;/code&gt; while &lt;code&gt;preg_last_error()&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt; report no error at all. That is an exception &lt;br&gt;
whose type says a regex error happened when, by preg's own state, none &lt;br&gt;
did. &lt;br&gt;
This is separate from the &lt;code&gt;$e-&amp;gt;getMessage() === &lt;/code&gt;preg_last_error_msg()`` &lt;br&gt;
guarantee I raised before. Even setting that aside, it's incoherent on &lt;br&gt;
its own terms, because the flag is &lt;code&gt;PREG_THROW_ON_ERROR&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;preg_last_error()&lt;/code&gt; is what an error is.&lt;/p&gt;
&lt;p&gt;So keeping that honest means a bare &lt;code&gt;PregException&lt;/code&gt; can no longer &lt;br&gt;
stand for two different things at once. &lt;br&gt;
So it has to split into a &lt;code&gt;PregPcreException&lt;/code&gt; (or a better name) &lt;br&gt;
carrying the real preg error and mirroring &lt;code&gt;preg_last_error()&lt;/code&gt;...and &lt;br&gt;
&lt;code&gt;PregCallbackException&lt;/code&gt; wrapping the callback's exception. And then to &lt;br&gt;
satisfy the single catch both would need to extend a shared &lt;br&gt;
&lt;code&gt;PregException&lt;/code&gt; parent. &lt;br&gt;
That's a whole hierarchy to carry a case an extra &lt;code&gt;catch&lt;/code&gt; would have handled.&lt;/p&gt;
&lt;p&gt;So the cost of wrapping comes out as a silent footgun plus a &lt;br&gt;
three-class hierarchy, for what one more &lt;code&gt;catch&lt;/code&gt; could do. &lt;br&gt;
Both look intrinsic to wrapping, though. The footgun is the flip side &lt;br&gt;
of the single catch you want, and the hierarchy is what keeps that &lt;br&gt;
catch honest, so neither can really be designed away.&lt;/p&gt;
&lt;p&gt;That is if I didn't miss anything along the way...&lt;/p&gt;
&lt;p&gt;So my question now is: is that price worth paying over the extra &lt;br&gt;
&lt;code&gt;catch&lt;/code&gt;...or is the extra &lt;code&gt;catch&lt;/code&gt; acceptable after all? &lt;br&gt;
That's where I'd hope your &amp;quot;Arguably this specific case is a bit &lt;br&gt;
debatable&amp;quot; leaves some room.&lt;/p&gt;
&lt;p&gt;In any case...I'll be working on how the &lt;code&gt;preg_last_error_msg()&lt;/code&gt; &lt;br&gt;
change impacts the RFC, and meanwhile looking for opinions on the &lt;br&gt;
wrapping points I've raised above.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Osama&lt;/p&gt;
</description><guid>CABE7Eu_AGG2sCczS0ab9poBXo2mXvT_Sc1WZpUSrNohtxcoVXA@mail.gmail.com</guid><pubDate>Mon, 07 Sep 2026 05:16:10 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132438</link><description>&lt;blockquote&gt;
&lt;p&gt;Hi all,&lt;/p&gt;
&lt;p&gt;The discussion period for &lt;code&gt;PREG_THROW_ON_ERROR&lt;/code&gt; has passed with no open issues, so I'm opening the vote.&lt;/p&gt;
&lt;p&gt;Recap: the RFC adds an opt-in &lt;code&gt;PREG_THROW_ON_ERROR&lt;/code&gt; flag. &lt;br&gt;
Pass it to any &lt;code&gt;preg_*&lt;/code&gt; matching function and any PCRE error the call records is additionally thrown as a &lt;code&gt;\PregException&lt;/code&gt;, so you can catch it instead of checking the return value. &lt;br&gt;
The exception's code and message match &lt;code&gt;preg_last_error()&lt;/code&gt; and &lt;code&gt;preg_last_error_msg()&lt;/code&gt; exactly, and a call without the flag behaves exactly as it does today.&lt;/p&gt;
&lt;p&gt;RFC: &lt;a href="https://wiki.php.net/rfc/preg_throw_on_error" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/preg_throw_on_error&lt;/a&gt; &lt;br&gt;
PR: &lt;a href="https://github.com/php/php-src/pull/22797" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/pull/22797&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voting is open now and closes on 2026-09-18 17:00:00 UTC.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Osama&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I'm cancelling the vote on PREG_THROW_ON_ERROR.&lt;/p&gt;
&lt;p&gt;The flag as it stands violates the throwable policy, as Tim's point shows. &lt;br&gt;
That's not something to fix with the vote open, so I'm pulling it back &lt;br&gt;
rather than changing the proposal out from under people who already &lt;br&gt;
voted.&lt;/p&gt;
&lt;p&gt;I'll keep the discussion here, and once things settle I'll start a fresh vote. &lt;br&gt;
The RFC is back under discussion.&lt;/p&gt;
&lt;p&gt;Thanks to Tim for catching this before it went further.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;
Osama&lt;/p&gt;
</description><guid>CABE7Eu84SzxPVueJ_ZdnNQq3U9dEQ3NiZOz4mn8fQ5LgT9-r4Q@mail.gmail.com</guid><pubDate>Mon, 07 Sep 2026 00:35:01 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132437</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now what I would suggest instead of breaking that guarantee, is to pull &lt;br&gt;
enriching the anemic &lt;code&gt;preg_last_error_msg()&lt;/code&gt; error message forward into &lt;br&gt;
this RFC instead of leaving it for later, store the real reason in the &lt;br&gt;
error state, and the exception inherits it through the very same channel, &lt;br&gt;
with the guarantee intact.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That would also work for me. But the &lt;code&gt;E_WARNING&lt;/code&gt; should remain when the &lt;br&gt;
PREG_THROW_ON_ERROR flag is not set, because some users might rely on &lt;br&gt;
the warning being emitted to turn it into an Exception themselves by &lt;br&gt;
means of an error handler.&lt;/p&gt;
&lt;p&gt;What is important to me is that the new flag cleanly results in an &lt;br&gt;
Exception and only an Exception for all possible errors, because this is &lt;br&gt;
what users will expect from it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On your second point, if this is a violation of a policy, then there isn't &lt;br&gt;
much to argue. I will just retract the vote and fix that.&lt;/p&gt;
&lt;p&gt;But I think I got confused here, and I would appreciate you explaining how &lt;br&gt;
that violates the policy.&lt;/p&gt;
&lt;p&gt;To make sure we're on the same ground, this is what I understood from your &lt;br&gt;
statement about wrapping exceptions thrown in user callbacks:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;preg_replace_callback(
     $pattern,
     fn () =&amp;gt; throw new CustomException(), // &amp;lt;- You want this wrapped in
PregException?
     $subject,
     flags: PREG_THROW_ON_ERROR,
);
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes. I expect a PregException where $e-&amp;gt;getPrevious() instanceof &lt;br&gt;
CustomException().&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I got it right (and I suspect I did), then how does that violate the &lt;br&gt;
policy? &lt;br&gt;
A user callback isn't external functionality, is it? Because as far as I &lt;br&gt;
understand, external functionality is something the extension itself &lt;br&gt;
depends on as part of its own implementation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Arguably this specific case is a bit debatable, but as the author of the &lt;br&gt;
throwable policy RFC, I believe that it is at least violated in spirit.&lt;/p&gt;
&lt;p&gt;The goal of the throwable policy generally, and also with regard to that &lt;br&gt;
specific paragraph is to allow reliably handling groups of errors &lt;br&gt;
without needing to wrap every individual statement into its own &lt;br&gt;
try-catch block. Consider this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; try {
     $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');

     // sanitize credit card numbers
     $contents = preg_replace_callback(
         '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
         function ($matches) {
             return mask_credit_card($matches[0]);
         },
         $contents,
         falgs: PREG_THROW_ON_ERROR,
     );

     echo $contents;
 } catch (PregException $e) {
     echo &amp;quot;Sanitization failed\n&amp;quot;;
 } catch (HttpException $e) {
     echo &amp;quot;Download failed\n&amp;quot;;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I am catching the PregException to handle failures during the credit &lt;br&gt;
card sanitization step. If mask_credit_card() throws its own exception &lt;br&gt;
that is not wrapped, my catch blocks are insufficient and I would &lt;br&gt;
instead need to write it something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; try {
     $contents = get_from_api('&lt;a href="http://example.com" rel="nofollow" target="_blank"&gt;http://example.com&lt;/a&gt;');
 } catch (HttpException $e) {
     echo &amp;quot;Download failed\n&amp;quot;;
     return;
 }
 try {
     // sanitize credit card numbers
     $contents = preg_replace_callback(
         '/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}/',
         function ($matches) {
             return mask_credit_card($matches[0]);
         },
         $contents,
         falgs: PREG_THROW_ON_ERROR,
     );
 } catch (Exception $e) {
     echo &amp;quot;Sanitization failed\n&amp;quot;;
     return;
 }
 echo $contents;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To reliably handle just the exceptions that happen during sanitization &lt;br&gt;
and nothing else. This is a lot of extra boilerplate code and noise.&lt;/p&gt;
&lt;p&gt;Now if I am still interested in the inner exception for the callback &lt;br&gt;
failure, something like this would work:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; } catch (PregException $e) {
     if ($e-&amp;gt;getCode() === PregException::CALLBACK_FAILURE) {
         echo &amp;quot;Sanitization callback failed: &amp;quot;, 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$e-&amp;gt;getPrevious()-&amp;gt;getMessage(); &lt;br&gt;
} else { &lt;br&gt;
echo &amp;quot;Sanitization failed\n&amp;quot;; &lt;br&gt;
} &lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;Because if the error code is callback failure, I know that there is a &lt;br&gt;
previous Exception. So I don't lose any functionality / information.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am also unaware of any functions that behave like that (wraps exceptions &lt;br&gt;
thrown in user callbacks in its own exception).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are a few cases where the CSPRNG (which throws RandomException on &lt;br&gt;
failure) is used internally and the exception on CSPRNG failure is &lt;br&gt;
wrapped. However much of the standard library predates the throwable &lt;br&gt;
policy (which was accepted in May 2025; &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/extension_exceptions" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/extension_exceptions&lt;/a&gt;), that's why it doesn't &lt;br&gt;
follow it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In fact, the opposite is the case for one of the precedents this RFC &lt;br&gt;
follows (&lt;code&gt;json_encode()&lt;/code&gt; with &lt;code&gt;JSON_THROW_ON_ERROR&lt;/code&gt; - although it doesn't &lt;br&gt;
accept a user callback): &lt;a href="https://3v4l.org/CtHYH#v8.5.10" rel="nofollow" target="_blank"&gt;https://3v4l.org/CtHYH#v8.5.10&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, that flag and JsonSerializable itself is much older than the policy.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>52d92b1d-b915-4f79-a877-b95f94ce4487@bastelstu.be</guid><pubDate>Sun, 06 Sep 2026 11:59:52 +0000</pubDate></item><item><title>[RFC][DISCUSSION] Add RFC 4648 compliant data encoding API</title><link>https://externals.io/message/132436</link><description>&lt;p&gt;Hi Ignace, &lt;br&gt;
Some context: I maintain libraries including spomky-labs/base64url, two one-line &lt;br&gt;
functions with 46M downloads. So, strong +1 on getting this into core.&lt;/p&gt;
&lt;p&gt;Two gaps in DecodingMode::Strict I would like closed, both verified on 8.5:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    // whitespace is skipped, even in strict mode
    base64_decode(&amp;quot;QUJD\nRA==&amp;quot;, true);                            // &amp;quot;ABCD&amp;quot;


    // non-canonical trailing bits are discarded, not checked
    base64_decode('QQ==', true) === base64_decode('QR==', true);  // true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The RFC keeps whitespace ignored &amp;quot;independent of the mode&amp;quot;, but sections &lt;br&gt;
3.1 and 3.3 say the opposite, and in JOSE the signature covers the exact &lt;br&gt;
string received, so skipping whitespace decouples what was verified from &lt;br&gt;
what was decoded. Section 3.5 then lets a decoder reject non-zero pad &lt;br&gt;
bits, and Strict is where that belongs: sixteen strings decode to any &lt;br&gt;
one-byte tail, four to any two-byte tail. WebAuthn credential IDs and JWT &lt;br&gt;
kid values are used as database keys, so that is sixteen spellings of one &lt;br&gt;
credential, fifteen of them outside your unique index.&lt;/p&gt;
&lt;p&gt;Smaller point: please state explicitly that Base64::UrlSafe accepts padded &lt;br&gt;
and unpadded input under Strict, and that PreservePadding with it is not a &lt;br&gt;
ValueError. Padded base64url is legal per section 5 and does show up in &lt;br&gt;
the wild.&lt;/p&gt;
&lt;p&gt;Happy to help on the base64 implementation and to bring test vectors; &lt;br&gt;
between JOSE, WebAuthn and COSE I have a fairly nasty corpus of &lt;br&gt;
real-world base64url.&lt;/p&gt;
&lt;h2&gt;Best regards&lt;/h2&gt;
&lt;p&gt;Florent Morselli&lt;/p&gt;
&lt;p&gt;Le samedi 5 septembre 2026 à 17:59, ignace nyamagana butera &lt;a href="mailto:nyamsprod@gmail.com"&gt;nyamsprod@gmail.com&lt;/a&gt; a écrit :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi all, &lt;br&gt;
Since my last reply I have updated the RFC:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;RFC Text: &lt;a href="https://wiki.php.net/rfc/data_encoding_api" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/data_encoding_api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Discussion Thread: &lt;a href="https://news-web.php.net/php.internals/128069" rel="nofollow" target="_blank"&gt;https://news-web.php.net/php.internals/128069&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The main changes are:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;I added functions for base58 and base85 encoding;&lt;/li&gt;
&lt;li&gt;For completeness, I introduced an error marker class (as per PHP policies) and a specific exception to handle potential encoding errors;&lt;/li&gt;
&lt;li&gt;I added examples to better explain the expected behaviours during string process;&lt;/li&gt;
&lt;li&gt;I have updated the migration path from the current/legacy API to the newly proposed API;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Ignace&lt;/p&gt;
&lt;/blockquote&gt;
</description><guid>mAT2T_zJJKdcSDwX0jjVHCwsw2ST_06gXyS33ZsEhpgYeClwDZz6iX8ZW6S3CHCZ4QeQOrn8QP-SpS6oLf67uRPHf7FBGv1qOHrPgsnVhyM=@morselli.fr</guid><pubDate>Sat, 05 Sep 2026 16:02:42 +0000</pubDate></item><item><title>[RFC] OpenSSL provider-based algorithms and post-quantum cryptography support</title><link>https://externals.io/message/132435</link><description>&lt;blockquote&gt;
&lt;p&gt;I am happy to work on the RFC, API design, documentation and testing, &lt;br&gt;
and to help with the implementation where I can. I would particularly &lt;br&gt;
appreciate involvement from someone already working on ext/openssl for &lt;br&gt;
the actual C implementation.&lt;/p&gt;
&lt;p&gt;I am currently preparing an RFC and would especially appreciate feedback &lt;br&gt;
from people familiar with ext/openssl on the general direction and API &lt;br&gt;
design before finalizing the proposal.&lt;/p&gt;
&lt;p&gt;In particular, I'd be interested in opinions on whether provider-based &lt;br&gt;
key support and the KEM API should be addressed in a single RFC or split &lt;br&gt;
into separate proposals.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi Timo, &lt;br&gt;
Sebastian sent an email a while ago with similar motivation. It &lt;br&gt;
unfortunately did not get any traction, but I'm glad this was brought &lt;br&gt;
up again:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://externals.io/message/130673" rel="nofollow" target="_blank"&gt;https://externals.io/message/130673&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Similar to how ext-curl integrates libcurl into PHP, I personally &lt;br&gt;
believe that, ideally, ext-openssl should remain as close as possible &lt;br&gt;
to OpenSSL, without introducing our own APIs. Userland libraries can &lt;br&gt;
abstract the complexities and provide purpose-built and intuitive &lt;br&gt;
APIs. This simplifies our work in the integration, and provides an &lt;br&gt;
easy verification path for ext-openssl development.&lt;/p&gt;
&lt;p&gt;ext-openssl not only lacks PQC APIs, but also several other features &lt;br&gt;
and changes introduced in OpenSSL 3.5 and 4. It can be quite a big &lt;br&gt;
task, and I'd be really happy to help in any ways I can too.&lt;/p&gt;
&lt;p&gt;Thank you, &lt;br&gt;
Ayesh.&lt;/p&gt;
</description><guid>CANLbj-qmqAzfRw4HOYb+6AeGH1ACsR8m4bu1rs_K3ARjir4pdw@mail.gmail.com</guid><pubDate>Sat, 05 Sep 2026 10:57:56 +0000</pubDate></item><item><title>[RFC] OpenSSL provider-based algorithms and post-quantum cryptography support</title><link>https://externals.io/message/132434</link><description>&lt;p&gt;Hi internals,&lt;/p&gt;
&lt;p&gt;I'd like to start a discussion about improving support for modern &lt;br&gt;
OpenSSL provider-based asymmetric algorithms in ext/openssl, in &lt;br&gt;
particular post-quantum cryptography (PQC).&lt;/p&gt;
&lt;p&gt;This is related to the following existing issues:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/php/php-src/issues/22862" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/issues/22862&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/php/php-src/issues/23421" rel="nofollow" target="_blank"&gt;https://github.com/php/php-src/issues/23421&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With recent OpenSSL versions, standardized post-quantum algorithms such &lt;br&gt;
as ML-KEM, ML-DSA and SLH-DSA are available through the EVP/provider APIs.&lt;/p&gt;
&lt;p&gt;However, PHP's OpenSSL extension currently exposes asymmetric &lt;br&gt;
cryptography largely through a fixed set of OPENSSL_KEYTYPE_* constants &lt;br&gt;
and does not expose the generic KEM encapsulation/decapsulation &lt;br&gt;
operations provided by OpenSSL.&lt;/p&gt;
&lt;p&gt;Rather than adding individual PHP constants and APIs for each PQC &lt;br&gt;
algorithm, I would like to explore exposing the underlying OpenSSL &lt;br&gt;
provider model more generically.&lt;/p&gt;
&lt;p&gt;The initial idea is to cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;asymmetric key generation using an OpenSSL algorithm name;&lt;/li&gt;
&lt;li&gt;provider-backed algorithms which do not have a dedicated &lt;br&gt;
OPENSSL_KEYTYPE_* constant;&lt;/li&gt;
&lt;li&gt;generic KEM encapsulation and decapsulation;&lt;/li&gt;
&lt;li&gt;support for provider-backed signature algorithms such as ML-DSA and &lt;br&gt;
SLH-DSA through the existing signing APIs where possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An important goal would be to keep this generic rather than making the &lt;br&gt;
PHP API specific to ML-KEM or other currently standardized PQC &lt;br&gt;
algorithms. This would allow future algorithms and potentially &lt;br&gt;
third-party OpenSSL providers to use the same API.&lt;/p&gt;
&lt;p&gt;I should also mention that I am probably not the right person to &lt;br&gt;
implement the C side of this proposal myself. My C experience is &lt;br&gt;
somewhat rusty and, given that this concerns security-sensitive &lt;br&gt;
cryptographic functionality, I would strongly prefer the implementation &lt;br&gt;
to be done or at least closely guided and reviewed by someone who is &lt;br&gt;
already familiar with ext/openssl and its internals.&lt;/p&gt;
&lt;p&gt;From my current understanding, the implementation effort should be &lt;br&gt;
relatively contained, since the cryptographic primitives themselves are &lt;br&gt;
already implemented by OpenSSL. The main task would be exposing the &lt;br&gt;
corresponding existing EVP/provider functionality through ext/openssl &lt;br&gt;
and integrating it consistently with PHP's existing OpenSSL APIs.&lt;/p&gt;
&lt;p&gt;That said, I don't want to underestimate the details involved in safely &lt;br&gt;
exposing these APIs, particularly around key handling, provider &lt;br&gt;
compatibility, error handling and maintaining compatibility with the &lt;br&gt;
OpenSSL versions supported by PHP.&lt;/p&gt;
&lt;p&gt;I am happy to work on the RFC, API design, documentation and testing, &lt;br&gt;
and to help with the implementation where I can. I would particularly &lt;br&gt;
appreciate involvement from someone already working on ext/openssl for &lt;br&gt;
the actual C implementation.&lt;/p&gt;
&lt;p&gt;I am currently preparing an RFC and would especially appreciate feedback &lt;br&gt;
from people familiar with ext/openssl on the general direction and API &lt;br&gt;
design before finalizing the proposal.&lt;/p&gt;
&lt;p&gt;In particular, I'd be interested in opinions on whether provider-based &lt;br&gt;
key support and the KEM API should be addressed in a single RFC or split &lt;br&gt;
into separate proposals.&lt;/p&gt;
&lt;p&gt;Thanks, &lt;br&gt;
Timo&lt;/p&gt;
</description><guid>e17f4e7d-9dda-4f79-b126-1fb733278fe7@2email.de</guid><pubDate>Sat, 05 Sep 2026 10:05:49 +0000</pubDate></item><item><title>[RFC] [VOTE] PREG_THROW_ON_ERROR</title><link>https://externals.io/message/132433</link><description>&lt;p&gt;Hi Tim,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I regretfully were not able to work through the list backlog after my &lt;br&gt;
summer vacation and thus also missed the intent to vote. I have just &lt;br&gt;
read through the RFC and voted against it, despite being in agreement of &lt;br&gt;
the general concept.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No worries at all. I'd already read the quiet on the thread as people being &lt;br&gt;
busy rather than as sign-off, so I'm glad it came when it did. &lt;br&gt;
I'd rather get this right than get it fast.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Specifically:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I disagree with keeping the Warning on compilation errors. This &lt;br&gt;
feature is entirely new and opt-in, thus there are no backwards &lt;br&gt;
compatibility expectations or considerations. The &lt;code&gt;$e-&amp;gt;getMessage() === &lt;/code&gt;preg_last_error_msg()`` guarantee makes the feature much worse than it &lt;br&gt;
could be for compilation errors. Including all necessary information in &lt;br&gt;
the Exception is a must for me.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;On your first point, I think I can safely claim that I understand exactly &lt;br&gt;
where you're coming from, because what you're describing was what I &lt;br&gt;
actually chose first.&lt;/p&gt;
&lt;p&gt;What moved me off it was a single decision that I had to make later when I &lt;br&gt;
faced the array case&lt;a href="https://wiki.php.net/rfc/preg_throw_on_error#arrays"&gt;^1&lt;/a&gt; about whether this flag should add error semantics &lt;br&gt;
of its own, or only deliver the error the call already recorded via an &lt;br&gt;
exception.&lt;/p&gt;
&lt;p&gt;I chose the second, and the reasons for the warning/error messages case &lt;br&gt;
were:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The detailed compile message isn't in the error state to begin with. &lt;br&gt;
When a pattern fails to compile, the error from &lt;br&gt;
&lt;code&gt;pcre2_get_error_message()&lt;/code&gt; only ever goes into the &lt;code&gt;E_WARNING&lt;/code&gt; and is then &lt;br&gt;
thrown away. To put that detail in the exception, we must store it &lt;br&gt;
somewhere first.&lt;/li&gt;
&lt;li&gt;It would make the flag the one place in ext/pcre that knows more &lt;br&gt;
about the error than &lt;code&gt;preg_last_error_msg()&lt;/code&gt; does.&lt;/li&gt;
&lt;li&gt;The better fix, which resolves the two issues above, is to repair the &lt;br&gt;
anemic message at its source, in &lt;code&gt;preg_last_error_msg()&lt;/code&gt; itself, store the &lt;br&gt;
real reason in the error state for compile errors, and the exception just &lt;br&gt;
inherits it, with no new flag behavior at all. &lt;br&gt;
But that would widen the scope of the RFC from just a flag that throws &lt;br&gt;
an exception, to also changing the message returned by &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For those reasons, I chose the &lt;code&gt;$e-&amp;gt;getMessage() === &lt;/code&gt;preg_last_error_msg()`` &lt;br&gt;
guarantee to keep things consistent, and I chose to push changing the &lt;br&gt;
&lt;code&gt;preg_last_error_msg()&lt;/code&gt; error message into future work.&lt;/p&gt;
&lt;p&gt;To me that's also the better separation of concerns. &lt;br&gt;
Letting the exception report exactly what &lt;code&gt;preg_last_error_msg()&lt;/code&gt; reports &lt;br&gt;
buys two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Consistency: one error, one message, whether you read it from the &lt;br&gt;
exception or from the function.&lt;/li&gt;
&lt;li&gt;The anemic message gets fixed where it actually originates. &lt;br&gt;
Because if &lt;code&gt;$e-&amp;gt;getMessage()&lt;/code&gt; returning &lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt; is a problem, &lt;br&gt;
then &lt;code&gt;preg_last_error_msg()&lt;/code&gt; returning &lt;code&gt;&amp;quot;Internal error&amp;quot;&lt;/code&gt; is the same &lt;br&gt;
problem, and it's worth fixing there rather than papering over it on the &lt;br&gt;
exception alone.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So while I agree all the necessary information should typically be in the &lt;br&gt;
exception, I don't want to get there by breaking the &lt;code&gt;$e-&amp;gt;getMessage() === &lt;/code&gt;preg_last_error_msg()`` guarantee.&lt;/p&gt;
&lt;p&gt;Now what I would suggest instead of breaking that guarantee, is to pull &lt;br&gt;
enriching the anemic &lt;code&gt;preg_last_error_msg()&lt;/code&gt; error message forward into &lt;br&gt;
this RFC instead of leaving it for later, store the real reason in the &lt;br&gt;
error state, and the exception inherits it through the very same channel, &lt;br&gt;
with the guarantee intact.&lt;/p&gt;
&lt;p&gt;I know this is arguably its own debate, but I am more ok with that than &lt;br&gt;
introducing what I think is an inconsistency.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;I disagree with the behavior of not wrapping Exceptions thrown in &lt;br&gt;
user callbacks: I believe the correct choice is to throw a &lt;br&gt;
\PregException with the Exception thrown in the callback as the &lt;br&gt;
&lt;code&gt;-&amp;gt;previous&lt;/code&gt; exception. Not wrapping the user callback exception means &lt;br&gt;
that one needs a &lt;code&gt;catch(Exception)&lt;/code&gt; with a try just around the preg_ &lt;br&gt;
call to reliably handle all errors during regular expression execution, &lt;br&gt;
which nullifies much of the benefit of having a dedicated exception &lt;br&gt;
class in the first place.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It also violates the exception policy in&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables" rel="nofollow" target="_blank"&gt;https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables&lt;/a&gt; &lt;br&gt;
,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;which states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If an extension uses external functionality that may throw an exception &lt;br&gt;
it MUST wrap any exception thrown by that functionality into an appropriate &lt;br&gt;
exception of its own. It MUST set the $previous property to the original &lt;br&gt;
exception when doing so.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;On your second point, if this is a violation of a policy, then there isn't &lt;br&gt;
much to argue. I will just retract the vote and fix that.&lt;/p&gt;
&lt;p&gt;But I think I got confused here, and I would appreciate you explaining how &lt;br&gt;
that violates the policy.&lt;/p&gt;
&lt;p&gt;To make sure we're on the same ground, this is what I understood from your &lt;br&gt;
statement about wrapping exceptions thrown in user callbacks:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;preg_replace_callback(
    $pattern,
    fn () =&amp;gt; throw new CustomException(), // &amp;lt;- You want this wrapped in
PregException?
    $subject,
    flags: PREG_THROW_ON_ERROR,
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If I got it right (and I suspect I did), then how does that violate the &lt;br&gt;
policy? &lt;br&gt;
A user callback isn't external functionality, is it? Because as far as I &lt;br&gt;
understand, external functionality is something the extension itself &lt;br&gt;
depends on as part of its own implementation.&lt;/p&gt;
&lt;p&gt;I am also unaware of any functions that behave like that (wraps exceptions &lt;br&gt;
thrown in user callbacks in its own exception).&lt;/p&gt;
&lt;p&gt;In fact, the opposite is the case for one of the precedents this RFC &lt;br&gt;
follows (&lt;code&gt;json_encode()&lt;/code&gt; with &lt;code&gt;JSON_THROW_ON_ERROR&lt;/code&gt; - although it doesn't &lt;br&gt;
accept a user callback): &lt;a href="https://3v4l.org/CtHYH#v8.5.10" rel="nofollow" target="_blank"&gt;https://3v4l.org/CtHYH#v8.5.10&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thanks, &lt;br&gt;
Osama&lt;/p&gt;
</description><guid>CABE7Eu8vLzM9o4eH6=UGfcpHMNiOdw_e4M8uofnVD02_ELA0NA@mail.gmail.com</guid><pubDate>Fri, 04 Sep 2026 23:53:31 +0000</pubDate></item><item><title>[RFC] [Discussion] array_str_contains() for PHP 8.7</title><link>https://externals.io/message/132432</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks for the reminder! I will add the RFC to the overview page shortly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It appears this hasn't happened yet.&lt;/p&gt;
&lt;p&gt;Best regards &lt;br&gt;
Tim Düsterhus&lt;/p&gt;
</description><guid>5b6e3540-5840-4518-9dfa-9173c8a3d4fa@bastelstu.be</guid><pubDate>Fri, 04 Sep 2026 18:57:18 +0000</pubDate></item><item><title>[RFC] Scan results for array_str_contains</title><link>https://externals.io/message/132431</link><description>&lt;p&gt;‪On Fri, 4 Sept 2026 at 19:03, ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt; wrote:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;در تاریخ جمعه ۴ سپتامبر ۲۰۲۶، ۲۱:۱۳ David CARLIER &lt;a href="mailto:devnexen@gmail.com"&gt;devnexen@gmail.com&lt;/a&gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;‪On Thu, 3 Sept 2026 at 17:21, ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt; wrote:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey internals,&lt;/p&gt;
&lt;p&gt;Just wanted to follow up with the real-world data I promised for array_str_contains().&lt;/p&gt;
&lt;p&gt;I scanned the top 200 Composer packages (around 21,000 PHP files) to see how people currently handle array substring searches. Here is what I found (32 matches total):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;array_filter with str_contains: 8&lt;/li&gt;
&lt;li&gt;array_filter with strpos: 8&lt;/li&gt;
&lt;li&gt;array_filter with stripos: 6&lt;/li&gt;
&lt;li&gt;foreach with str_contains: 6&lt;/li&gt;
&lt;li&gt;array_filter with preg_match: 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these different (and sometimes verbose) approaches can simply be replaced with a single, clean, and fast native call: &lt;br&gt;
array_str_contains($haystack, $needle)&lt;/p&gt;
&lt;p&gt;I’ve updated the RFC with these findings: &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/array_str_contains" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/array_str_contains&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you want to check out the script or raw JSON results, I uploaded them here: &lt;br&gt;
&lt;a href="https://gist.github.com/sepehrphpr/d4d371ba682cc43c4f258de94684cc91" rel="nofollow" target="_blank"&gt;https://gist.github.com/sepehrphpr/d4d371ba682cc43c4f258de94684cc91&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know what you think!&lt;/p&gt;
&lt;p&gt;Cheers, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;quick look in the RFC about this&lt;/p&gt;
&lt;p&gt;&amp;quot;Non-string values in the array are implicitly cast to strings before &lt;br&gt;
the check&amp;quot;.&lt;/p&gt;
&lt;p&gt;Is actually the case implementation wise ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi David,&lt;/p&gt;
&lt;p&gt;Yes, non-string scalar values (like integers or floats) can be cast/treated as strings during the search (similar to how some string-matching functions handle scalar inputs), or skipped if not convertible.&lt;/p&gt;
&lt;p&gt;I will make sure the wording in the RFC clearly explains how non-string values within the array are handled.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;you probably need to update your test to demonstrate it.&lt;/p&gt;
</description><guid>CA+XhMqzMrZjLBAqTcTRL9DwR4Ow1Rk6MUVkc85bZg4mZCdHGbQ@mail.gmail.com</guid><pubDate>Fri, 04 Sep 2026 18:16:51 +0000</pubDate></item><item><title>[RFC] Scan results for array_str_contains</title><link>https://externals.io/message/132430</link><description>&lt;p&gt;در تاریخ جمعه ۴ سپتامبر ۲۰۲۶، ۲۱:۱۳ David CARLIER &lt;a href="mailto:devnexen@gmail.com"&gt;devnexen@gmail.com&lt;/a&gt; نوشت:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;‪On Thu, 3 Sept 2026 at 17:21, ‫سپهر محمودی‬‎ &lt;a href="mailto:sepehrphpr@gmail.com"&gt;sepehrphpr@gmail.com&lt;/a&gt; &lt;br&gt;
wrote:‬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey internals,&lt;/p&gt;
&lt;p&gt;Just wanted to follow up with the real-world data I promised for &lt;br&gt;
array_str_contains().&lt;/p&gt;
&lt;p&gt;I scanned the top 200 Composer packages (around 21,000 PHP files) to see &lt;br&gt;
how people currently handle array substring searches. Here is what I found &lt;br&gt;
(32 matches total):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;array_filter with str_contains: 8&lt;/li&gt;
&lt;li&gt;array_filter with strpos: 8&lt;/li&gt;
&lt;li&gt;array_filter with stripos: 6&lt;/li&gt;
&lt;li&gt;foreach with str_contains: 6&lt;/li&gt;
&lt;li&gt;array_filter with preg_match: 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these different (and sometimes verbose) approaches can simply be &lt;br&gt;
replaced with a single, clean, and fast native call: &lt;br&gt;
array_str_contains($haystack, $needle)&lt;/p&gt;
&lt;p&gt;I’ve updated the RFC with these findings: &lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/array_str_contains" rel="nofollow" target="_blank"&gt;https://wiki.php.net/rfc/array_str_contains&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you want to check out the script or raw JSON results, I uploaded them &lt;br&gt;
here: &lt;br&gt;
&lt;a href="https://gist.github.com/sepehrphpr/d4d371ba682cc43c4f258de94684cc91" rel="nofollow" target="_blank"&gt;https://gist.github.com/sepehrphpr/d4d371ba682cc43c4f258de94684cc91&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know what you think!&lt;/p&gt;
&lt;p&gt;Cheers, &lt;br&gt;
Sepehr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;quick look in the RFC about this&lt;/p&gt;
&lt;p&gt;&amp;quot;Non-string values in the array are implicitly cast to strings before &lt;br&gt;
the check&amp;quot;.&lt;/p&gt;
&lt;p&gt;Is actually the case implementation wise ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Hi David,&lt;/p&gt;
&lt;p&gt;Yes, non-string scalar values (like integers or floats) can be cast/treated &lt;br&gt;
as strings during the search (similar to how some string-matching functions &lt;br&gt;
handle scalar inputs), or skipped if not convertible.&lt;/p&gt;
&lt;p&gt;I will make sure the wording in the RFC clearly explains how non-string &lt;br&gt;
values within the array are handled.&lt;/p&gt;
&lt;p&gt;Best regards, &lt;br&gt;
Sepehr&lt;/p&gt;
</description><guid>CA+Jcf5sX-dNuAWe7RHh9CA2BGidov6nNZ5kn=icUYi5UoYYzVg@mail.gmail.com</guid><pubDate>Fri, 04 Sep 2026 18:02:51 +0000</pubDate></item></channel></rss>
