Передача данных с помощью fsockopen?

Тема в разделе "PHP Pro", создана пользователем new_forward, 19 дек 2009.

Статус темы:
Закрыта.
  1. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Доброго времени суток!

    Передаю данные вот так:

    Код:
    $data="name=$name&familiya=$familiya&username=$username&email=$email&password=$password";
    $fp = fsockopen("www.mysite.ru", 80, $errno, $errstr, 10);
    $out = "POST /exemple.php HTTP/1.1\n";
    $out .= "Host: www.mysite.ru\n";
    $out .= "Referer: www.mysite.ru/\n";
    $out .= "User-Agent: Opera\n";
    $out .= "Content-Type: application/x-www-form-urlencoded\n";
    $out .= "Content-Length: ".strlen($data)."\n\n";
    $out .= $data."\n\n";
    fputs($fp, $out);
    fclose($fp);
    Такой вариант работает только иногда проскакивает не поюму почему?
    Другими словами иногда данные не доходят...:nezn:
     
  2. alfaexpert

    alfaexpert

    Регистр.:
    23 июл 2008
    Сообщения:
    183
    Симпатии:
    27
    Ошибок скрипт не выдает ?
    Возможно просто отправляемые данные теряются на просторах интернета
    Включи вывод всех ошибок и время выполнения скрипта побольше
    Плюс встречный вопрос а через Курл если сделать не подойдет ?
    у меня есть хороший класс для работы с Курлом ;)
     
  3. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Ошибок не выдает, я так понимаю у меня время скрипта стоит 10 секунд или нет?
     
  4. alfaexpert

    alfaexpert

    Регистр.:
    23 июл 2008
    Сообщения:
    183
    Симпатии:
    27
    Обычно по умолчанию стоит 30 секунд на выполнение
    В коде тот что ты написал не прописаны изменения времени работы скрипта

    PHP:
    <?php
    phpinfo
    ();
    ?>
    phpinfo тебе покажет время выполнения скрипта
    По памяти помню что обзывается этот параметр max_execution_time 30
    Плюс еще есть функция set_time_limit которая может поставить на бесконечное выполнение скрипт

    Через fsocks не совсем удобно послыать POST запросы
    Так что мой совет посмотри в сторону cURL ;)
     
  5. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    А можно проверку какую то поставить типа:

    if(!$fp){
    повторить скрипт!
    }
     
  6. alfaexpert

    alfaexpert

    Регистр.:
    23 июл 2008
    Сообщения:
    183
    Симпатии:
    27
    А не боишся что скрипт будет зациклится до тех пор пока ты его не отключишь ? Такой код в сочетании с set_time_limit(0) может прилично нагрузить сервер, а в некоторых случаях и просто убить апач

    Лучше сделать

    if(empty($fp)){
    exit('Ошиибка соединения, нашальника');
    }
     
  7. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Из всего выше перечисленного получиться такой код правильно?

    Код:
    set_time_limit (0);
    
    $data="name=$name&familiya=$familiya&username=$username&email=$email&password=$password";
    $fp = fsockopen("www.mysite.ru", 80, $errno, $errstr, 10);
    $out = "POST /exemple.php HTTP/1.1\n";
    $out .= "Host: www.mysite.ru\n";
    $out .= "Referer: www.mysite.ru/\n";
    $out .= "User-Agent: Opera\n";
    $out .= "Content-Type: application/x-www-form-urlencoded\n";
    $out .= "Content-Length: ".strlen($data)."\n\n";
    $out .= $data."\n\n";
    fputs($fp, $out);
    fclose($fp);
    
    if(empty($fp)){
    exit('Ошиибка соединения, нашальника');
    } 
    
    :)
     
  8. alfaexpert

    alfaexpert

    Регистр.:
    23 июл 2008
    Сообщения:
    183
    Симпатии:
    27
    Код должен быть таким
    PHP:
    set_time_limit (0);
    $data="name=$name&familiya=$familiya&username=$username&email=$email&password=$password";
    $fp fsockopen("www.mysite.ru"80$errno$errstr10);
    if(empty(
    $fp)){
    exit(
    'Ошиибка соединения, нашальника');
    }
    $out "POST /exemple.php HTTP/1.1\n";
    $out .= "Host: www.mysite.ru\n";
    $out .= "Referer: www.mysite.ru/\n";
    $out .= "User-Agent: Opera\n";
    $out .= "Content-Type: application/x-www-form-urlencoded\n";
    $out .= "Content-Length: ".strlen($data)."\n\n";
    $out .= $data."\n\n";
    fputs($fp$out);
    fclose($fp);
    незачем формировать заголовки для POST запроса если соединение не было открыто
    И вообще вот тебе архив там cUrl класс он все сделает так как надо
    Там даже простой пример авторизации на mail.ru есть
     

    Вложения:

    • bot.zip
      Размер файла:
      13,9 КБ
      Просмотров:
      9
    new_forward нравится это.
  9. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Спасибо тебе alfaexpert подсказал в каком направлении копать!
    Я сделал проще вот так:
    Код:
    //инициализация сеанса
    $ch = curl_init();
    // установка URL и других необходимых параметров
    curl_setopt($ch, CURLOPT_URL, "http://www.mysite.ru/exemple.php");
    curl_setopt($ch, CURLOPT_POST, 1); //будет POST
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '&name='. $name .'&familiya='. $familiya .'&username='. $username .'&email='. $email .'&password='. $password);
    // загрузка страницы и выдача её браузеру
    curl_exec($ch);
    // завершение сеанса и освобождение ресурсов
    curl_close($ch);
    Работает на ура!:yahoo:
     
Статус темы:
Закрыта.