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

Форум PHP

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

 

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

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

тема: http-заголовки
 
 автор: Aesha   (06.08.2007 в 14:39)   письмо автору
 
 

Не могу ответить в эту тему: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=8441&page=

Вопрос такой. Этим скриптом, про которой писал cheops, хорошо собираются заголовки морд, вида www.domen.ru. А как мне получить ответ от определенной страницы, вида www.domen.ru/somepage.html?

Сам скрипт вот:



<?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);  
      
$end $false
      
// Получаем ответ 
      
while (!$end
      {  
        
$line fgets($fp1024);  
        if (
trim($line) == ""$end true;  
        else 
$out[] = $line
      }  
      
fclose($fp);  
    }  
    return 
$out;  
  } 
  
$hostname "www.mail.ru"
  
$path "/"
  
// Устанавливаем большее время работы 
  // скрипта - пока вся страница не будет загружена 
  // она не будет отображена 
  
set_time_limit(180); 
  
// Вызываем функцию 
  
$out get_content($hostname$path); 
  
// Выводим содержимое массива 
  
foreach($out as $http
  { 
    echo 
$http."<br>"
  } 
?> 

   
 
 автор: Trianon   (06.08.2007 в 15:07)   письмо автору
 
   для: Aesha   (06.08.2007 в 14:39)
 

Это не самый удачный скрипт. Я бы посоветовал применить curl.
<?php
function get_url($url)
{
   
$r curl_init();
//   curl_setopt($r, CURLOPT_VERBOSE, 1);
//   curl_setopt($r, CURLOPT_HEADER, 1);
   
curl_setopt($rCURLOPT_NOPROGRESS0);
   
curl_setopt($rCURLOPT_RETURNTRANSFER1);
   
curl_setopt($rCURLOPT_URL$url);

   
$res curl_exec($r);
   return 
$res;
}

$out get_url("http://www.domen.ru/somepage.html");  
?>

   
 
 автор: Aesha   (06.08.2007 в 15:48)   письмо автору
 
   для: Trianon   (06.08.2007 в 15:07)
 

Почему-то дает ошибку "Fatal error: Call to undefined function: curl_init() in s:\home\localhost\www\test1.php on line 4"
Может быть проблемы с версией?

   
 
 автор: ddhvvn   (06.08.2007 в 16:18)   письмо автору
 
   для: Aesha   (06.08.2007 в 15:48)
 

Нужно подключить библиотеку cURL

Для этого раскомментируйте в php.ini строку extension=php_curl.dll и скопируйте след. файлы из папки с php в system32/:
libeay32.dll
ssleay32.dll

   
 
 автор: Aesha   (06.08.2007 в 16:48)   письмо автору
 
   для: ddhvvn   (06.08.2007 в 16:18)
 

Сделала на локальном компе. Вроде функция теперь работает, только не могу с локального компа приконнектиться к сайту. Пишет: "Fatal error: Maximum execution time of 30 seconds exceeded in s:\home\localhost\www\test1.php on line 11".

На сервере cURL не установлен, и, признаться, даже не знаю, как это сделать. Вроде прочитала ветку саппорта, но ничего не поняла. Нельзя ли как-нибудь все-таки модифицировать скрипт, который был приведен в начале?
Заранее спасибо.

   
 
 автор: Proger   (06.08.2007 в 17:15)   письмо автору
 
   для: Aesha   (06.08.2007 в 16:48)
 

Изначальный скрипт - это пример от заядлого пьяницы ;) Точнее не удачный =) Не в обиду cheops. А тот который Вам дали оптимальный и удобный, легко модифицируемый.
P.S. если на сервере нет cURL - это не сервер ИМХО =)

   
 
 автор: Trianon   (07.08.2007 в 01:54)   письмо автору
 
   для: Aesha   (06.08.2007 в 16:48)
 

>Сделала на локальном компе. Вроде функция теперь работает, только не могу с локального компа приконнектиться к сайту. Пишет: "Fatal error: Maximum execution time of 30 seconds exceeded in s:homelocalhostwww est1.php on line 11".

Эксплорер с локального компа в интернет через прокси заходит?



>На сервере cURL не установлен, и, признаться, даже не знаю, как это сделать.

Такое бывает иногда на бесплатных серверах - но на них же fsockopen вообще запрещен как класс.

>Вроде прочитала ветку саппорта, но ничего не поняла.

Процитируйте здесь. А то мы тоже не поймем пока не увидим.


