php fsockopen

У меня есть простой сценарий 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);
}
?>

Проблема в том, что время ожидания скрипта не удается подключиться. Если я изменить порт с 25 на 80, например, он работает без проблем на любом хосте. Таким образом, проблема, похоже, заключается только в порте 25, независимо от того, какой хост я использую, я перепробовал многие из них, и все они работают для порта 80 и других, но для 25 происходит сбой.
Соединения не блокируются брандмауэром, как если бы я telnet из оболочки, он успешно подключается к любому порту на любом хосте.
Есть идеи, в чем может быть проблема, ведь это действительно странно?

Л.Е .: Если я запускаю тот же php-скрипт из оболочки, php scriptname.php, он работает так, что только когда я запускаю его по http, он не работает. У меня есть Apache с SuPHP, так что проблема где-то здесь

13.12.2008 19:37:16
Какую операционную систему и веб-сервер вы используете?
James Anderson 15.12.2008 07:39:35
5 ОТВЕТОВ
РЕШЕНИЕ

Интересно ... Некоторые брандмауэры могут блокировать соединения определенной программы с определенными портами. Пожалуйста, проверьте это снова, попробуйте полностью остановить брандмауэр. Также попробуйте остановить любую антишпионскую программу.

2
13.12.2008 19:50:05
Это сервер CentOS, антишпионское ПО отсутствует, и я не знаю, что iptables может блокировать только определенную программу.
daniels 13.12.2008 19:52:26
Хорошо, вы правы, iptables не является брандмауэром приложения. Так может быть ваш провайдер блокирует SMTP-соединение со своего веб-сервера (это часто бывает). И это работает с telnet, потому что процесс веб-сервера (с PHP) открывает соединения с другого IP-адреса - это все объясняет.
maxnk 13.12.2008 20:02:01
И как это проверить - вы можете попытаться подключиться к веб-серверу на тестовом хосте из вашего php-скрипта и из telnet и посмотреть журналы, чтобы увидеть IP-адреса источника для обоих соединений. Если я прав, они будут другими.
maxnk 13.12.2008 20:11:46
я использовал telnet из оболочки, из оболочки того же сервера, и это тот же IP-адрес, что и у сервера только один ip.
daniels 13.12.2008 20:12:08
iptables может выполнять межсетевой экран для приложений и пользователей. Попробуйте спросить своего хозяина.
derobert 14.12.2008 04:59:31

Я столкнулся с некоторыми странными проблемами с обработкой сокетов в PHP. Это оказалось проблемой с системой, на которой он работал. Вы пытались запустить свой код на другом компьютере?

1
14.12.2008 08:32:07
да, на другой машине это работает, но мне нужно выяснить, как устранить неполадки на этой машине.
daniels 14.12.2008 10:55:51

Как и упоминавшаяся maxnk, брандмауэр является наиболее вероятной проблемой на сервере или у вашего интернет-провайдера. Порт 25 часто защищен брандмауэром как метод предотвращения спама.

В качестве быстрого теста, поскольку вы упомянули gmail, вы можете вместо этого попробовать подключиться к порту 587. Gmail прослушивает smpt на этом альтернативном порту в дополнение к порту 25, чтобы помочь пользователям обойти чрезмерно ограничивающие брандмауэры.

2
15.12.2008 03:08:01
Да, я могу подключиться с помощью 587, но я пытаюсь выяснить, в чем проблема с использованием порта 25. Почему я могу подключиться с помощью shell, но не используя php? Где может быть проблема? Где искать?
daniels 15.12.2008 05:31:08

Я думаю, что проблема с подключением к вашей машине. Я просто скопировал ваш код в скрипт на моей машине (linux suse) и запустил его с помощью php -f test_script. Я получил следующее сообщение

220 mx.google.com ESMTP j8sm1814228gvb.0

1
15.12.2008 08:35:20
да, проблема с моей машиной наверняка, но я не могу понять, где и что делать, чтобы исправить, это что-то, связанное с конфигурацией php suexec
daniels 15.12.2008 11:53:46

В CentOS может быть включен SELinux, что может привести к странностям при подключении. Вы проверили свои журналы ошибок?

1
4.02.2010 16:45:19