PHP 8.4.0RC4: Zend Observer does not work for PDO query() method when the new PDO connect() is used
Personne n'a encore pris cette issue.
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.1k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
Description
Problem Description
We have a custom PHP extension that registers as an observer for PDO extension's methods like __construct(), query(), etc., and our extension's handler functions get invoked when any of these PDO methods are being executed. This code is pretty generic from our side and is the same for all PDO methods we observe. But starting from PHP 8.4.0, our observer functions/function handlers are not being invoked when PDO query() method is being executed (when connect() is used) - the execution directly goes to PDO query() method instead of our registered function handlers. There is some crucial, unexplained behavioral difference I want to highlight here considering PHP introduced connect() method to create PDO objects. We adapted our code to also register observer & function handler for the new connect() method and our function handler is being invoked correctly for connect() method but not for query() method that is executed after the connect().
So:
If PDO::__construct() is used by PHP app, our extension's function handlers for __construct() AND query() are both correctly invoked by the Zend engine.
If PDO::connect() is used by PHP app, only connect() function handler in our extension is invoked but not the function handler for query().
This is inconsistent behaviour from the Zend engine.
Just to clarify how we use Zend observer API:
During MINIT:
- We use
zend_observer_fcall_register()to register begin and end function handlers. - We use the
CG()macro to get class entry object for "PDO" class and overwrite thezend_function->internal_function_handlerwith our own function for__construct(), connect(), query()
We verified some aspects during runtime using a debugger :
- Looking into the CG hashtable after we register our functions - we can confirm that
zend_function->internal_function_handlerfor both connect() and query() hold the pointers to our extension's overwritten function handler, not the original PDO methods. 2. InsideZEND_DO_FCALL_SPEC_OBSERVER_HANDLER()inzend_vm_execute.hfrom where these two functions/PDO methods are eventually invoked, we can see that thefbc->internal_function.handlerfor duringquery()execution holds some unresolved address - that is neither pointing tozim_PDO_query()or our extension's overwritten function handler.
Strange thing is, for the PDO connect() execution, fbc->internal_function.handler does point to our extension's function handler. As I said, registering observer and overwriting function handlers for these functions in the CG hashtable is generic and has been working on PHP 8.3.
PHP Version
PHP 8.4.0RC4
Operating System
No response
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez la différence entre PDO::__construct() et PDO::connect() suivi de query() en utilisant l’enregistrement de l’observer Zend et les remplacements du handler décrits dans l’issue. Commencez à ZEND_DO_FCALL_SPEC_OBSERVER_HANDLER() dans zend_vm_execute.h et inspectez les entrées PDO dans la CG hashtable ; le travail est terminé lorsque query() appelle systématiquement le handler de l’observer enregistré après connect().
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, php
- Domaine
- backend, compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100