Alexandre Daubois

@alexdaubois.bsky.social

cto @les-tilleuls.coop / @symfony.com+#frankenphp+#php core team • creator of ember

Sécurité de l'interpréteur PHP, rapports de faille, Ecosystem Security Team... Dans l'interview du jour, @alexdaubois.bsky.social parle de son rôle à la PHP Foundation et pourquoi l'humain reste indispensable face aux rapports de sécurité. Lisez-la, venez l'écouter au Forum PHP 2026. buff.ly/B4qXBU9

ZTS (Zend Thread Safety): the #PHP layer most devs never see. In ZTS mode, every global becomes thread-local. Each thread gets its own executor, compiler, module globals. Full isolation. FPM doesn't need it: direct C globals, fastest path. FrankenPHP does: it runs PHP inside Go threads. 🧵

Bild

Generators vs Fibers in #PHP: both suspend execution, totally different mechanism. Generator: saves ONE execute_data frame. Yield pauses it, ->next() resumes. One level deep. Fiber: saves the ENTIRE call stack. Generator, stackless coroutine. Fiber, stackful coroutine.

Bild

#PHP has inline caches and almost nobody knows 👀 $obj->name: first access does a hash lookup. But the engine stores the result offset in a "cache slot" embedded in the opcode. Next time, same class? Direct read. No lookup. Works for methods, constants, type checks too.

Bild

Traits in #PHP aren't delegated. They're literally memcpy'd into the class. The engine copies each zend_function entry into the consuming class's function_table. "insteadof" picks the winner. "as" creates an alias to the same oparray. After resolution? The trait is gone. Zero runtime cost.

Bild

Let's have a look at this #PHP RFC: Friends, by Daniel Scherzer. A class could grant select OTHER classes access to its private and protected members, without making anything public. Let's see what's actually on the table. 🧵

Bild

#PHP type juggling auth bypass: if ($input == $hash) with a hash starting "0e" + digits: PHP reads it as 0 (scientific notation). MD5("240610708") = "0e462097..." = 0. MD5("QNKCDZO") = "0e830400..." = 0. 0 == 0: auth bypassed. Fix: === or hash_equals(). Never == for security.

Bild

Moins d'une semaine avant notre API Platform Meetup à Lyon ! Au programme : 🎙️Alexandre Noziere avec "Marier API Platform et un ORM non-Doctrine : le bridge Propel de Thelia 3" 🎙️ @alexdaubois.bsky.social avec le sujet "FrankenPHP: Le Serveur PHP Sous Stéroïdes" www.meetup.com/fr-fr/api-pl...

API Platform Meetup @Lyon, jeu. 4 juin 2026, 19:00 | Meetup

Rejoignez-nous pour une soirée exclusive dédiée à **API Platform**. En compagnie de nos experts, venez découvrir les dernières avancées de l'écosystème et la façon dont il

meetup.com

Timing attacks: === stops at first different byte. Attacker measures response time to guess secrets char by char. hash_equals() compares ALL bytes. Constant time. Go: crypto/subtle.ConstantTimeCompare() Comparing secrets with ===? You leak info through time.

Bild

$GLOBALS used to introduce aliasing complexity in the engine. Because it could reference local variables, Zend had to handle indirect entries (IS_INDIRECT) in certain array access paths. #PHP 8.1 restricted $GLOBALS writes, removing that edge case and simplifying hot paths.

Bild

#PHP fibers don't use threads: they use stack swapping. Fiber::suspend() saves the current C stack and VM state, then jumps back to the parent. Fiber::resume() restores everything and continues exactly where you left off. Revolt and Amp are built entirely on this primitive.

Bild

#Golang's scheduler has a magic number: 61. Every 61 goroutine schedules, the runtime checks the global queue instead of the local one. Why 61? It's prime, so it never aligns with any other periodic check. If it were 64, you'd get pathological starvation patterns, and 61 breaks every harmonic.

Bild

One underrated attack vector is your lockfile. 🔐 composer.lock, package-lock.json, go.sum... They all pin versions, but the upstream registry can still ship a malicious 1.2.3 if a maintainer's account gets compromised. 🧵

Bild

A huge thank you to @fabien.potencier.org @nicolasgrekas.bsky.social @alexdaubois.bsky.social @jderusse.bsky.social @javiereguiluz.bsky.social and all the #Symfony Core Team involved in triaging the security reports, fixing the bugs, reviewing the PRs and releasing the patched versions.

Fabien Potencier@fabien.potencier.org · 4mo ago

During the last few weeks, the #Symfony core team has been hard at work fixing a long list of vulnerabilities for both #Symfony and #Twig. Today, we're publishing that work in the biggest security patch releases ever. Bare with us and wish us luck 🍀

#PHP attributes look like decorators... end of the resemblance 😄 Attributes are pure metadata, stored in the class definition. They do *nothing* on their own. A framework must call ReflectionClass::getAttributes() and instantiate them to make anything happen. 🧵

Bild

Named arguments in #PHP 8.0+ are resolved at compile time. Not runtime. The compiler maps argument names to parameter positions in the function signature. The opcodes use positional slots. $name → position #2 → SEND_VAL to slot #2. One exception... 🧵

Bild