OVH Cloud OVH Cloud

PHP et les threads

11 réponses
Avatar
lkm
Bonsoir,

Je viens d'installer PHPGTK et j'en test les possibilités. J'ai malgrés
tout un petit problème c'est pourquoi je viens demander l'avis d'expert ! :)

Je lance une boucle comme celle-ci pour gérer un socket :

while(! feof($IRCSock))
{
$data = fread($IRCSock, 4096) ;
echo $data ;
}

Mais ça fait tout freezer car du coup mon appli ne reçoit plus aucun
'signal'.

Est-il possible de faire des threads en PHP ?
Dois je m'y prendre autrement pour gérer mon socket ?
Est-il possible de faire des sockets asynchrones, et est ce que ça me
serait utile ?

Merci de m'éclairer !

10 réponses

1 2
Avatar
Guillaume Bouchard
lkm wrote:
Bonsoir,


Bonsoir

Je viens d'installer PHPGTK et j'en test les possibilités. J'ai malgrés
tout un petit problème c'est pourquoi je viens demander l'avis d'expert


Experts en php gtk je ne suis pas.

Je lance une boucle comme celle-ci pour gérer un socket :

while(! feof($IRCSock))
{
$data = fread($IRCSock, 4096) ;
echo $data ;
}
Mais ça fait tout freezer car du coup mon appli ne reçoit plus aucun
'signal'.

Est-il possible de faire des threads en PHP ?


Ta boucle tu la lances où ?
Normalement, j'espere (remarque je ne connais pas phpgtk, mais je
connais bien gtk) tu initialise ton interface, tes fonctions et tu
lances ta boucle gtk::main(). À partir de ce moment là ton gestionaire
gtk (ici php) se doit de gerer les thread, sinon comment veut-il envoyer
les signaux qui vont bien ?

Il te faudra donc initialiser ta boucle de socket suite à un evenement
quelquqonque (genre chargement de la fenetre qui existe 'realize' par
exemple peu correspondre à ce que tu veux)

Dois je m'y prendre autrement pour gérer mon socket ?


Dans une fonction appelée par un evenement, pas dans le code principal
avant le lancement de la boucle main()

Est-il possible de faire des sockets asynchrones, et est ce que ça me
serait utile ?


Aucune idee.

De rien.

PS: Sans vouloir troller d'aucune façon, un autre language ne serait pas
plus adapté pour le gtk que php ?

--
Guillaume.

Avatar
Marc
lkm wrote:

Est-il possible de faire des threads en PHP ?


non ! qui sait peut-etre en version 6.0.

Dois je m'y prendre autrement pour gérer mon socket ?
Est-il possible de faire des sockets asynchrones, et est ce que ça me
serait utile ?


regarde les fonctions socket_select(), stream_select(). C'est
grace a cela que tu pourras realiser une lecture de flux
sans etre bloqué.

* dans les commentaires de ces 2 pages, il y a des choses interessantes
qui peuvent aider.

* c'est une tres bonne idée de developper en php-gtk (contrairement
a ce que disent certains ....).

Avatar
Xavier Garreau
while(! feof($IRCSock))
{
$data = fread($IRCSock, 4096) ;
echo $data ;
}

Mais ça fait tout freezer car du coup mon appli ne reçoit plus aucun
'signal'.


PHP ne gère pas les threads.

Tu peux t'en "pseudo-sortir" en utilisant poll ou select avec un timeout mais
clairement, php n'a pas été pensé pour ça.

a+
--
Xavier Garreau
http://www.xgarreau.org/

Avatar
loufoque

Est-il possible de faire des threads en PHP ?


Non.
Tu peux utiliser un processus à part puis te débrouiller pour
communiquer avec lui ou utiliser gtk::idle_add qui nécessite de ne pas
rendre tes appels trop bloquants.


Est-il possible de faire des sockets asynchrones, et est ce que ça me
serait utile ?


Oui c'est possible. Des sockets non-bloquantes ou select() peuvent
parvenir à cela.

Avatar
lkm
while(! feof($IRCSock))
{
$data = fread($IRCSock, 4096) ;
echo $data ;
}


Ta boucle tu la lances où ?
Normalement, j'espere (remarque je ne connais pas phpgtk, mais je
connais bien gtk) tu initialise ton interface, tes fonctions et tu
lances ta boucle gtk::main(). À partir de ce moment là ton gestionaire
gtk (ici php) se doit de gerer les thread, sinon comment veut-il envoyer
les signaux qui vont bien ?

Il te faudra donc initialiser ta boucle de socket suite à un evenement
quelquqonque (genre chargement de la fenetre qui existe 'realize' par
exemple peu correspondre à ce que tu veux)

Pour l'instant, je créé un socket suite à l'évènement 'clicked' d'un

bouton. Je lance ensuite la boucle que j'ai cité plus plus haut. C'est
là que ça pose problème car je n'en ressort plus et donc GTK ne récupère
jamais la main. (plus aucun signaux ne sont traités etc ...)

