За последние 24 часа нас посетил 20261 программист и 1009 роботов. Сейчас ищут 365 программистов ...

проблема с socket_read :(

Тема в разделе "Прочие вопросы по PHP", создана пользователем Gannibal, 9 мар 2006.

  1. Gannibal

    Gannibal Активный пользователь

    С нами с:
    28 фев 2006
    Сообщения:
    14
    Симпатии:
    0
    Добрый день. Не получается считать данные из потока. Помогите, плз, скажите, что я делаю не так
    $sock = socket_create (AF_INET,SOCK_STREAM,SOL_TCP);
    socket_connect ($sock,'mydomain.com',80);
    $req = 'GET /search?p=test string HTTP/1.1'."\r\n".'Host: mydomain.com'."\r\n\r\n";
    socket_write ($sock,$req);
    $str='';
    while (!feof($sock)):
    $str = $str.socket_read($sock,4096);
    endwhile;

    Ругается он вот так
    Warning: feof(): supplied resource is not a valid stream resource in /home/admin/domains/html/link.php on line 12
     
  2. Belegnar

    Belegnar Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    299
    Симпатии:
    0
    RTFM
    socket_create() Returns a socket resource on success, or FALSE on error

    Сокет не открывается просто и все. Кста, имей в виду еще оттуда же
    A typical network connection is made up of 2 sockets, one performing the role of the client, and another performing the role of the server.
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Gannibal
    а что? curl() или file() или file_get_content() уже не катят? надо на сокетах извращаться?
     
  4. Gannibal

    Gannibal Активный пользователь

    С нами с:
    28 фев 2006
    Сообщения:
    14
    Симпатии:
    0
    Спасибо за оперативность. Отвечу срузу всем.
    Сокет открывается, т.е. если while убрать, то первые 4096 байт приходят, а хочется дальше прочитать. Что касается того почему именно с сокетами надо заморочиться, то ответ достаточно прост. Стандартные fsocket или filegetcontent вряд ли дадут вам возможность выполнить скрипт эмулируя браузер. Дело в том, что удаленная сторона - это search.yahoo.com, которая очень не любит автоматических запросов. А у нее иногда бывают периоды, когда запрашивать надо не раз в день, а раз в минуту :)
    Так все таки, есть идея как считать ответ удаленной стороны целиком используя сокет, отрытый socket_create?
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну так curl - самое то, потому, что придется работать с куками ...
     
  6. Gannibal

    Gannibal Активный пользователь

    С нами с:
    28 фев 2006
    Сообщения:
    14
    Симпатии:
    0
    Согласен, но надо иногда еще и ip менять :)
    Вопрос в силе :)
     
  7. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    feof не работает с указателем созданным socket_create
     
  8. Gannibal

    Gannibal Активный пользователь

    С нами с:
    28 фев 2006
    Сообщения:
    14
    Симпатии:
    0
    Спасибо, но это я и так понял :)
    Вопрос был: как считать до конца информацию из сокета, созданного socket_create?
    Что использовать вместо feof?
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Gannibal
    RTFM: Замечание: socket_read() returns a zero length string ("") when there is no more data to read
     
  10. Belegnar

    Belegnar Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    299
    Симпатии:
    0
    Похоже, что тут все просто
    PHP:
    1.  
    2. while ($out = socket_read($socket, 2048)) {
    3.     echo $out;
    4. }
    5.  
    Это снова из RTFM :)
     
  11. Gannibal

    Gannibal Активный пользователь

    С нами с:
    28 фев 2006
    Сообщения:
    14
    Симпатии:
    0
    Огромное спасибо. Вроде разобрался, все даже заработало :)
    Отдельно спасибо 440hz, он сам знает за что...