>Нельзя ли как-нибудь все-таки модифицировать скрипт, который был приведен в начале?
>Заранее спасибо.
Можно. Но не нужно. Это всяко будет хуже curl.

   
 
 автор: Aesha   (07.08.2007 в 11:49)   письмо автору
 
   для: Trianon   (07.08.2007 в 01:54)
 

Локальный комп не собирал данные и через fsockopen. Так что тестировать нужно с сервера. Хостер - мастерхост. В нем, для того, чтобы работал cURL, нужно собрать свою конфигурацию php. Инструкция лежит по адресу <a href=http://masterhost.ru/support/doc/php/#compile>http://masterhost.ru/support/doc/php/#compile</a>. По инструкции я практически все сделала, но застряла собственно на этапе конфигурации php.ini. По инструкции написано:


Используя команду ./configure выполняем предварительную конфигурацию PHP для дальнейшей компиляции. Выполнив команду ./configure --help | more вы увидите полный список возможных опций, из которых вам нужно выбрать нужные. Пример конфигурации: 
./configure --prefix=/home/uXXXXX/php \
--with-mysql=/usr/local --enable-ftp \
--enable-dbase --with-gdbm --with-ndbm \
--enable-xslt --with-xslt-sablot \
--with-iconv=/usr/local \
--with-expat-dir=/usr/local --with-gd=/usr/local \
--enable-gd-native-ttf=/usr/local \
--with-jpeg-dir=/usr/local --with-png-dir=/usr/local \
--with-freetype-dir=/usr/local --with-ttf \
--with-zlib-dir=/usr \
--enable-memory-limit --disable-posix \
--enable-force-cgi-redirect --enable-track-vars \
--disable-syntax-hl --enable-inline-optimization \
--without-pear --disable-debug


Для того, чтобы работал cURL нужно написать "–with-curl=/usr/local". Но я не знаю, как это правильно написать, и нужно ли еще что-то писать? Понимаю, что уже вопрос совсем не по теме, но, может быть, вы поможете разобраться?

   
 
 автор: Trianon   (07.08.2007 в 19:15)   письмо автору
 
   для: Aesha   (07.08.2007 в 11:49)
 

>Для того, чтобы работал cURL нужно написать "–with-curl=/usr/local". Но я не знаю, как это правильно написать, и нужно ли еще что-то писать?

Написать нужно всю команду. Команда имеет вид

./configure --with-модуль1=парам1 --with-модуль2=парам2  ... --with-модульN=парамN

то есть состоит из имени команды и нескольких указаний для подключения модулей.

поскольку модулей может быть затребовано довольно много, строку команды разрешается переносить с помощью символа обартного слэша. Отсюда и возникает вид команды, приведенный в описании.

Команду можно попробовать всю набрать руками прямо в ssh-консоли .
Но поскольку наверняка это способ опечататься - лучше поместить ее в командный файл (обычно с расширением .sh)

   
 
 автор: tricket   (06.08.2007 в 18:26)   письмо автору
 
   для: Trianon   (06.08.2007 в 15:07)
 

я после работы с курлом перешёл на fsockopen! лучше имхо! можно всё контролировать!

топикстартеру

function get_content($hostname, $path) 
  {  
    $line = ""; 
    // Устанавливаем соединение, имя которого 
    // передано в параметре $hostname 
    $fp = fsockopen($hostname, 80, $errno, $errstr, 30);  
    // Проверяем успешность установки соединения 
    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);
       $output="";
        while (!feof($fp)){$output .= fgets($fp,128);}
    fclose($fp);
    
    }  
    return $output;  
  }  

уфф писал на коленке но вроде должно работать(выводить заголовки получаемые)!
К Trianon вопрос! у тебя случайно нет либы нормально работающей с сокс5(и 4) и прокси? не могу ничего толкового найти :(

   
 
 автор: Trianon   (07.08.2007 в 01:49)   письмо автору
 
   для: tricket   (06.08.2007 в 18:26)
 

не должно.
И откровенно говоря, я уже устал повторять, почему именно не должно.
Ищите в поиске.

   
 
 автор: smit272   (07.08.2007 в 22:22)   письмо автору
 
   для: Trianon   (06.08.2007 в 15:07)
 

-

   
 
 автор: cheops   (08.08.2007 в 11:27)   письмо автору
 
   для: Aesha   (06.08.2007 в 14:39)
 

>А как мне получить ответ от определенной страницы, вида www.domen.ru/somepage.html?
Вместо
<?php
 $path 
"/";
?>

пишите
<?php
 $path 
"/somepage.html";
?>

   
Rambler's Top100
вверх

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