La lecture des données à partir de fsockopen en utilisant fgets/fread se bloque
Voici le code que j'utilise:
if (!($fp = fsockopen('ssl://imap.gmail.com', '993', $errno, $errstr, 15)))
echo "Could not connect to host";
$server_response = fread($fp, 256);
echo $server_response;
fwrite($fp, "C01 CAPABILITY"."\r\n");
while (!feof($fp)) {
echo fgets($fp, 256);
}
- Je obtenir la première réponse:
OK Gimap ready for requests from xx.xx.xx.xx v3if9968808ibd.15
mais ensuite la page. J'ai cherché à travers stream_set_blocking, stream_set_timeout, stream_select, fread, etc. mais ne pouvait pas le faire fonctionner. J'ai besoin de lire toutes les données que le serveur envoie et ensuite poursuivre avec d'autres commandes (je serais de la récupération des e-mails en utilisant imap).
Grâce
Êtes-Vous sûr que la réponse est seulement 256 caractères? Et êtes-Vous sûr que le support est accessible en écriture? Il est possible que Votre script se bloque sur
Oui. Je l'ai testé qu'en remplaçant la boucle while par simple écriture fgets($fp,256) deux fois. Et c'est la réponse que j'obtiens : * CAPACITÉ IMAP4rev1 DÉSÉLECTIONNER INACTIVITÉ de l'espace de NOMS QUOTA ID XLIST ENFANTS X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH C01 OK
fwrite()
en raison de la socket n'est pas accessible en écriture...Oui. Je l'ai testé qu'en remplaçant la boucle while par simple écriture fgets($fp,256) deux fois. Et c'est la réponse que j'obtiens : * CAPACITÉ IMAP4rev1 DÉSÉLECTIONNER INACTIVITÉ de l'espace de NOMS QUOTA ID XLIST ENFANTS X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH C01 OK
OriginalL'auteur victor_golf | 2012-05-04
Vous devez vous connecter pour publier un commentaire.
Votre script est accroché dans la boucle while à la fin. C'est parce que vous avez utilisé
!feof()
comme la condition de la boucle, et le serveur n'est pas de fermer la connexion. Cela signifie que lefeof()
retournera toujoursfalse
et la boucle sera jamais.Ce ne sera pas le problème lors de l'écriture d'une mise en œuvre complète, que vous serez à la recherche pour les codes de réponse et peut sortir de la boucle en conséquence, par exemple:
Rfc sont vos amis 😉 (Ne pas oublier de traiter les réponses d'erreur, ou vous script va s'accrocher pour toujours en attente pour le
C01
réponse, il ne sera jamais)Oui. J'ai été en passant par ces commandes pour un certain temps maintenant. Merci encore.
OriginalL'auteur DaveRandom
Votre script devrait fonctionner. En fait, il fonctionne.
Voir les résultats ci-dessous sur mon pc quand j'ai couru votre code:
Depuis gmail ne pas vous déconnecter. Pas de fin de fichier est atteinte. Et le chargement de la page, tout simplement.
En d'autres termes: Votre script va juste continuer à attendre et attendre jusqu'à ce que gmail ne se déconnecter, ce qui malheureusement arrive après votre chargement de la page a déjà expiré.
Le problème est probablement que vous essayez d'exécuter à partir d'une page web, qui suis-je droit? La page du temps d'attente avant de gmail se déconnecte (donc feof() ne retourne jamais de vrai). Probablement qu'elle perd une partie de la mémoire tampon dans le processus de synchronisation.
Oui. J'ai un .page php qui a du présent code. Quel est le problème?
Je reçois la réponse suivante, mais après 2min de chargement de la page: * OK Gimap prêt pour les demandes de xx.xx.xx.xx vb10if10168308icb.24 * CAPACITÉ IMAP4rev1 DÉSÉLECTIONNER INACTIVITÉ de l'espace de NOMS QUOTA ID XLIST ENFANTS X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH C01 OK c'est tout ce qu'elle a écrit! vb10if10168308icb.24 Comment puis-je composer avec le temps, depuis stream_set_timeout($fp,1) ne semble pas fonctionner..
Votre code fonctionne. Vous devriez regarder pour que l'C01 OK, au lieu d'attendre la fin du fichier
OriginalL'auteur Woutifier