Je suis obligé de faire cette boucle pour lire en continus ce qu'y
arrive sur mon socket !

Comment faire pour exécuter cette boucle sans pour autant bloquer les
traitements effectués par GTK ?

PS: Sans vouloir troller d'aucune façon, un autre language ne serait pas
plus adapté pour le gtk que php ?

Heuu ... Certainement ! lol disons que je connais rapidement GTK et que

je voulais tester avec PHP qui est (pour moi) un langage très agréable.


Avatar
lkm
* dans les commentaires de ces 2 pages, il y a des choses interessantes
qui peuvent aider.



Voici (pour ceux que ça intéresse) comment je m'en suis sortis face à ce
problème.

Après une petite recherche sur php.net j'ai trouvé la fonction
stream_set_blocking() qui me permet de rendre 'non bloquant' la fonction
fread() que j'utilise pour lire mon socket. J'obtiens ainsi un socket
asynchrone.

Ensuite j'ai initialisé un Timer Gtk :
gtk::timeout_add(100, 'ma_fonction')

Celui-ci va donc lancer ma_fonction() toutes les 100 millisecondes afin
de lire mon socket à l'aide de fread() qui passera la main dans le cas
où il n'y a rien à lire. Gtk peut ainsi continuer son travail.

* c'est une tres bonne idée de developper en php-gtk (contrairement
a ce que disent certains ....).


Pensez-vous qu'il est envisageable de faire une appli de taille moyenne
en phpgtk ? Je remarque une certaine lenteur au démarrage de l'appli qui
ne fait pour l'instant pas grand chose, je me demande les performances
que l'on peut obtenir en comparaison à d'autres langages scripts
supportants gtk (python par exemple).

Avez-vous déjà entendus parler d'une éventuelle implémentation des
threads dans PHP, ou encore d'une eventuelle orientation vers des GUI ?

Un avis général sur la question m'intérésse :)

Avatar
loufoque

Pensez-vous qu'il est envisageable de faire une appli de taille moyenne
en phpgtk ? Je remarque une certaine lenteur au démarrage de l'appli qui
ne fait pour l'instant pas grand chose, je me demande les performances
que l'on peut obtenir en comparaison à d'autres langages scripts
supportants gtk (python par exemple).


PyGTK est très bien, et bien supérieur à PHP-GTK. D'ailleurs Python est
bien supérieur que PHP en tant que langage de programmmation.
Enfin moi je préfère utiliser wxwidgets pour plus de portabilité.

Tu utilises bien PHP4-GTK1 ? Ils devaient sortir PHP5-GTK2.4, qui aurait
rendu le truc plus utilisable mais j'ai pas l'impression qu'il y ait
encore eu de sortie officielle.


Avez-vous déjà entendus parler d'une éventuelle implémentation des
threads dans PHP, ou encore d'une eventuelle orientation vers des GUI ?


Il faut arrêter de se leurrer, PHP est orienté web. Il n'a jamais été
prévu d'en faire un langage de programmation qui tient la route pour une
utilisation autre, même si cela est possible.
En tous cas, ce n'est pas du tout sur quoi travaillent les développeurs,
et le multithreading n'arrivera sûrement pas avant PHP 7.


Un avis général sur la question m'intérésse :)


Si tu veux un langage interprété pour faire des GUI je te conseille Python.

Avatar
loufoque

Heuu ... Certainement ! lol disons que je connais rapidement GTK et que
je voulais tester avec PHP qui est (pour moi) un langage très agréable.


Oui enfin GTK1 ça pue grave...

Avatar
lkm

Si tu veux un langage interprété pour faire des GUI je te conseille Python.


Après avoir fait quelques tests je me retrouve avec les mêmes
conclusions que toi :
PHP est orienté web, et faire du phpgtk pour une grosse appli c'est du
casi-suicide !

Et il est vrai que pygtk convient bien mieu, pour faire des applications
propres, solides et portables ! Mais là ... On s'écarte de la charte :p

Avatar
frederic girard
loufoque wrote:

Est-il possible de faire des threads en PHP ?



Non.
Tu peux utiliser un processus à part puis te débrouiller pour
communiquer avec lui ou utiliser gtk::idle_add qui nécessite de ne pas
rendre tes appels trop bloquants.


Est-il possible de faire des sockets asynchrones, et est ce que ça me
serait utile ?



Oui c'est possible. Des sockets non-bloquantes ou select() peuvent
parvenir à cela.
Concernant une alternative a GTK, il existe (pas testé encore)

winbinder, l'OS doit evidemment etre du windows (c'est une dll qui
s'inreface nativeement avec les API windows), toutefois, l'alternative
est interessante dans le sens ou ca doit etre moins gourmant et plus
véloce que GTK...A tester si qqun a le courage;) Et nous tenir informer
bien sur:)
http://www.hypervisual.com/winbinder/index.php


1 2