PHP скрипт. Simple URL checker — выполнение проверок (cURL)

Владимир | | PHP, Web разработка.

Simple URL checker - cURL
Приветствую всех!

Как я и обещал, мы продолжаем разработку приложения для проверки URL и сегодня займемся непосредственно выполнением проверок.

Чтобы немного облегчить себе жизнь, проверки мы будем выполнять с помощью библиотеки cURL.

Эта библиотека предоставляет очень широкие возможности для работы с web ресурсами. Поддерживаются редиректы, отправка данных, установка заголовков, автоматически собирается статистика и многое другое. Естественно, все возможности гибко настраиваются. В общем, при желании можно полностью имитировать работу человека в интернете.

Теперь нам нужно подключить эту библиотеку к PHP. Для этого в файле php.ini нужно убрать «;» в начале строки extension=php_curl.dll. После этого в сведениях, которые возвращает функция phpinfo() появится раздел curl и в нем параметр — cURL support: enabled.

Библиотека подключена и можно начинать ее использовать.

Для начала приведу небольшой пример, иллюстрирующий основные принципы работы с библиотекой на PHP.

$ch = curl_init();    // инициализация
curl_setopt($ch, CURLOPT_URL, ‘http://www.google.com’); // устанавливаем URL
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// разрешаем редирект
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // указывает, что функция curl_exec должна вернуть полученный ответ, а не отправить его сразу браузеру
$result = curl_exec($ch); // запуск
curl_close($ch);
echo $result;

Здесь все достаточно просто. Функция curl_init инициализирует библиотеку и создает объект для работы с ней ($ch). После этого с помощью функции curl_setopt можно настроить библиотеку. В первом параметре этой функции передаем созданный объект, во втором – указываем имя параметра, который нужно настроить, а в третьем – значение параметра.

После этого вызываем функцию curl_exec, которая и выполняет всю работу, т.е. отправляет запрос и получает данные.

Возвращаемся к нашему приложению.

Как я и говорил в прошлый раз, всю работу по проверке URL выполняет метод ping. Рассмотрим его подробнее.

function ping($urlId = 0) {
	$this->load->model('urlmodel');
	$this->load->model('resultmodel');
	$urls = array();
	if ($urlId == 0) {
		//получаем полный список URL из БД
		$urls = $this->urlmodel->getAllUrls();
	}
	else {
		//ищем выбранный URL
		$urls = $this->urlmodel->getUrlById($urlId);
	}
	if ($urls !== FALSE) {
		//создаем обработчик для параллельной работы с URL'ами
		$mh = curl_multi_init();
		//создаем обработчики для каждого отдельного URL и добавляем их в $mh
		$handles = array();
		for ($i = 0; $i < count($urls); $i++) {
			$handles[$i] = curl_init();
			curl_setopt($handles[$i], CURLOPT_URL, $urls[$i]['URL']);
			curl_setopt($handles[$i], CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($handles[$i], CURLOPT_FOLLOWLOCATION, 1);
			curl_setopt($handles[$i], CURLOPT_TIMEOUT, 10);
			curl_setopt($handles[$i], CURLOPT_HEADER, 0);
			//если используется прокси, нужно указать его порт и ip
			//curl_setopt($handles[$i], CURLOPT_PROXYPORT, "8080");
			//curl_setopt($handles[$i], CURLOPT_PROXY, "192.168.0.1");

			curl_multi_add_handle($mh, $handles[$i]);
		}
		//запускаем обработку
		$running = null;
		do {
			curl_multi_exec($mh, $running);
		} while ($running > 0);
		//получаем данные и сохраняем их в БД
		for ($i = 0; $i < count($urls); $i++) {
			$urlInfo = curl_getinfo($handles[$i]);
			$resData['urlId'] = $urls[$i]['id'];
			if ($urlInfo['speed_download'] != 0) {
				$resData['result'] = 1;
			}
			else {
				$resData['result'] = 0;
			}
			$resData['responsetime'] = $urlInfo['total_time'];
			$resData['responselength'] = $urlInfo['size_download'];
			$resData['responsespeed'] = $urlInfo['speed_download'];
			$this->resultmodel->saveResults($resData);
		}
		//закрываем обработчики
		for ($i = 0; $i < count($handles); $i++) {
			curl_multi_remove_handle($mh, $handles[$i]);
		}
		if ($urlId == 0) {
			$this->index();
		}
		else {
			$this->urldetails($urlId);
		}
	}
}

Как видите, метод довольно объемный и достаточно сильно отличается от первого примера. Но обо всем по порядку.

После загрузки моделей, мы проверяем значение параметра $urlId. Если он равен нулю, то выполняем проверку всех URL в базе данных, если нет – проверяем только заданный URL.

Теперь нам нужно проверить найденные в базе данных URL. Если этот URL один, то все довольно просто, можно ограничиться кодом из первого примера, но у нас может быть несколько десятков URL. Запустить проверки в цикле, конечно, возможно, но это скрипт при этом может выполняться довольно долго. А в большинстве случаев время работы скриптов ограничено (параметр max_execution_time).

Поэтому здесь мы используем функцию curl_multi_init() (строка 15) для параллельной обработки нескольких запросов. По-сути, объект, который создает curl_multi_init, является контейнером для обычных обработчиков.

После этого в цикле (строки 18-30) с помощью curl_init мы создаем массив объектов для работы с каждым URL, настраиваем его и с помощью функции curl_multi_add_handle добавляем в контейнер (строка 29).

Обратите внимание на параметр CURLOPT_TIMEOUT (строка 23). Я установил его равным 10 секундам. Это время в течении которого cURL будет ждать ответ сервера. Значение я взял «с потолка», поэтому если оно вас не устраивает, можете спокойно его изменить.

Сейчас все готово для начала проверок. Запуск выполняется функцией curl_multi_exec, которая принимает два параметра. Первый – созданный объект с обработчиками, второй – переменная, указывающая завершилась обработка или нет.

Функция curl_multi_exec вызывается внутри цикла, выход из которого выполняется, когда переменная $running будет равна нулю, т.е. завершится обработка всех URL.

После этого нам остается только получить данные о проверках с помощью функции curl_getinfo (строка 38) и сформировать массив с результатами ($resData).

На завершающем этапе мы сохраняем данные в БД (строка 49), с помощью функции curl_multi_remove_handle закрываем обработчики (строка 53) и показываем посетителю страницу, с которой был вызван метод (строки 55-60).

Все. Метод для выполнения проверок готов. В следующий раз мы рассмотрим создание представлений, т.е. страниц сайта.

До встречи!

P.S. Ссылки на все статьи и примеры цикла я публикую здесь.

  • Henly

    Вы не учли что если включить прокси то $urlInfo[’speed_download’] будет не равен нулю даже если сайт не доступен!

  • Henly

    Вы не учли что если включить прокси то $urlInfo[’speed_download’] будет не равен нулю даже если сайт не доступен!

  • Henly

    попробовал подключиться через протокол https результат:
    $urlInfo[‘total_time’]=какая то цифра
    $urlInfo[’size_download’]= 0
    Сайт не доступен..
    хотя на самом деле сайт прекрасно работает.
    пробовал увеличить timeout непомогло. А курл хоть умеет с https работать?

  • Henly

    попробовал подключиться через протокол https результат:
    $urlInfo[‘total_time’]=какая то цифра
    $urlInfo[’size_download’]= 0
    Сайт не доступен..
    хотя на самом деле сайт прекрасно работает.
    пробовал увеличить timeout непомогло. А курл хоть умеет с https работать?

  • >> если включить прокси то $urlInfo[’speed_download’] будет не равен нулю

    Дело в том, что я тестировал подключение через прокси. И получил такой результат:
    Время отклика — 9.313
    Размер — 0
    Скорость — 0
    Использовал — CCProxy.
    Может быть для других прокси результат изменится?
    Если да, напишите, пожалуйста, с каким сервером вы проверяли.

    >> https
    Да, cURL его поддерживает. И проблемы с ним, насколько я знаю, довольно распространенные.
    Попробуйте использовать опцию

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    отключает поддержку сертификатов.

    • Stansfield

      Владимир, спасибо большое! Сколько мучался я с этим редиректом, и кто б подумал, что нужно просто отключить сертификаты. Спасибо, чувак

  • >> если включить прокси то $urlInfo[’speed_download’] будет не равен нулю

    Дело в том, что я тестировал подключение через прокси. И получил такой результат:
    Время отклика — 9.313
    Размер — 0
    Скорость — 0
    Использовал — CCProxy.
    Может быть для других прокси результат изменится?
    Если да, напишите, пожалуйста, с каким сервером вы проверяли.

    >> https
    Да, cURL его поддерживает. И проблемы с ним, насколько я знаю, довольно распространенные.
    Попробуйте использовать опцию

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    отключает поддержку сертификатов.

    • Stansfield

      Владимир, спасибо большое! Сколько мучался я с этим редиректом, и кто б подумал, что нужно просто отключить сертификаты. Спасибо, чувак

  • Руслан

    Не работает:
    $ch = curl_init(); // инициализация
    curl_setopt($ch, CURLOPT_URL, ‘http://www.google.com’); // устанавливаем URL
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// разрешаем редирект
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // указывает, что функция curl_exec должна вернуть полученный ответ, а не отправить его сразу браузеру
    $result = curl_exec($ch); // запуск
    curl_close($ch);
    echo $result;

    $result = curl_exec($ch); не возвращяет ничего!!!
    Сайт на holm.ru
    Почему?

    • Попробуйте запустить само приложение.
      Убедитесь, что подключен сURL (с помощью phpinfo()).
      Если вы скопировали код с этой страницы, убедитесь, что исправили кавычки во второй строке (их автоматически меняет wordpress).
      Попробуйте использовать параметр
      curl_setopt($ch, CURLOPT_VERBOSE, 1);

  • Руслан

    Не работает:
    $ch = curl_init(); // инициализация
    curl_setopt($ch, CURLOPT_URL, ‘http://www.google.com’); // устанавливаем URL
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// разрешаем редирект
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // указывает, что функция curl_exec должна вернуть полученный ответ, а не отправить его сразу браузеру
    $result = curl_exec($ch); // запуск
    curl_close($ch);
    echo $result;

    $result = curl_exec($ch); не возвращяет ничего!!!
    Сайт на holm.ru
    Почему?

    • Попробуйте запустить само приложение.
      Убедитесь, что подключен сURL (с помощью phpinfo()).
      Если вы скопировали код с этой страницы, убедитесь, что исправили кавычки во второй строке (их автоматически меняет wordpress).
      Попробуйте использовать параметр
      curl_setopt($ch, CURLOPT_VERBOSE, 1);

  • Правильно ли я понимаю, что будет открыто столько же коннектов к сайтам, сколько их в базе?
    Не разумнее ли их скармливать мультикурлу небольшими пачками?

    • Да, поняли вы правильно.
      По частям передавать можно, но тут нужно учитывать два фактора:
      1) нагрузка на сервер;
      2) максимально допустимое время выполнения скрипта.
      Если вы попытаетесь за последовательно запускать curl, то превысить время очень легко. Особенно если тормозит один из ресурсов, которые вы проверяете.
      Если нужно снизить нагрузку лучше использовать другой вариант. Создать список URL, сохранить его в базе или файле, запускать скрипт по cron и проверять только часть списка. Естественно, нужно где-нибудь сохранить номер последнего проверенного URL.

      • У меня VDS, поэтому максимальное время выполнения я могу менять.

        • Тогда остается только поэкспериментировать и выбрать наиболее подходящий вариант 😉

  • Правильно ли я понимаю, что будет открыто столько же коннектов к сайтам, сколько их в базе?
    Не разумнее ли их скармливать мультикурлу небольшими пачками?

    • Да, поняли вы правильно.
      По частям передавать можно, но тут нужно учитывать два фактора:
      1) нагрузка на сервер;
      2) максимально допустимое время выполнения скрипта.
      Если вы попытаетесь за последовательно запускать curl, то превысить время очень легко. Особенно если тормозит один из ресурсов, которые вы проверяете.
      Если нужно снизить нагрузку лучше использовать другой вариант. Создать список URL, сохранить его в базе или файле, запускать скрипт по cron и проверять только часть списка. Естественно, нужно где-нибудь сохранить номер последнего проверенного URL.

      • У меня VDS, поэтому максимальное время выполнения я могу менять.

        • Тогда остается только поэкспериментировать и выбрать наиболее подходящий вариант 😉

  • Виктор

    Даже ваш самый первый «простейший» пример ни фига не работает, вы хоть сами проверяли его?

    Не то что редиректы, а даже страница не загружается

  • Виктор

    Даже ваш самый первый «простейший» пример ни фига не работает, вы хоть сами проверяли его?

    Не то что редиректы, а даже страница не загружается

  • Виктор

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

    параметр
    curl_setopt($ch, CURLOPT_VERBOSE, 1); я использовал, не помогает — выдаёт 302, и переправляет на голландский сайт гугла — почему на голландский — без понятия.

    можете дать какой нибудь работающий пример — как перейти на страницу с помощью cURL и свободно гулять по ссылкам на этой полученной странице

    пока я нашёл только один такой пример — но никак не могу понять — почему он работает, а больше ничего не работает

  • Виктор

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

    параметр
    curl_setopt($ch, CURLOPT_VERBOSE, 1); я использовал, не помогает — выдаёт 302, и переправляет на голландский сайт гугла — почему на голландский — без понятия.

    можете дать какой нибудь работающий пример — как перейти на страницу с помощью cURL и свободно гулять по ссылкам на этой полученной странице

    пока я нашёл только один такой пример — но никак не могу понять — почему он работает, а больше ничего не работает

  • Конечно, проверял 🙂
    Даже не просто проверял, а сначала написал, а потом протестировал 🙂

    Вы копировали код с этой страницы или скачали архив с приложением? (в архиве находится инструкция по установке и настройке приложения)

    При копировании со страницы не правильно вставляются кавычки (любой редактор с подсветкой синтаксиса расскажет вам об этом).

    HTTP 302 — это и есть редирект
    Будет ли cURL переходить по нему указываете вы:
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    как перейти на страницу с помощью cURL и свободно гулять по ссылкам на этой полученной странице

    Готового примера у меня нет, но вам нужно добавить только один шаг — поиск ссылок на странице (проще всего сделать с помощью регулярных выражений).
    В любом случае, пока страница не получена, заниматься этим рано.

    почему на голландский

    Эти редиректы зависят от настроек браузера (т.е. curl'а) и запроса (шпаргалка)

    а больше ничего не работает

    Боюсь, тут я ничем помочь не смогу. Найти причину можно только экспериментами. Попробуйте все-таки запустить «простейший» пример и получить какую-нибудь страницу без редиректа (например, http://www.php.net/).

    Будут результаты — пишите 😉

  • Конечно, проверял 🙂
    Даже не просто проверял, а сначала написал, а потом протестировал 🙂

    Вы копировали код с этой страницы или скачали архив с приложением? (в архиве находится инструкция по установке и настройке приложения)

    При копировании со страницы не правильно вставляются кавычки (любой редактор с подсветкой синтаксиса расскажет вам об этом).

    HTTP 302 — это и есть редирект
    Будет ли cURL переходить по нему указываете вы:
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    как перейти на страницу с помощью cURL и свободно гулять по ссылкам на этой полученной странице

    Готового примера у меня нет, но вам нужно добавить только один шаг — поиск ссылок на странице (проще всего сделать с помощью регулярных выражений).
    В любом случае, пока страница не получена, заниматься этим рано.

    почему на голландский

    Эти редиректы зависят от настроек браузера (т.е. curl'а) и запроса (шпаргалка)

    а больше ничего не работает

    Боюсь, тут я ничем помочь не смогу. Найти причину можно только экспериментами. Попробуйте все-таки запустить «простейший» пример и получить какую-нибудь страницу без редиректа (например, http://www.php.net/).

    Будут результаты — пишите 😉

  • Виктор

    спасибо большое за такой подробный ответ — спасибо, что тратите на меня время 🙂

    у меня кое-что получается, что характерно — некоторые сайты (точнее всего два таких сайта пока нашёл) загружаются отлично с помощью cURL и спокойно гуляю по ссылкам, например сайт yahoo.com (точно так же работает сайт altavista.com) — а остальные сайты просто загружаются, но по ссылкам гулять не получается. Вот мой код — до боли простой код

    Подскажите пожалуйста как организовать поиск ссылок на странице с помощью регулярных выражений — вообще с таким никогда не сталкивался. просто я с помощью cURL организовал передачу данных методом POST — но мне нужно после передачи данных перейти на страницу и нажать на кнопочку, а нажать не могу на кнопочку на этом сайте (нажимаю на кнопочки пока только на двух сайтах Yahoo! и Altavista — вот хохма, ей-богу). Может дайте ссылку на документацию (можно на английском) — а я попробую сам разобраться, чтобы не отнимать у вас время.

    Спасибо за ответ — обязательно дам на ваш блог ссылку в следующем посту в моём блоге — у меня пока маленький блог (про друпал и уберкарт в основном), в среднем 70 посетителей в день — но всё таки — хоть что то — пусть мои читатели знают про ваш блог — очень хороший блог 🙂

  • Виктор

    спасибо большое за такой подробный ответ — спасибо, что тратите на меня время 🙂

    у меня кое-что получается, что характерно — некоторые сайты (точнее всего два таких сайта пока нашёл) загружаются отлично с помощью cURL и спокойно гуляю по ссылкам, например сайт yahoo.com (точно так же работает сайт altavista.com) — а остальные сайты просто загружаются, но по ссылкам гулять не получается. Вот мой код — до боли простой код

    Подскажите пожалуйста как организовать поиск ссылок на странице с помощью регулярных выражений — вообще с таким никогда не сталкивался. просто я с помощью cURL организовал передачу данных методом POST — но мне нужно после передачи данных перейти на страницу и нажать на кнопочку, а нажать не могу на кнопочку на этом сайте (нажимаю на кнопочки пока только на двух сайтах Yahoo! и Altavista — вот хохма, ей-богу). Может дайте ссылку на документацию (можно на английском) — а я попробую сам разобраться, чтобы не отнимать у вас время.

    Спасибо за ответ — обязательно дам на ваш блог ссылку в следующем посту в моём блоге — у меня пока маленький блог (про друпал и уберкарт в основном), в среднем 70 посетителей в день — но всё таки — хоть что то — пусть мои читатели знают про ваш блог — очень хороший блог 🙂

  • Виктор

    $ch=curl_init(«http://www.yahoo.com»);
    $result = curl_exec($ch);
    curl_close($ch);
    echo $result;

  • Виктор

    $ch=curl_init(«http://www.yahoo.com»);
    $result = curl_exec($ch);
    curl_close($ch);
    echo $result;

  • Виктор

    код не прикрепился в первый раз, вот — прикрепил код моей с позволения сказать программы 🙂

  • Виктор

    код не прикрепился в первый раз, вот — прикрепил код моей с позволения сказать программы 🙂

  • Виктор

    в общем я понял в принципе, почему на других сайтах полученных через cURL, все ссылки дохлые — просто на всех сайтах ссылки прописаны от корня как правило, и потому если вы получаете страничку через cURL, то браузер в качестве корня определяет тот сайт, с которого осуществляется сеанс cURL, и потому все ссылки дохлые. Рекламные объявления например на любом сайте щёлкаются нормально, потому что ссылки на рекламные объявления ведь прописываются не от корня сайта.

    вот как сделать так, чтобы корнем сайта определять тот сайт, с которого осуществляется сеанс cURL — если такое осуществить — было бы вообще круто — если такое вообще возможно сделать 🙂

  • Виктор

    в общем я понял в принципе, почему на других сайтах полученных через cURL, все ссылки дохлые — просто на всех сайтах ссылки прописаны от корня как правило, и потому если вы получаете страничку через cURL, то браузер в качестве корня определяет тот сайт, с которого осуществляется сеанс cURL, и потому все ссылки дохлые. Рекламные объявления например на любом сайте щёлкаются нормально, потому что ссылки на рекламные объявления ведь прописываются не от корня сайта.

    вот как сделать так, чтобы корнем сайта определять тот сайт, с которого осуществляется сеанс cURL — если такое осуществить — было бы вообще круто — если такое вообще возможно сделать 🙂

  • Попробуйте так:

    $ch=curl_init(«http://narod.yandex.ru/»);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //это важно!
    $result = curl_exec($ch);
    curl_close($ch);
    //вся страница сейчас находится в $result
    //заменяем ссылки вида /page.html на http: //site.com/page.html
    //шаблон для поиска внутренних ссылок (начинаются с «/»)
    $pattern = «/href=»(/.*)»/i»;
    //шаблон для замены
    $replacement = «href=»http://narod.yandex.ru${1}»»;
    //выполняем замену
    echo preg_replace($pattern, $replacement, $result);
    //echo $result;

    В результате каждая ссылка вида /page.html будет изменена на http: //sitename.com/page.html

    Ссылки на документацию по регулярным выражениям я давать не буду, ее слишком много. Разве что на официальную. К тому же лучший способ научиться их составлять — это практика. Но вот ссылку на программку для их тестирования я дам — RegExr.

    Код написан только в первом приближении, нужно тестировать, но надеюсь идея ясна.

    P.S. я не трачу время, а общаюсь на интересную тему 🙂
    Ссылки, конечно, лишними не бывают, но это не обязательно. Кстати, адрес своего блога вы не оставили.

  • Попробуйте так:

    $ch=curl_init(«http://narod.yandex.ru/»);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //это важно!
    $result = curl_exec($ch);
    curl_close($ch);
    //вся страница сейчас находится в $result
    //заменяем ссылки вида /page.html на http: //site.com/page.html
    //шаблон для поиска внутренних ссылок (начинаются с «/»)
    $pattern = «/href=\»(\/.*)\»/i»;
    //шаблон для замены
    $replacement = «href=\»http://narod.yandex.ru\${1}\»»;
    //выполняем замену
    echo preg_replace($pattern, $replacement, $result);
    //echo $result;

    В результате каждая ссылка вида /page.html будет изменена на http: //sitename.com/page.html

    Ссылки на документацию по регулярным выражениям я давать не буду, ее слишком много. Разве что на официальную. К тому же лучший способ научиться их составлять — это практика. Но вот ссылку на программку для их тестирования я дам — RegExr.

    Код написан только в первом приближении, нужно тестировать, но надеюсь идея ясна.

    P.S. я не трачу время, а общаюсь на интересную тему 🙂
    Ссылки, конечно, лишними не бывают, но это не обязательно. Кстати, адрес своего блога вы не оставили.

  • Виктор

    спасибо большое :))) — буду пробовать :))

    мой блог http://ezh-leon.ru и сейчас я там начал серию статей на тему cURL для чайников — буду выкладывать там историю о том, как я (то есть тот самый чайник) разбирался в cURL, поэтому ссылка на вас будет очень кстати 🙂

    но вообще я счас буду писать в блог, чтобы разложить всё по полочкам в первую очередь для себя — авось ещё кому поможет 🙂

  • Виктор

    спасибо большое :))) — буду пробовать :))

    мой блог http://ezh-leon.ru и сейчас я там начал серию статей на тему cURL для чайников — буду выкладывать там историю о том, как я (то есть тот самый чайник) разбирался в cURL, поэтому ссылка на вас будет очень кстати 🙂

    но вообще я счас буду писать в блог, чтобы разложить всё по полочкам в первую очередь для себя — авось ещё кому поможет 🙂

  • Виктор

    спасибо, ваша программа очень здорово работает — но кнопка, которая мне нужна — всё равно не нажимается, все остальные ссылки на этой странице нажимаются — этого я добился, но только не эта кнопка — может потому, что при нажатии этой кнопки данные передаются методом POST (короче нажимаю эту кнопку — и при её нажатии браузер почему то всё равно принимает за корень тот сайт, с которого делаю запрос).

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

    лана, буду смотреть дальше, может сам разберусь, как там дополнительно эмулировать

  • Виктор

    спасибо, ваша программа очень здорово работает — но кнопка, которая мне нужна — всё равно не нажимается, все остальные ссылки на этой странице нажимаются — этого я добился, но только не эта кнопка — может потому, что при нажатии этой кнопки данные передаются методом POST (короче нажимаю эту кнопку — и при её нажатии браузер почему то всё равно принимает за корень тот сайт, с которого делаю запрос).

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

    лана, буду смотреть дальше, может сам разберусь, как там дополнительно эмулировать

  • Виктор

    у меня получилось :)) — дело в том, что для того чтобы нажать кнопку — надо было искать не ссылку, а именно кнопку, то есть action — (я заменил href на action и теперь всё работает — правда ссылки теперь все дохлые, надо как то теперь придумать, чтобы работало и то и другое 🙂 )

    • $pattern = «/(action|href)=»(/.*)»/i»;
      $replacement = «href=»http://narod.yandex.ru${2}»»;
      🙂
      Обратите внимание на ${2} в последней строке.

      Наверное, еще нужно добавить и src, чтобы рисунки правильно отображались
      $pattern = «/(src|action|href)=»(/.*)»/i»;

  • Виктор

    у меня получилось :)) — дело в том, что для того чтобы нажать кнопку — надо было искать не ссылку, а именно кнопку, то есть action — (я заменил href на action и теперь всё работает — правда ссылки теперь все дохлые, надо как то теперь придумать, чтобы работало и то и другое 🙂 )

    • $pattern = «/(action|href)=\»(\/.*)\»/i»;
      $replacement = «href=\»http://narod.yandex.ru\${2}\»»;
      🙂
      Обратите внимание на ${2} в последней строке.

      Наверное, еще нужно добавить и src, чтобы рисунки правильно отображались
      $pattern = «/(src|action|href)=\»(\/.*)\»/i»;

  • Виктор

    спасибо большое, я сам поэкспериментировал с регулярными выражениями — возможности очень широкие.

    изучаю Ваш блог, буду делать обзор Вашего блога на своём блоге 🙂

    кстати, у меня к Вам ещё один маленький вопрос — может Вы сможете навести на мысль — понимаете, мне нужно добавить товар на сайт автоматически на аукцион — через cURL, вот, у меня всё получается, но проблема в том, что при добавлении товара (при нажатии кнопки «Выставить лот») формируется ID, который передаётся методом POST (но я эмулировать передачу ID не могу, потому что я понятия не имею, какой будет ID — это номер, который генерирует аукцион) — например я легко эмулирую передачу своего личного пароля, потому что я его знаю, а тут — ну никак не получается.

    может Вы подскажете какое тут может быть решение — как мне получить ID и эмулировать передачу, чтобы не пришлось самому нажимать кнопку «Выставить лот» (вот, а то без этого вся моя работа теряет смысл 🙁 ).

    Я думал там AJAX — но решил отключить в браузере JS и проверить — добавляется без всякого Java Script.

    вот, большое Вам спасибо за Ваши ответы 🙂

    • Скорее всего, id товара сохраняется в каком-нибудь скрытом поле формы.
      Эти поля можно увидеть в режиме просмотра html или (этот вариант намного удобнее) с помощью плагина firebug для firefox.
      Кроме того, firebug позволяет просматривать запросы и ответы сервера.

  • Виктор

    спасибо большое, я сам поэкспериментировал с регулярными выражениями — возможности очень широкие.

    изучаю Ваш блог, буду делать обзор Вашего блога на своём блоге 🙂

    кстати, у меня к Вам ещё один маленький вопрос — может Вы сможете навести на мысль — понимаете, мне нужно добавить товар на сайт автоматически на аукцион — через cURL, вот, у меня всё получается, но проблема в том, что при добавлении товара (при нажатии кнопки «Выставить лот») формируется ID, который передаётся методом POST (но я эмулировать передачу ID не могу, потому что я понятия не имею, какой будет ID — это номер, который генерирует аукцион) — например я легко эмулирую передачу своего личного пароля, потому что я его знаю, а тут — ну никак не получается.

    может Вы подскажете какое тут может быть решение — как мне получить ID и эмулировать передачу, чтобы не пришлось самому нажимать кнопку «Выставить лот» (вот, а то без этого вся моя работа теряет смысл 🙁 ).

    Я думал там AJAX — но решил отключить в браузере JS и проверить — добавляется без всякого Java Script.

    вот, большое Вам спасибо за Ваши ответы 🙂

    • Скорее всего, id товара сохраняется в каком-нибудь скрытом поле формы.
      Эти поля можно увидеть в режиме просмотра html или (этот вариант намного удобнее) с помощью плагина firebug для firefox.
      Кроме того, firebug позволяет просматривать запросы и ответы сервера.

  • Виктор

    лучше не буду писать никаких обзоров — дам сразу ссылку на ваш блог на главную страницу — и всё ))

    верно, спасибо большое, я файрбугом нашёл — это скрытое поле в форме, которая передаёт данные методом ПОСТ.

    а как вывести можно на экран значение переменной, чтобы проверить?
    просто я пытался вывести например на экран значение переменной $pattern командой

    echo $pattern;

    Значение переменной $pattern = «/(action|href)=»(/.*)»/i»;

    но на экран выводится вот это

    «/(action|href)=»(/.*)»/i»

    Вот, у меня тоже не получается присвоить переменной данное значение 50786916, уже полдня пробую, но не могу никак проверить — подскажите пожалуйста, как можно проверить — какое значение присваивается переменной

    я вот так вот пробую делать
    $val = «/value=»/d{8}»/»;,
    и потом передаю переменную $val, но видимо как то не так передаётся — или не то значение находится, но как можно проверить — то ли значение присваивается?

    вот, извините ещё раз за беспокойство

  • Виктор

    лучше не буду писать никаких обзоров — дам сразу ссылку на ваш блог на главную страницу — и всё ))

    верно, спасибо большое, я файрбугом нашёл — это скрытое поле в форме, которая передаёт данные методом ПОСТ.

    а как вывести можно на экран значение переменной, чтобы проверить?
    просто я пытался вывести например на экран значение переменной $pattern командой

    echo $pattern;

    Значение переменной $pattern = «/(action|href)=\»(\/.*)\»/i»;

    но на экран выводится вот это

    «/(action|href)=\»(\/.*)\»/i»

    Вот, у меня тоже не получается присвоить переменной данное значение 50786916, уже полдня пробую, но не могу никак проверить — подскажите пожалуйста, как можно проверить — какое значение присваивается переменной

    я вот так вот пробую делать
    $val = «/value=\»/d{8}\»/»;,
    и потом передаю переменную $val, но видимо как то не так передаётся — или не то значение находится, но как можно проверить — то ли значение присваивается?

    вот, извините ещё раз за беспокойство

  • Виктор

    50786916 я взял отсюда — а то вы не поймёте наверное, что за цифра вообще, это как раз то значение, которое и ищу 🙂 —
    input type="hidden" value="50786916" name="auction_id"

    вот, ладно, вобщем буду разбираться спасибо за помощь

  • Виктор

    50786916 я взял отсюда — а то вы не поймёте наверное, что за цифра вообще, это как раз то значение, которое и ищу 🙂 —
    input type="hidden" value="50786916" name="auction_id"

    вот, ладно, вобщем буду разбираться спасибо за помощь

  • Виктор

    понял — максимум, что я получаю при таком поиске, это ведь value=50786916, а надо просто число, ну я опростоволосился — так — ну в общем понял в чём ошибка

  • Виктор

    понял — максимум, что я получаю при таком поиске, это ведь value=50786916, а надо просто число, ну я опростоволосился — так — ну в общем понял в чём ошибка

  • Виктор

    ладно, буду дальше читать про regexp — если что — извиняйте, что я тут изливаю флуд на ваш блог ))

  • Виктор

    ладно, буду дальше читать про regexp — если что — извиняйте, что я тут изливаю флуд на ваш блог ))

  • Если написать
    $pattern = «/(action|href)=»(/.*)»/i»;
    echo $pattern;
    то скрипт выведет значение переменной
    «/(action|href)=»(/.*)»/i»

    Чтобы вывести совпадения:
    preg_match_all($pattern, $subject, $matches);
    echo $matches;
    $subject — строка в которой выполняется поиск с помощью регулярного выражения, т.е. ваша страница.

    Для того чтобы получить часть найденной строки (число 50786916 из value=50786916) используйте круглые скобки в регулярном выражении (т.н. маски)

    «/value=»(/d{8})«/»

    В этом случае в первом элементе массива с результатами ($matches[0]) будут находиться совпадения со всем шаблоном, а во втором элементе ($matches[1]) — с первой подмаской (именно она вам и нужна).

    Будут еще вопросы, пишите 🙂

  • Если написать
    $pattern = «/(action|href)=\»(\/.*)\»/i»;
    echo $pattern;
    то скрипт выведет значение переменной
    «/(action|href)=\»(\/.*)\»/i»

    Чтобы вывести совпадения:
    preg_match_all($pattern, $subject, $matches);
    echo $matches;
    $subject — строка в которой выполняется поиск с помощью регулярного выражения, т.е. ваша страница.

    Для того чтобы получить часть найденной строки (число 50786916 из value=50786916) используйте круглые скобки в регулярном выражении (т.н. маски)

    «/value=\»(/d{8})\»/»

    В этом случае в первом элементе массива с результатами ($matches[0]) будут находиться совпадения со всем шаблоном, а во втором элементе ($matches[1]) — с первой подмаской (именно она вам и нужна).

    Будут еще вопросы, пишите 🙂

  • Виктор

    что то пока не получается наверное правильно задать страницу, в которой производится поиск

    ведь после выполнения команды
    $result = curl_exec($ch);, вся страница сохраняется в переменной $result по идее.

    preg_match_all('/d{1}/', $result, $matches);
    echo $matches;
    — вот этой командой ничего не выводит — получается только командой

    print_r($matches);

    но и то — там как то странно выводится — например вот по этому поиску preg_match_all('/d{8}/', $result, $matches);

    Выводится

    Array ( [0] => Array ( ) )

    то есть как это понимать — он нашёл одно единственное число, удовлетворяющее это условию?

    но почему я не могу его проверить, вот что странно.

    Например, попробовал вот такой вот страшный поиск preg_match_all('/d{125543}/', $result, $matches); — так он вообще ничего не вывел на экран, то есть смею предположить, что он ищет там где надо.

    Но например по такому поиску:
    "/value="(/d{8})"/" тоже ничего не выводит.

    Ладно буду дальше глубже разбираться в работе этих функций.

    • Виктор

      хотя нет, знаете — наверное я страницу поиска всё-таки задаю как то неправильно, потому что использовал вот такую конструкцию, чтобы проверить количество совпадений

      $result1 = preg_match_all('/d{3}/',$result,$matches);
      echo "Matches: $result1";

      и он мне выдал Matches:0, то есть ни одного совпадения 🙁

  • Виктор

    что то пока не получается наверное правильно задать страницу, в которой производится поиск

    ведь после выполнения команды
    $result = curl_exec($ch);, вся страница сохраняется в переменной $result по идее.

    preg_match_all('/d{1}/', $result, $matches);
    echo $matches;
    — вот этой командой ничего не выводит — получается только командой

    print_r($matches);

    но и то — там как то странно выводится — например вот по этому поиску preg_match_all('/d{8}/', $result, $matches);

    Выводится

    Array ( [0] => Array ( ) )

    то есть как это понимать — он нашёл одно единственное число, удовлетворяющее это условию?

    но почему я не могу его проверить, вот что странно.

    Например, попробовал вот такой вот страшный поиск preg_match_all('/d{125543}/', $result, $matches); — так он вообще ничего не вывел на экран, то есть смею предположить, что он ищет там где надо.

    Но например по такому поиску:
    "/value=\"(/d{8})\"/" тоже ничего не выводит.

    Ладно буду дальше глубже разбираться в работе этих функций.

    • Виктор

      хотя нет, знаете — наверное я страницу поиска всё-таки задаю как то неправильно, потому что использовал вот такую конструкцию, чтобы проверить количество совпадений

      $result1 = preg_match_all('/d{3}/',$result,$matches);
      echo "Matches: $result1";

      и он мне выдал Matches:0, то есть ни одного совпадения 🙁

  • Виктор

    $result1 = preg_match_all('/d{3,}/',$result,$matches);
    echo "Matches: $result1";

    вот так вот тоже попробовал — то есть три цифры и более — но тоже ни одного совпадения — ладно, буду счас всё перепроверять

  • Виктор

    $result1 = preg_match_all('/d{3,}/',$result,$matches);
    echo "Matches: $result1";

    вот так вот тоже попробовал — то есть три цифры и более — но тоже ни одного совпадения — ладно, буду счас всё перепроверять

  • Виктор

    нашёл своё число!!, только почему то всё равно два раза вывелось!!!

    просто неправильно построил регулярное выражение — надо вот так '/d{8}/'

    ну вобщем счас буду пробовать как нибудь его передавать методом ПОСТ — это самое число )))

  • Виктор

    нашёл своё число!!, только почему то всё равно два раза вывелось!!!

    просто неправильно построил регулярное выражение — надо вот так '/\d{8}/'

    ну вобщем счас буду пробовать как нибудь его передавать методом ПОСТ — это самое число )))

  • Виктор

    ну в общем вот — у меня получилось
    $matches[0] = Array ( [0] => 50790653 [1] => 50790653 )

    вот, надо как то вычленить отсюда только моё число из восьми цифр и поубирать всё остальное, эхх, может подскажете ещё какую нибудь функцию PHP для этого?

    нашёл я это выражение вот так вот
    $result1 = preg_match_all('/d{8}/', $result, $matches);

  • Виктор

    ну в общем вот — у меня получилось
    $matches[0] = Array ( [0] => 50790653 [1] => 50790653 )

    вот, надо как то вычленить отсюда только моё число из восьми цифр и поубирать всё остальное, эхх, может подскажете ещё какую нибудь функцию PHP для этого?

    нашёл я это выражение вот так вот
    $result1 = preg_match_all('/\d{8}/', $result, $matches);

  • Виктор

    ЗЫ вот, спасибо вам большое за всё!! 🙂

  • Виктор

    ЗЫ вот, спасибо вам большое за всё!! 🙂

  • Array ( [0] => Array ( ) )
    это означает, что переменная представляет собой массив, внутри которого находится вложенный массив

    >> может подскажете ещё какую нибудь функцию PHP для этого?

    echo $matches[0][0]; 🙂
    а если серьезно, нужно разобраться почему в результатах 2 числа. У меня нет исходного текста (по которому выполняется поиск), поэтому ответить не могу (если пришлете текст, думаю разберусь 😉 ).

    P.S. за символом нужно внимательно следить 🙂 Очень много ошибок из-за него.

    • Виктор

      оо — интересно — Вы мне написали то же самое, до чего я сам докумекал — спасибо :))

      я тоже не понял, почему в результатах два числа — причём одинаковых, ну ничего — думаю дело тут в моём регулярном выражении, надо разобраться получше, а то до сих пор в них плаваю

  • Array ( [0] => Array ( ) )
    это означает, что переменная представляет собой массив, внутри которого находится вложенный массив

    >> может подскажете ещё какую нибудь функцию PHP для этого?

    echo $matches[0][0]; 🙂
    а если серьезно, нужно разобраться почему в результатах 2 числа. У меня нет исходного текста (по которому выполняется поиск), поэтому ответить не могу (если пришлете текст, думаю разберусь 😉 ).

    P.S. за символом \ нужно внимательно следить 🙂 Очень много ошибок из-за него.

    • Виктор

      оо — интересно — Вы мне написали то же самое, до чего я сам докумекал — спасибо :))

      я тоже не понял, почему в результатах два числа — причём одинаковых, ну ничего — думаю дело тут в моём регулярном выражении, надо разобраться получше, а то до сих пор в них плаваю

  • Виктор

    У меня всё работает — разобрался

    нужно было передавать вот таким образом $matches[0][0] — и там как раз и было моё число

    Ещё раз спасибо Вам за всё )))

  • Виктор

    У меня всё работает — разобрался

    нужно было передавать вот таким образом $matches[0][0] — и там как раз и было моё число

    Ещё раз спасибо Вам за всё )))

  • А кто подскажет как проверить наличие ссылки на сайте… или например текста какого то определённого..
    Заранее спасибо

    • В переменной $result (перевый листинг) будет находится вся страница (в виде обычной строки). Т.е. вы можете использовать функции php для поиска текста или для работы с регулярными выражениями.

  • А кто подскажет как проверить наличие ссылки на сайте… или например текста какого то определённого..
    Заранее спасибо

    • В переменной $result (перевый листинг) будет находится вся страница (в виде обычной строки). Т.е. вы можете использовать функции php для поиска текста или для работы с регулярными выражениями.

  • UniteUnique

    Можно ли с помощью данного скрипта проверять список адресов на время последнего обновления ?

    • Нет, в этом варианте только проверка доступности. Проверку времени обновления нужно доделывать. Но, естественно, приделать ее к данному скрипту проще, чем писать новый скрипт. 😉

  • UniteUnique

    Можно ли с помощью данного скрипта проверять список адресов на время последнего обновления ?

    • Нет, в этом варианте только проверка доступности. Проверку времени обновления нужно доделывать. Но, естественно, приделать ее к данному скрипту проще, чем писать новый скрипт. 😉

  • Билл

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

    • Это не ко мне вопрос 🙂 Но, насколько я понимаю, вам нужно определить есть ли в заголовке ваш настоящий IP.

  • Билл

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

    • Это не ко мне вопрос 🙂 Но, насколько я понимаю, вам нужно определить есть ли в заголовке ваш настоящий IP.

  • Alsss

    про