Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание скрипта, при работе с сокетами 
:(
    Опции темы
skifoz
Дата 12.7.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



Есть такой код 

Код

$sock = fsockopen("pop.mail.ru","110",$errInt,$errStr,5) or die($errStr);


echo fgets($sock,1024);

fputs($sock,'USER user\r\n');

echo fgets($sock,1024);

fputs($sock,'PASS pass\r\n');

echo fgets($sock,1024);
 
fputs($sock,'LIST\r\n');


Если я вызываю функцию fgets более чем 1 раз скрипт зависает и ничего не выводит, а если эта функция будет использована всего лишь один раз, он выведет ответ сервера, кто нибуть сталкивался с данной проблемой?? если да то подскажите в чем здесь фишка... 
PM MAIL WWW   Вверх
GiV
Дата 21.7.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: нет
Всего: 9



Здраствуйте,

Может быть поможет.

Код

   $connection = fsockopen($server, 110, $errno, $errstr, 30);

   if(!$connection) {
       print "Connect Failed: $errstr ($errno)";
   } else {
       $output = fgets($connection, 128);
       fputs($connection, "user $user\n");
       $output = fgets($connection, 128);
       fputs($connection, "pass $pass\n");
       $output = fgets($connection, 128);
       fputs($connection, "list $mid\n");
       $output = fgets($connection, 128);       
   }
 
PM MAIL WWW ICQ   Вверх
skifoz
Дата 21.7.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



Если бы конект с ресурсом был утрачен и в $connection находился ноль, то скрипт и без помощи этих условных операторов, остановил бы выполнение и выкинул бы мне ошибку.

С данной проблемой уже разобрался, спасибо за помощь. 
PM MAIL WWW   Вверх
GiV
Дата 21.7.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: нет
Всего: 9



Цитата(skifoz @  21.7.2006,  10:28 Найти цитируемый пост)
С данной проблемой уже разобрался, спасибо за помощь. 

интересно было бы узнать как.
Цитата(skifoz @  21.7.2006,  10:28 Найти цитируемый пост)
с ресурсом был утрачен и в $connection находился ноль

мне кажется, что это не верно =) Если ресурс под соединение был выделен, то даже если через секунду хост упадет - ресурс останется. 
PM MAIL WWW ICQ   Вверх
skifoz
Дата 21.7.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



Цитата

мне кажется, что это не верно =) Если ресурс под соединение был выделен, то даже если через секунду хост упадет - ресурс останется. 

Я имел ввиду, если конект вообще не состоялся. То есть мы захотели, подконектиться, а он не подконектился вообще. А в этом ты прав.


А решилось все примерно так.
Код


$fp = fsockopen($server, 110,$errint,$errstr,10) or die($errstr);

if($fp){
    
    fputs($fp, "USER ".$user."\r\n");
    fputs($fp, "PASS ".$pass."\r\n");
    
    echo '<pre>';
    while(!feof($fp)){
        
        $f = fgets($fp);
        echo $f;
        
        if(preg_match('#^[.]\s$#mix',$f)){
            fclose($fp);
            break;
        }
    }
    echo '</pre>';
}



Вообщем фишка заключалась в том, что при соединении с портом и выполнении каких либо команд, скрипт оставался висет в памяти.

Так же без цикла  while(!feof($fp)) он не выводил весь ответ сервера, а лишь его первый ответ.
После добавления этого цикла, он стал выводит все ответы, но все равно висел, то есть выполнить fclose($fp) после цикла было нельзя.

Пришлось читать доки по POP, там высмотрел что все команды завершаються строкой с единственной точкой. То есть в цикле осталось поставить условие, если точка, то закрыть соединение, именно это я и сделал. 

Код

if(preg_match('#^[.]\s$#mix',$f)){
    fclose($fp);
    break;
}
 
PM MAIL WWW   Вверх
Mal Hack
Дата 22.7.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 5
Всего: 261



А если fread попробовать? Без указания длинны? 
PM ICQ   Вверх
skifoz
Дата 23.7.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



Цитата

А если fread попробовать? Без указания длинны? 

Пробовал не помогло... 
PM MAIL WWW   Вверх
Mal Hack
Дата 23.7.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 5
Всего: 261



Странно. А если через curl попробовать?

Тьфу, блин, кто ж так делает-то.
Только сейчас увидел. mail блокирует доступ из "вне" к почтовым серверам.
Тебе надо использовать http://php.net/imap, это - должно сработать, т.к. сразу будет работать через почтовый протокол, а не через HTTP. 
PM ICQ   Вверх
skifoz
Дата 25.7.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



 Я знаю что такое IMAP , просто хотел подробно разобраться с данным протокол без использования
вспомогательных библиотек (таких как imap).
 
В принципе не плохо разобрался с протоколом...

Кстати почему то imap_connect не как не хочет работать с POP. Конектюсь к этому порту, а он вобще не отвечает,  а с протоколом IMAP нормально работает...

 
PM MAIL WWW   Вверх
Mal Hack
Дата 25.7.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 5
Всего: 261



Я думаю, это специфика mail.ru, хотя...
Вот так пробовал:
Код
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");


Цитата(skifoz @  25.7.2006,  13:48 Найти цитируемый пост)
просто хотел подробно разобраться с данным протокол без использования

Зачем усложнят себе жизнь? Не требуется это тут, не рационально. 
PM ICQ   Вверх
skifoz
Дата 25.7.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



=) 
я жизнь себе не усложнял, это было нужно чисто для саморазвития, чтобы понят как работает протокол и как его можно использовать, мне просто было интересно в этом разобраться самому =)

А насчет примера

Код

$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");


Спасибо, так действительно работает. 

Кстати посредством IMAP функций возможна отправка почты с мыла? Или это делается исключительно только по протоколу SMTP? 
PM MAIL WWW   Вверх
Mal Hack
Дата 25.7.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 5
Всего: 261



Да. 
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.