Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как это же сделать на сокетах?
 
 автор: Shorr Kan   (09.02.2005 в 20:50)   письмо автору
 
 

Сейчас я могу открывать удаленный документ при включенном allow_url_fopen. Если ж он выключен - автоматически использую сокеты. Их я не слишком хорошо знаю (а вернее, слишком нехорошо), и потом вопрос - а как можно открывать конкретную страницу? Да еще с get-запросом. В fopen это получается просто, а как быть с сокетом? Ведь там получается fsockopen($site,80) , причем $site должна быть без Http://, без всяких слэшей, и так далее....

   
 
 автор: cheops   (09.02.2005 в 21:50)   письмо автору
 
   для: Shorr Kan   (09.02.2005 в 20:50)
 

Это можно сделать примерно следующим образом (открытие заглавной страницы mail.ru):
<?php 
  
function get_content($hostname$path)
  { 
    
$line "";
    
// Устанавливаем соединение, имя которого
    // передано в параметре $hostname
    
$fp fsockopen($hostname80$errno$errstr30); 
    
// Проверяем успешность установки соединения
    
if (!$fp) echo "$errstr ($errno)<br />\n"
    else
    { 
      
// Формируем HTTP-запрос для передачи
      // его серверу
      
$headers "GET $path HTTP/1.1\r\n"
      
$headers .= "Host: $hostname\r\n"
      
$headers .= "Connection: Close\r\n\r\n"
      
// Отправляем HTTP-запрос серверу
      
fwrite($fp$headers); 
      
// Получаем ответ
      
while (!feof($fp))
      { 
        
$line .= fgets($fp1024); 
      } 
      
fclose($fp); 
    } 
    return 
$line
  }
  
$hostname "www.mail.ru";
  
$path "/"// Здесь путь, например /dir/index.php?id=2
  // Устанавливаем больше время работы
  // скрипта - пока вся страница не будет загружена
  // она не будет отображена
  
set_time_limit(180);
  
// Вызываем функцию
  
echo get_content($hostname$path);
?>

Информация о пути и параметрах идёт уже после установки соединения - нужно отправить серверу GET запрос:
GET /path HTTP/1.1\r\n

где /path - путь к файлу (со всеми параметрами) от корня сервера.

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=600

   
 
 автор: Shorr Kan   (10.02.2005 в 09:26)   письмо автору
 
   для: cheops   (09.02.2005 в 21:50)
 

Я попытался таким образом открыть www.leader.ru/secure/who.html , чтобы посмотреть, какая информация передается. Мне выдало ошибку HTTP 1.0 400 Bad Request . Сейчас я пытаюсь в этом разобраться, но даже не знаю, в верном ли направлении иду... В чем ошибка была?


$site='http://leader.ru';
$site=str_replace("http://", "", $site);$site=str_replace("/", "", $site);$site=trim($site);
$site = fsockopen($site,80);
fputs($site, "GET /secure/who.html HTTP/1.0\n\n");
 while (!feof($site)){
  $html = fgets($site, 1024);
  print $html."<BR>";             
   }
   fclose($site); */

   
 
 автор: cheops   (10.02.2005 в 09:44)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 09:26)
 

Следующий код у меня на локальной машине работает на ура
<?php
echo get_content("leader.ru"$path);
?>

где тестируете на локальной машине или хостинге?

   
 
 автор: Shorr Kan   (10.02.2005 в 10:10)   письмо автору
 
   для: cheops   (10.02.2005 в 09:44)
 

На локальной. Денвер. Но я через локалькную сеть в интернете... Это влияет?

   
 
 автор: Shorr Kan   (10.02.2005 в 10:16)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 10:10)
 

Теперь протестировал на сервере. Ответ такой:

HTTP/1.0 400 Bad Request Cache-Control: no-cache Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:01 GMT Content-Type: text/html Bad formed request or url

Код такой:

$path="/secure/who.html";
$url="leader.ru";
$referer="tttt";
$query = "POST $path HTTP/1.0\n";
$query .= "Referer: ".$referer."\n\n";
$fp = fsockopen($url, 80);
$puts = fputs($fp, $query);
 while (!feof($fp)) {
       echo fgets($fp, 128);
   }
fclose($fp);


Что касается функции get_contents - описание таковой я пока не нашел... Только file_get_contents

   
 
 автор: XPraptor   (10.02.2005 в 10:30)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 10:16)
 

to Shorr Kan :
Ты все время одну и ту же ошибку делаешь: вместо перевода и возврата коретки пишешь двойной первод строки: нужно \r\n а ты пишешь \n\n. Это жестко указано в спецификации HTTP. А конец передачи частей (заголовков, тела, пост данных) отделяется двойным переводом и возвратом коретки \r\n\r\n.

