Pour l'instant, je debugge avec PhpStorm+xdebug. C'est bien, mais insuffisant dans mon cas : mon script est très (très) long avec de gros volumes de données à gérer. Je suis en train de régler des problèmes qui sont, justement, liés au traitement de l'intégralité des données, donc je ne peux plus travailler sur un sous-échantillon. Mais les 10 premières minutes du script ne m'intéressent pas (c'est stabilisé pour l'instant). Par contre j'ai pas mal de choses à voir une fois les traitements initiaux réalisés.
À l'heure actuelle, chaque fois que je veux debugger, je me tape 10 minutes où je poireaute. J'aimerais savoir si quelqu'un connaît une façon de prendre un état du script à un instant t (état des variables, état de l'exécution...) pour le restaurer et reprendre mon debug là où il en était, en prenant en compte les changements réalisés dans le script - quitte à ce que ça se fasse à un breakpoint fixe, pour qu'il s'y retrouve).
Je n'utilise pas de préprocesseur php comme php-fpm, je suis en exécution directe (mais je sais qu'il y a une phase de tokenisation avant exécution, donc si ça se trouve c'est juste impossible sad ).
avatar
L'utilisateur "squal92" est inconnu

Puisque t'es en ligne tongue
avatar
(raté cheeky)

squale92 a été invité sur ce sujet.
(L'edit and continue est dispo en c++ et en java (même à travers un socket) au moins, donc je suppose que c'est aussi possible (au moins théoriquement) en php.)

edit : apparemment, c'est pas spécialement gagné :
http://codelobster.com/forum/viewtopic.php?f=3&t=2543

Bon, au pire, peut-être avec une VM et des snapshots pendant le debug ?
J'y avais pensé aussi mais même avec des snapshots, si tu n'as pas d'edit and continue, comment tu fais ? Tout ce que ça te permettrait, c'est de repartir d'un point d'exécution d'une version du script. Si tu changes le script, c'est mort.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Zerosquare (./5) :
si tu n'as pas d'edit and continue, comment tu fais ?
En découpant en plusieurs fichiers ça devrait fonctionner, non ? Quitte à effacer le truc tokenisé s'il existe ? Ou à faire un chargement dynamique séquentiel des fichiers php ? (aucune idée si c'est possible grin)
Ah oui, je n'avais pas vu que le début était figé. Dans ce cas, ouais, c'est une bonne idée.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Hmm, ça me semble difficilement quand-même parce que le traitement du début et celui qui m'intéresse sont gérés par la même classe cheeky
avatar
Tu ne peux pas découper l'implémentation dans différents fichiers ? (ok ça risque d'être un peu compliqué à gérer pour apache, mais bon triso)
En fait il y a un truc tout con qui devrait fonctionner : tu fais les traitements initiaux que tu veux, puis tu sérialises ta classe.
Ensuite, tu devrais être libre de faire les modifs nécessaires des méthodes, de désérialiser ta classe au lieu de l'instancier de zéro, et de reprendre où tu en étais happy
=> http://php.net/manual/fr/language.oop5.serialization.php (sans doute plus utile pour moi que pour toi, hein, je n'ai pas fait de php depuis deux éternités)
Sauf à sauvegarder manuellement l'état "10 minutes" d'une façon ou d'une autre et à mettre en place un moyen de revenir à cet état, non, je ne vois pas de solution automatisée qui ferait ça pour toi :-(
Si tu as moyen de "sauter" les 10 premières minutes (en ne faisant pas les traitements ? ou en chargeant directement les données résultant de ces 10 minutes depuis une sauvegarde), tu gagneras 10 minutes à chaque debug... Mais à toi de coder ça toi-même...

L'idée de la sérialisation peut être une piste qui te permette de te lancer ; ça ne sera probablement pas 100% magique cela dit, notamment parce que certains types de données ne peuvent pas être sérialisés / désérialisés.
Exemple : les connexions à une base de données (il te faut les re-créer au réveil) ou les fonctions et objets anonymes (PHP ne saurait pas vers qui désérialiser, puisque anonyme -- il te faudra donc les re-créer manuellement)
avatarTutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall
Pas bête du tout, la sérialisation ! C'est principalement des tableaux résultant de requêtes et de traitements, donc oui, ça peut tout à fait le faire ! Merci !
avatar
squale92 (./11) :
notamment parce que certains types de données ne peuvent pas être sérialisés / désérialisés.
Je ne sais pas si c'est faisable en php, mais en java tu peux prendre le contrôle facilement sur la manière dont sera sérialisée ta classe pour gérer quelques attributs manuellement.
En PHP tu as la fonction auto BiteEtCouteau(...) pour faire ca!
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
./13 tu as aussi en PHP, soit en jouant (old-school) avec __sleep() et __wakeup() soit (approche privilégiée aujourd'hui) en implémentant l'interface Serializable -- il faut juste penser à gérer les données non-sérializables (pour les exclures de la sérialisation / les re-créer à la dé-sérialisation)
avatarTutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall
J'aime mon rythme de progression >.<
J'ai travaillé avec __sleep et __wakeup et ça fonctionne super bien, merci ! Après y avoir bossé une journée dessus pour que ça soit aux petits oignons, je peux retourner à mes tests cheeky
avatar