2008-12-13 6 views
2

J'ai un simple script PHP sur un serveur qui utilise fsockopen pour se connecter à un serveur.php fsockopen

<?php 
$fp = fsockopen("smtp.gmail.com", 25, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    echo fgets($fp, 1024); 
    fclose($fp); 
} 
?> 

Le problème est que le script expire et ne parvient pas à se connecter. Si je change le port de 25 à 80 par exemple cela fonctionne sans problèmes sur n'importe quel hôte. Donc, le problème semble être seulement le port 25, peu importe quel hôte j'utilise, j'ai essayé beaucoup d'entre eux et tout le travail pour le port 80 et d'autres, mais pour 25 échoue.
Les connexions ne sont pas bloquées par un pare-feu, comme si je me connectais telnet à partir d'un shell sur n'importe quel port de n'importe quel hôte.
Une idée de ce qui pourrait être le problème car c'est vraiment bizarre? LE: Si j'exécute le même script php à partir du shell, php scriptname.php cela fonctionne donc seulement quand je l'exécute par http il échoue. Je qu'Apache avec SuPHP si le problème est ici quelque part

+0

Quel système d'exploitation et quel serveur Web utilisez-vous? –

+0

CentOS, Apache2, cPanel – daniels

Répondre

2

Intéressant ... Certains pare-feu peuvent bloquer les connexions de programmes spécifiques à des ports spécifiques. Veuillez le vérifier à nouveau, essayez d'arrêter complètement le pare-feu. Essayez également d'arrêter tout anti-spyware.

+0

C'est un serveur CentOS, pas d'anti-spyware, et je ne suis pas au courant que iptables ne peut bloquer qu'un certain programme. – daniels

+0

Ok, vous avez raison, iptables pas un pare-feu de l'application. Donc, peut-être votre connexion ISP blocs ISP de leur serveur Web (cela arrive souvent). Et cela fonctionne avec telnet parce que le processus de serveur Web (avec PHP) ouvre des connexions à partir d'une autre adresse IP - c'est tout expliquer. – maxnk

+0

Et comment le vérifier - vous pouvez essayer de vous connecter au serveur web sur l'hôte de test à partir de votre script php et de telnet et jeter un oeil aux journaux pour voir les adresses IP de la source pour les deux connexions. Si j'ai raison, ils seront différents. – maxnk

1

J'ai également rencontré des problèmes étranges avec la gestion des sockets de PHP. Il a fini par être un problème avec le système sur lequel il fonctionnait. Avez-vous essayé d'exécuter votre code sur une autre machine?

+0

Oui, sur une machine différente, cela fonctionne, mais j'ai besoin de comprendre comment dépanner sur cette machine. – daniels

2

Comme maxnk firewalling mentionné est la question la plus probable, que ce soit sur le serveur, ou par votre fournisseur d'accès Internet. Le port 25 est souvent protégé par un pare-feu afin de prévenir les spams. Tout comme un test rapide, puisque vous avez mentionné gmail, vous pouvez essayer de vous connecter au port 587 à la place. Gmail écoute smpt sur ce port alternatif en plus du port 25 pour aider les utilisateurs à contourner les pare-feu trop restrictifs.

+0

Oui, je suis en mesure de se connecter en utilisant 587, mais j'essaie de comprendre quel est le problème en utilisant le port 25. Pourquoi je suis capable de se connecter en utilisant shell, mais ne pas utiliser PHP? Où pourrait être le problème? Où regarder? – daniels

1

Je pense que le problème de connexion est avec votre machine. J'ai juste copié votre code dans un script sur ma machine (linux suse) et l'ai exécuté avec php -f test_script. Je suis arrivé le message suivant

220 mx.google.com ESMTP j8sm1814228gvb.0

+0

oui, le problème est avec ma machine à coup sûr, mais je ne peux pas comprendre où et quoi faire pour réparer, c'est quelque chose lié à php suexec config – daniels

1

CentOS peut avoir SELinux activé qui peut causer des bizarreries de connexion. Avez-vous vérifié vos journaux d'erreurs?