Я уже года три работаю с сокетами, правда в C++ и VB, а когда начал писать на PHP то смотрю -а тут теже лыжи просто все через файловые функции вместо прямой передачи. Короче проще-простого.
Да и еще не вздумай запросы послыать HTTP 1.1 только HTTP 1.0 а так сервера не всегда нормально отвечают при 1.1, потому как там еще дополнительные параметры надо передавать.

   
 
 автор: Shorr Kan   (10.02.2005 в 10:43)   письмо автору
 
   для: XPraptor   (10.02.2005 в 10:30)
 

Спасибо, стало немного понятнее... Но код исправил, а ошибка та же. Код вот:


$path="/secure/who.html";
$url="leader.ru";
$referer="tttt";
$query = "POST $path HTTP/1.0\r\n";
$query .= "Referer: ".$referer."\r\n\r\n";
$fp = fsockopen($url, 80);
$puts = fputs($fp, $query);
 while (!feof($fp)) {
       echo fgets($fp, 128);
   }

fclose($fp);


Проверил и на локальном, и на сервере.

   
 
 автор: Shorr Kan   (10.02.2005 в 10:48)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 10:43)
 

Теперь сделал так:


$url="leader.ru";
$referer="tttt";
$query = "GET / HTTP/1.0\r\n\r\n";
$fp = fsockopen($url, 80);
$puts = fputs($fp, $query);
 while (!feof($fp)) {
       echo fgets($fp, 128);
   }


Не работает.

   
 
 автор: Shorr Kan   (10.02.2005 в 11:07)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 10:48)
 

И еще один момент... если leader.ru поменять на ya.ru - все работает. Так в чем же дело?

   
 
 автор: Shorr Kan   (10.02.2005 в 11:18)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 11:07)
 

Попытался на другой сайт проверки данных:


$path="/r/checking.shtml";
$url="shadowsecurity.net.ua";
$referer="tttt";
$query = "GET ".$path." HTTP/1.0\r\n";
$query .= "Referer: ".$referer."\r\n\r\n";
$fp = fsockopen($url, 80);
$puts = fputs($fp, $query);
 while (!feof($fp)) {
       echo fgets($fp, 128);
   }

fclose($fp);


Выдает какую-то ерунду... Я ведь явно указал http 1.0, а вылезает это:

HTTP/1.1 404 Not Found Date: Thu, 10 Feb 2005 08:15:36 GMT Server: Apache/1.3.29 (Unix) AuthMySQL/2.20 PHP/4.3.4 Last-Modified: Tue, 13 Jan 2004 15:57:34 GMT ETag: "3b58b8-1cc-4004156e" Accept-Ranges: bytes Content-Length: 460 Connection: close Content-Type: text/html BLAZE home. Sorry.

Помогите разобраться, почему на этих сайтах не работает, а на других - все нормально... а то совсем запутался.

   
 
 автор: XPraptor   (10.02.2005 в 11:36)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 11:18)
 

Это скорее всего дело в настройке сайта. Некоторые сайты проверяют реферер и много чего еще, и если не очень реальные данные гнать, то отказ в доступе. Плюс некоторые проверяют определенные заголовки, такие как дата, язык, кодировка и тоже могут сбойнуть при запросе с пустыми параметрами.

   
 
 автор: Shorr Kan   (10.02.2005 в 12:05)   письмо автору
 
   для: XPraptor   (10.02.2005 в 11:36)
 

Хм. А как же мне увидеть действие того, что я посылаю в заголовках? Если на эти сайты хайти просто так - видны все данные. Я хочу эти данные увидеть такими, какие посылаю... Вроде как, эти сайты длля того и созданы...

Я попробовал создать phpinfo.php - и подключаться к нему... так мне в ответ - not found... Мол, phpinfo не найден.


$path="/phpinfo.php";
$url="mysite.com";
$referer="tttt";
$query = "GET ".$path." HTTP/1.0\r\n";
$query .= "Referer: ".$referer."\r\n\r\n";
$fp = fsockopen($url, 80);
$puts = fputs($fp, $query);
 while (!feof($fp)) {
       echo fgets($fp, 128);
   }

fclose($fp);


причем в $path пробовал разное... от /www/phpinfo.php до /mysite/www/phpinfo.php

   
 
 автор: Shorr Kan   (10.02.2005 в 17:24)   письмо автору
 
   для: Shorr Kan   (10.02.2005 в 12:05)
 

Наконец-то... получилось вот что:


$url='shadowsecurity.net.ua';
$query = "GET http://shadowsecurity.net.ua/r/checking.shtml HTTP/1.0\r\n
Host: www.site.ru\r\n
Referer: http://www.site.ru/index.html\r\n
Cookie: income=1\r\n
\r\n";
$fp = fsockopen($url, 80);
fputs($fp, $query);
 while (!feof($fp)) {
       echo fgets($fp, 128);
   }
fclose($fp);


Но возникает вопрос - а почему, собственно, HTTP-REFERER там пустой (на сайте) - я ведь его, вроде, передаю?!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования