За последние 24 часа нас посетили 31985 программистов и 1380 роботов. Сейчас ищут 902 программиста ...

Использование прокси при работе с fsockopen

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

  1. Locker

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

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Привет. Никак не могу понять в чем ошибка. Пишу:
    Код (Text):
    1.  
    2. $proxyarr=explode(":",$proxy);
    3. if ($socket  = @fsockopen($proxyarr[0], $proxyarr[1], $errno, $errstr, 30)) {
    4. $request  = "GET $host$target?$querystring HTTP/1.0\r\n";
    5. $request .= "Host: $proxyarr[0]\r\n";
    6. $request .= "User-Agent: ".$userAgent."\r\n";
    7. $request .= "Accept-Language: en-us, en;q=0.50\r\n";
    8. $request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
    9. $request .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
    10. $request .= "Connection: close\r\n";
    11. $request .= "Cache-Control: max-age=0\r\n\r\n";
    12. stream_set_timeout ( $socket,10);
    13. fwrite( $socket, $request );
    14. $ret = '';
    15. while (!feof($socket)) {
    16.   $ret .= fread($socket,4096);
    17. }
    18. fclose($socket);
    19. $contents = trim(substr($ret,strpos($ret,"\r\n\r\n") + 4));
    не работает. Если пишу
    Код (Text):
    1.  
    2. if ($socket  = @fsockopen($host, "80", $errno, $errstr, 30)) {
    3. $request  = "GET $target?$querystring HTTP/1.0\r\n";
    4. $request .= "Host: $host\r\n";
    5. $request .= "User-Agent: ".$this->userAgent."\r\n";
    6. $request .= "Accept-Language: en-us, en;q=0.50\r\n";
    7. $request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
    8. $request .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
    9. $request .= "Connection: close\r\n";
    10. $request .= "Cache-Control: max-age=0\r\n\r\n";
    11. stream_set_timeout ( $socket,10);
    12. fwrite( $socket, $request );
    13. $ret = '';
    14. while (!feof($socket)) {
    15.   $ret .= fread($socket,4096);
    16. }
    17. fclose($socket);
    18. $contents = trim(substr($ret,strpos($ret,"\r\n\r\n") + 4));
    работает.

    Не могу понять где ошибка.
     
  2. Mavir

    Mavir Guest

    на первый взгляд. $proxyarr[0] - адрес прокси, а не хоста. Поэтому в третьей строке нужно не его ставить, а название хоста.

    P.S. А может лучше делать через cURL?
     
  3. Locker

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

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Ставлю - не помогает. Все равно нулевой запрос возвращает. Я и делаю через cURL. Но это пишется класс универсальный, и чтобы не париться я делаю поддержку сокетов, дабы при установке на другой хост не возникло проблем.
     
  4. Mavir

    Mavir Guest

    PHP:
    1. <?
    2. $host='php.ru';
    3. // ....
    4. $request  = "GET [url=http://$host$target?$querystring]http://$host$target?$querystring[/url] HTTP/1.0\r\n";
    5. $request .= "Host: {$host}\r\n";?>
    6.  
    Работает. Т.е. хост должен быть без http://, а GET с http://
     
  5. Locker

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

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    ЭЭЭ, как бы объяснить. У меня нет там www - это IP адреса, поэтому я не вижу особой разницы
     
  6. Anonymous

    Anonymous Guest

    это не показатель. :shock:
     
  7. Mavir

    Mavir Guest

    Если не видите разницы между названием хоста и URL, то я пасс.

    Все нужное для работы я написал. Если все равно будут трудности, то поставьте на закачку во FlashGet какой-нибудь файл и смотрите, какие заголовки он отправляет.
     
  8. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я бы еще посоветовал внимательно изучить:
    Код (Text):
    1.  
    2. gw(440hz):~$>curl -v php.ru | head -10
    3. * About to connect() to php.ru port 80
    4. *   Trying 82.140.81.242... connected
    5. * Connected to php.ru (82.140.81.242) port 80
    6. > GET / HTTP/1.1
    7. > User-Agent: curl/7.14.0 (i386-portbld-freebsd5.3) libcurl/7.14.0 OpenSSL/0.9.7d zlib/1.2.1
    8. > Host: php.ru
    9. > Accept: */*
    10. >
    11. < HTTP/1.1 200 OK
    12. < Date: Tue, 05 Dec 2006 07:35:33 GMT
    13. < Server: Apache
    14. < X-Powered-By: PHP/7.2
    15. < Set-Cookie: BILLING_LNG=ru; expires=Wed, 05 Dec 2007 07:35:33 GMT; path=/
    16. < X-HTML-Builder: 2000-2006 (c) OOPS Inferno v 8.6 by 440hz
    17. < Expires: Mon, 26 Jul 1997 05:00:00 GMT
    18. < Last-Modified: Tue, 05 Dec 2006 07:35:33 GMT
    19. < Cache-Control: no-cache, must-revalidate
    20. < Pragma: no-cache
    21. < Set-Cookie: OOPS_SID=0errdsay82v4chez; expires=Tue, 12 Dec 2006 07:35:33 GMT; path=/
    22. < Transfer-Encoding: chunked
    23. < Content-Type: text/html; charset=utf-8
    24. < Content-Language: ru
    25. <!--
    26.  
    27.      php.ru team: mz, az, yuri, vb, def, cyxapuk, 440hz
    28.      expi-web.com (c) 2005, 2006, etc.
    29.  
    30. -->
    31.  
    32. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    33. <html>
    p.s. писать проксю не понимая разницы между URL и hostname? гм... куда мир катиться?
     
  9. Locker

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

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Сорри всем :) Я почему то неправильно понял и решил что хост должен быть без WWW, а GET с WWW. Поэтому и написал. Ладно - поробую. Спасибо
     
  10. Locker

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

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Все заработало. Спасибо