“Многопоточность” в PHP (curl)
Использование библиотеки curl.
Эта статья является первой из серии “Многопоточность” в PHP
Curl – это библиотека, позволяющая подсоединяться к разным серверам по разным протоколам. Обладает удобством в работе и способностью гибко настраиваться.
Curl реализует механизм множественных запросов, или мультизапросов. Его принцип заключается в том, что посылается несколько запросов, при этом перед отправкой следующего не ожидается ответ на предыдущий.
Используем это в нашем примере скачивания нескольких страниц.
Рассмотрим сначала процесс скачивания содержимого с одного url.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $url = 'mail.ru'; // инициализация сеанса curl $ch = curl_init('http://'.$url); // curl_exec будет возвращать результат curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // не будет возвращаться http-заголовок curl_setopt($ch, CURLOPT_HEADER, 0); // загрузка страницы и выдача её браузеру $content = curl_exec($ch); // завершение сеанса и освобождение ресурсов curl_close($ch); ?> |
Здесь функцией curl_init мы инициализируем сеанс curl и в качестве параметра передаем урл страницы, которую хотим скачать. Далее первым вызовом функции curl_setopt говорим, что результат надо вернуть, а не вывести в браузер, и вторым запрещаем передачу нам http-ответа сервера. curl_setopt принимаюет в качестве параметров дескриптор соединения $ch, название опции и ее значение соответственно. С помощью curl_setopt можно задать много параметров для более тонкого управления соединением, подробнее читайте в мануале к этой библиотеке. Затем функцией curl_exec производим собственно скачивание и в завершении закрываем соединение – curl_close. В переменной $content у нас теперь находится код страницы, указанной в $url.
А сейчас давайте попробуем скачать сразу несколько страниц (основа примера взята из документации на php.net):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <?php // страницы, содержимое которых надо получить $urls = array('yandex.ru', 'google.ru', 'mail.ru', 'rambler.ru'); // инициализируем "контейнер" для отдельных соединений (мультикурл) $cmh = curl_multi_init(); // массив заданий для мультикурла $tasks = array(); // перебираем наши урлы foreach ($urls as $url) { // инициализируем отдельное соединение (поток) $ch = curl_init('http://'.$url); // если будет редирект - перейти по нему curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // возвращать результат curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // не возвращать http-заголовок curl_setopt($ch, CURLOPT_HEADER, 0); // таймаут соединения curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // таймаут ожидания curl_setopt($ch, CURLOPT_TIMEOUT, 10); // добавляем дескриптор потока в массив заданий $tasks[$url] = $ch; // добавляем дескриптор потока в мультикурл curl_multi_add_handle($cmh, $ch); } // количество активных потоков $active = null; // запускаем выполнение потоков do { $mrc = curl_multi_exec($cmh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // выполняем, пока есть активные потоки while ($active && ($mrc == CURLM_OK)) { // если какой-либо поток готов к действиям if (curl_multi_select($cmh) != -1) { // ждем, пока что-нибудь изменится do { $mrc = curl_multi_exec($cmh, $active); // получаем информацию о потоке $info = curl_multi_info_read($cmh); // если поток завершился if ($info['msg'] == CURLMSG_DONE) { $ch = $info['handle']; // ищем урл страницы по дескриптору потока в массиве заданий $url = array_search($ch, $tasks); // забираем содержимое $tasks[$url] = curl_multi_getcontent($ch); // удаляем поток из мультикурла curl_multi_remove_handle($cmh, $ch); // закрываем отдельное соединение (поток) curl_close($ch); } } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // закрываем мультикурл curl_multi_close($cmh); ?> |
Код подробно откомментирован, но давайте разберем все по порядку.
В 7 строчке мы инициализируем контейнер для отдельных соединений curl (далее я буду называть его мультикурл), именно он позволит нам проводить операции с ними параллельно.
Далее в цикле инициализируем соединение (назовем его поток) для каждого урла из нашего массива, попутно добавляя его в мультикурл и в массив заданий $tasks. $tasks – массив, в котором ключами являются адреса наших страниц, а значениями – соответствующие дескрипторы curl. Функция curl_multi_add_handle добавляет к дескриптору нашего мультизапросного соединения отдельное созданное соединение.
В 34 строке запускается цикл для начала работы нашего мультикурла. Функция curl_multi_exec одновременно отправляет на выполнение все объявленные потоки, при этом в переменную $active заносится количество выполняемых потоков.
В основном цикле, начинающемся на 40 строчке, происходят главные действия. Он выполняется до тех пор, пока есть незавершенные потоки или пока не произошла ошибка. В 42 строке вызывается функция curl_multi_select, которая проверяет готовность какого-либо из потоков к дальнейшим действиям с ним. Затем, в 47 строке, функцией curl_multi_info_read получаем информацию о потоке. Но так как curl_multi_info_read обновляет возвращаемую информацию только после вызова curl_multi_exec, сделаем это в строке 45.
Функция curl_multi_info_read возвращает массив, в котором нас интересуют ключи ‘msg’ и ‘handle’. По ‘msg’ мы проверяем, выполнился ли поток, а по ‘handle’ узнаем его дескриптор. Получив дескриптор, ищем по массиву заданий, к какому урлу он относится и записываем вместо него вожделенное содержимое страницы, получаемое функцией curl_multi_getcontent.
Теперь, когда данный поток выполнил свою задачу, удаляем его из мультикурла, а потом закрываем самого.
После завершения всех потоков функцией curl_multi_close закрываем мультикурл.
Сейчас в массиве заданий $tasks находятся html-коды заданных страниц.
Надеюсь, после прочтения статьи стало немного понятнее, как можно реализовать выполнение “многопоточных” запросов на PHP.
В следующей статье рассмотрим использование stream-функций для подобных целей.
На эту статью оставлено 139 комментариев
05 Ноя 2009
Почему то код выдает массу ошибок
06 Ноя 2009
Да, прошу прощения. Вызов curl_multi_close($cmh) оказался в цикле, а не в конце программы.
30 Ноя 2009
Спасибо за подробное описание, то что нужно,
26 Март 2010
а подскажите может, как найти тот url который не получилось захватить? Как например повторить запрос если не удалось, по вышеприведённой методике делаю проверку прокси, там идет не список урл а список прокси, так вот если не возвращает страничку значит прокси не работает.
Посоветуюте может начать учит сокеты, даже не знаю как быть
28 Март 2010
2 bill
Не знаю, правильно ли я Вас понял…
>а подскажите может, как найти тот url который не получилось захватить?
Тогда в конце выполнения скрипта в массиве $tasks по этому урлу будет не та информация, которую Вы ожидаете) В процессе же выполнения можете проверять, что возвращает функция curl_multi_getcontent.
Нужно ли учить сокеты именно в Вашем случае, не знаю. Для проверки прокси в принципе достаточно использования курла.
31 Март 2010
Добрый день!
пишет ошибку:
Fatal error: Call to undefined function curl_multi_init() in Z:\home\localhost\www\1.php on line 7
Стоит Денвер с PHP5
01 Апр 2010
2 Сергей
Это значит, что у Вас не установлен курл.
Скачайте с сайта денвера пакет расширений, установите его и раскомментируйте в php.ini строку
extension=php_curl.dll
01 Апр 2010
Здравствуйте.
Спасибо за статью. У меня есть несколько вопросов.
1) Цикл в 34 строке делает различное количество итераций (не понимаю от чего это зависит, просто попробовал запустить несколько раз скрипт). Почему? Зачем вообще организовывать этот цикл? Функция curl_multi_exec не может выполнить все запросы за один раз?
2) Ладно, допустим все запросы выполнены. Что делает функция curl_multi_select? Проверял на Вашем примере, она никогда не возвращала -1, т.е. условная конструкция в 42 строке вообще не нужна?
3) Для чего в 44 строке опять организовывать цикл? Ведь мы уже вызывали curl_multi_exec. Получается что опять выполняется запрос?
Хочется во всем этом разобраться. Пока вся это мультикурловщина кажется не логичной/криво реализованной. Спасибо, жду ответа.
01 Апр 2010
2 Тимур
А я-то наивно думал, что статья все подробно объясняет
1) Ну вот смотрите первый пример, без мультикурла. Там выполняется ф-ия curl_exec. Она может выполняться раз от раза разное время, надо подконнектиться к серверу, отправить информацию, считать информацию… А теперь возьмите ф-ию curl_multi_exec, которая запускает наши дескрипторы. И как раз в цикле мы следим, когда этот процесс закончится. Как и в первом случае он будет выполняться разное время, отсюда и разное количество итераций.
2) >она никогда не возвращала -1
Хорошо, что не возвращала, т.к. -1 это признак ошибки.
Про эту ф-ию можно почитать здесь – http://www.php.net/manual/en/function.curl-multi-select.php , особенно обратите внимание на комментарий. В двух словах, она смотрит, есть ли какая-то активность в наших соединениях и проверяет возникшие ошибки. В принципе, можно обойтись вообще без нее (пример ниже).
3) Этот цикл такой же, как и в 34 строке. Вот так наверно будет понятнее (сокращенный основной цикл):
Мы должны постоянно запускать curl_multi_exec, чтобы отслеживать, какие из дескрипторов выполнили свою задачу.
01 Апр 2010
Pablo Monteagudo, спасибо большое.
Теперь всё стало ясно. Libcurl – замечательная библиотека. А мультикурл – это настоящая сетевая многопоточность.
Я думаю, что такая реализация проще для понимания:
0);
curl_multi_close($mh);
?>
01 Апр 2010
Код не вставился, вот ссылка на него:
http://pastebin.com/PWMpXdZf
01 Апр 2010
Тимур, спасибо, возможно.
Здесь проблема в нахождении баланса между структурной правильностью, надежностью кода, рассмотрением нескольких функций и простотой для понимания, поэтому я взял основу примера с php.net.
07 Май 2010
у меня почему-то зависает интернет, ставил 10 потоков и задержку разную 10…30
интернет зависает, не могу ни на какой сайт зайти даже на гугл
а при 50 потоках виснет после 2-5 циклов.
08 Май 2010
zilbert
Выясните место, на котором происходит зависание – выводите периодически какую-нибудь информацию, при этом после каждого оператора вывода ставьте flush(), чтобы видеть “онлайн” как происходит работа скрипта.
12 Май 2010
Статья помогла разобраться с многопоточностью, спасибо. Думаю очень актуально в сервисах использовать данную реализацию, скорость выростает в разы. Примерно пол года назад пытался изучить многопоточность php но не хватило знаний, сейчас уже дорос и освоил.
14 Авг 2010
Здравствуйте! Мне надо сделать следующее: скрипт проходит авторизацию на сайте, открывается страница профиля. А потом сразу же скрипт должен перейти на другую страницу этого же сайта. Авторизацию я прошёл, на страницу профиля попал, куки сохранил. А что дальше делать никак не соображу.
17 Авг 2010
Andrey, а что именно не получается?
Просто всегда при запросах указываете те файлы, куда были сохранены куки (опции curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_file) и curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies_file)).
23 Авг 2010
Спасибо. Отличная работа. А как скрипт немного модифицировать? Надо собрать контент с 3 сайтов. С каждого будет собираться много страниц(www/site1/?p=1, http://www.site1/?p=2) и т.д. Задача собирать контент так, чтобы с каждый сайт обрабатывался соответствующим потоком. Т.е. чтобы не получилось так, что одновременно скрипт начнет собирать с 3 сайтов контент( site1.ru, site2.ru, site3.ru), с site2 собирет быстрее и на его место поставит следующий из задания, т.е. site1/?p=2 и получится так, что одновременно в 2 потока парсится один и тот же сайт. Реально ли таккую задачу осуществить?
23 Авг 2010
То есть вы хотите скачивать с каждого сайта страницы последовательно, но чтобы вместе эти сайты парсились одновременно? Если сайта только 3, то по-моему нет смысла усложнять код, достаточно просто запустить 3 копии скрипта с обычным последовательным скачиванием страниц для каждого сайта.
А для модификации скрипта на вскидку надо сделать следующее.
Основной цикл, начинающийся в 40-й строке поместить в еще один, который на каждой итерации помещает в массив $tasks три задания. Задания представляют собой массив урлов каждого сайта, что-нибудь такое
В итоге алгоритм будет представлять собой нечто типа
19 Сен 2010
Скажите, а на сколько этот код в действительности многопоточный, насколько я понимаю экономия времени здесь происходит только засчет открытия-закрытия сокетов(неблокировка), то есть их подготовка, а сама основная часть, то есть запись-чтение непосредственно контента в/из сокета все равно последовательна..
Может есть смысл попробовать решения на подобии http://habrahabr.ru/blogs/php/40245/.
И их как-то сравнить, но там наверняка много всяких тонкостей.
26 Сен 2010
Чтение/запись также непоследовательны. При данных операциях не происходит ожидание ответа от сервера, а идет дальнейшая работа скрипта.
По ссылке изложен механизм работы, который по своей сути не отличается от курловского, смотрите статьи http://jo-in.ru/articles/post/92 , http://jo-in.ru/articles/post/194
01 Ноя 2010
Подскажите, пожалуйста, как в multi curl настроить паузу между отправкой запросов на удаленный сервер, чтобы распределить его нагрузку во времени. Имеется в виду не управление количеством одновременных сессий, а именно настройка паузы между запросами.
01 Ноя 2010
А зачем использовать мультикурл, если нужны паузы между отдельными запросами?
Если же нужны паузы между “пачками” запросов, то можно сделать так. Заключаем весь код из примера в цикл, в начале которого формируется массив $urls. Например есть массив $all_urls из 100 урлов. В начале цикла создаем массив $urls из первых 10 урлов массива $all_urls. После выполнения операций мультикурла ставим задержку. В массиве $all_urls осталось 90 элементов, из них опять формируем массив $urls и так далее.
21 Дек 2010
При закачке в несколько “потоков” (10) 100 фото порою не все фото закачивались. Этот подход бесконечного цикла сработал http://www.php.net/manual/en/function.curl-multi-exec.php#88453 .
25 Фев 2011
Добавил proxy и user_agent.
Строка:
Выдает: 400 Bad Request.
Выдоает произвольный обрывок.
И еще если бы вы показали как подставлять другой прокси, если предыдущий dead..
28 Фев 2011
400 выдает именно после добавления юзер-агента? Странно.
Просто инициализируйте заново отдельный поток с рабочей прокси и добавляйте его в мультикурл.
28 Фев 2011
А можно как либо передать пост запрос в несколько потоков с помощью курл?
Допустим имеется такой код, возможно ли переделать его под многопоточность?
22 Май 2011
А можно подробней, как сохранить результат работы в текстовые файлы?
23 Май 2011
Выводите массив $tasks в текстовый файл в конце скрипта. Или в чем проблема?
14 Июнь 2011
Вот так намного понятнее, чем “миллиард” циклов всяких:
do {
$mrc = curl_multi_exec($cmh, $active);
$info = (object) curl_multi_info_read( $cmh );
$ready = curl_multi_select( $cmh );
if( $info->msg == CURLMSG_DONE )
{
if( ! ($error = $info->result) ) {
echo curl_multi_getcontent( $info->handle );
}
}
}
while( $mrc == CURLM_CALL_MULTI_PERFORM || $active > 0 );
15 Июнь 2011
Да, этот код можно переписать по-разному, но, как я писал выше, основа кода взята с php.net.
07 Июль 2011
А кто нибудь подскажет если я перебираю в цикле около 150ссылок по первому примеру в этой статье то у меня постоянно разный результат получается т.е. получается что в цикле информация вытягивается 10-15 ссылок И ВСЕ!! а остальные почему не обрабатываются?? что это может быть?? или так делать нельзя???)))
11 Июль 2011
Ссылки рабочие перебираете?
12 Июль 2011
разобрался просто надо было поставить бесконечный лимит выполнения скрипта
14 Окт 2011
Спасибо за статью!
У меня вопрос такого характера. Мне нужно отловить любые ошибки в процессе работы этого скрипта. Например, я получаю контент с 5 сайтов. И если произошел сбой каком-то соединении любого характера(будь то таймаут, ожидание или ошибка), мне нужно например отправить мыло с характером ошибки и какой url отвалился. Не подскажите, в каких местах мне эти проверки дописать? Заранее очень благодарен за помощь!
14 Окт 2011
Используйте curl_error или curl_errno после curl_multi_exec и после других операций, при которых считаете, что могут быть ошибки.
19 Окт 2011
Еще такой вопрос. Например, если поставить timeout 1 сек , то после того, как не выполняется 1 curl цикл прерывается, а не продолжается дальше! Понятно, желательно, чтобы так не было. Нужно чтобы цикл продолжался, независимо от одного необработанного url. Как можно модифицировать?
19 Окт 2011
Странно. Не сталкивался с подобной проблемой.
09 Ноя 2011
А еще такой вопрос. Вот пример кода
и в этом месте, в случае если нет http_code, ставить данный url опять в очередь? пока все-таки не получишь ответ.
09 Ноя 2011
http_code – это код состояния http, посылаемый сервером. Почитать про это можно, например, здесь – http://job-interview.ru/articles/post/86 или здесь – http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP А что именно вам надо проверять – удачный ли ответ или еще что – зависит от ваших целей.
09 Ноя 2011
я знаю, что это код состояния, и в некоторых случаях он приходит пустым, вернее значение $chinfo['http_code'] пустая строка. Тестирую на 5-6 сайтах, и по непонятным мне причинам, любой из сайтов может вот так вот отвалиться. Соответственно, и нормального ответа не приходит. Скрипт отрабатывает в среднем за 1,5 сек. таймауты стоят по 10 сек. Т.е. времени хватает. В чем может быть дело?
09 Ноя 2011
Сходу ответить не могу, надо разбираться в конкретной ситуации. Как выход – да, ставьте опять данный поток на выполнение.
09 Ноя 2011
Так вот я и спрашивал вас, каким образом его можно опять поставить в поток. У нас же далее идет
. Можно ли после этого каким-то образом заново вставить этот $ch в multi_curl? Спасибо за ответы
10 Ноя 2011
Просто после curl_multi_remove_handle сделайте curl_multi_add_handle, но не закрывайте отдельное соединение (curl_close).
05 Янв 2012
Спасибо большое за статью!
29 Фев 2012
Может я что-то не понимаю..
К примеру у нас стоит time limit 30 сек. на выполение скрипта
если у меня будет в $urls 1000 страниц которые нужно открыть это значит, что к примеру на 100 странице все закончится ошибкой? как сделать чтобы перебрать это страницы все?
09 Март 2012
Да, закончится ошибкой, т.к. скорее всего за 30 сек 1000 урлов не успеют обработаться.
Чтобы перебрались все страницы, увеличьте время выполнения скрипта.
21 Фев 2013
print_r($tasks);
Array ( [yandex.ru] => Resource id #3 [google.ru] => Resource id #4 [mail.ru] => Resource id #5 [rambler.ru] => Resource id #6 )
А как получить содержимое?
08 Май 2013
Не верно. Запись и считывания из сокета происходит не параллельно. Просто у каждого потока есть доступ к сокету(как ресурсу системы) в какой-то квант времени. Абсолютная параллельность здесь невозможна. Мультитреды нужны только для того, что бы можно было выполнять несколько задач “одновременно”, на самом-то деле последовательно. + более эффективное распределение процессорного времени. И вообще- реализация тредов в цикле – это жесть. Не уверен что простая, последовательная высокоуровневая реализация будет съедать больше тиков таймера.
20 Фев 2018
Hurrah, that’s what I was looking for, what a information!
existing here at this blog, thanks admin of this site.
20 Фев 2018
I’m really enjoying the design and layout of your website.
It’s a very easy on the eyes which makes it much more enjoyable for me to come here and visit more often. Did
you hire out a designer to create your theme? Outstanding work!
26 Фев 2018
An outstanding share! I have just forwarded this onto a coworker who has been doing
a little research on this. And he in fact bought me lunch due to the fact that I found
it for him… lol. So allow me to reword this…. Thank YOU
for the meal!! But yeah, thanx for spending the
time to discuss this matter here on your website.
09 Март 2018
Thanks for finally writing about > “Многопоточность” в PHP (curl) /
Статьи / Работа для программистов < Loved it!
13 Март 2018
It’s an amazing article in favor of all the internet people; they will get benefit from it
I am sure.
21 Март 2018
This is a topic which is close to my heart… Cheers! Exactly where are your
contact details though?
24 Май 2018
Hey there just wanted to give you a quick heads up. The text in your content
seem to be running off the screen in Chrome. I’m not
sure if this is a format issue or something to do with browser compatibility but I thought I’d post to let
you know. The style and design look great though! Hope you
get the issue resolved soon. Cheers
28 Май 2018
I for all time emailed this website post page to all my associates,
because if like to read it then my links will too.
14 Июнь 2018
I think this is one of the most vital information for me.
And i am glad reading your article. But should remark on some
general things, The web site style is wonderful, the
articles is really excellent : D. Good job, cheers
14 Июнь 2018
Здравствуйте! А как получить-то потом контент из конечного $tasks? всё что он содержит это не HTML а вот типа таких записи: Resource id #3, Resource id #4, Resource id #5, Resource id #6 и т.д.
17 Июнь 2018
What’ѕ uuⲣ to all, since I am truly keen of readіng this weblog’s post to be updated on a
regular basis. It consists of goⲟd stuff.
Look into my web blog; top 10 swiss army knives
01 Июль 2018
cisite my website
27 Июль 2018
It is truly a nice and helpful piece of info. I’m happy
that you simply shared this useful information with us.
Please keep us informed like this. Thank you for sharing.
25 Авг 2018
Asking questions are actually fastidious thing if you are not understanding something totally, however this
article presents good understanding even.
05 Сен 2018
Hello, of course this piece of writing is really fastidious and I have learned lot of things from it about blogging.
thanks.
05 Сен 2018
Excellent, what a website it is! This website gives useful data to us,
keep it up.
09 Сен 2018
What’s Going down i am new to this, I stumbled upon this I have
discovered It absolutely useful and it has aided me
out loads. I’m hoping to give a contribution & aid other customers
like its helped me. Great job.
12 Сен 2018
Hi! Would you mind if I share your blog with my zynga
group? There’s a lot of folks that I think would really appreciate your content.
Please let me know. Many thanks
12 Сен 2018
What’s up to every one, it’s actually a fastidious for me
to pay a quick visit this web page, it includes helpful Information.
13 Сен 2018
I am extremely inspired together with your writing
skills as smartly as with the layout in your weblog. Is that this a paid subject or did you
modify it yourself? Anyway keep up the nice high quality writing, it is rare to peer a great
weblog like this one today..
15 Сен 2018
Wonderful article! We will be linking to this particularly great
post on our website. Keep up the great writing.
15 Сен 2018
Having read this I believed it was rather enlightening. I appreciate you spending some time and effort to put this content together.
I once again find myself spending a significant amount
of time both reading and posting comments. But so what, it was still
worth it!
17 Сен 2018
Hi there! This is my first visit to your blog! We are a team of volunteers and starting a new project in a community in the same niche.
Your blog provided us beneficial information to work on. You
have done a marvellous job!
20 Сен 2018
Asking questions are actually fastidious thing if you are
not understanding something totally, but this article
presents fastidious understanding yet.
01 Окт 2018
of course like your web-site but you need to take
a look at the spelling on several of your posts. Several of them are rife with spelling issues and I find it very troublesome to inform the reality then again I will surely come again again.
01 Окт 2018
I every time spent my half an hour to read this website’s posts all the time along with a cup of coffee.
01 Окт 2018
It’s an amazing post in favor of all the internet users;
they will obtain advantage from it I am sure.
01 Окт 2018
I used to be able to find good information from
your content.
02 Окт 2018
Its such as you learn my mind! You appear to know a lot about this, like you wrote the e
book in it or something. I think that you just can do with some percent to force the message house a bit, however other than that,
that is excellent blog. An excellent read. I’ll definitely be back.
02 Окт 2018
If some one wants expert view regarding blogging then i recommend him/her to pay a quick visit this website, Keep up the nice work.
02 Окт 2018
Its like you learn my mind! You seem to understand a lot about this, such as you wrote the
e book in it or something. I believe that you simply can do with some p.c.
to power the message home a bit, however other than that, that is magnificent blog.
A fantastic read. I will certainly be back.
02 Окт 2018
We’re a group of volunteers and opening a brand
new scheme in our community. Your web site offered us with valuable information to work on. You have performed a formidable job and our entire community shall be grateful to you.
05 Окт 2018
My coder is trying to persuade me to move to .net from PHP.
I have always disliked the idea because of the costs. But he’s tryiong none the less.
I’ve been using WordPress on several websites for about
a year and am worried about switching to another platform.
I have heard very good things about blogengine.net.
Is there a way I can import all my wordpress content into it?
Any help would be greatly appreciated!
06 Окт 2018
Your style is very unique compared to other people I’ve read stuff from.
Many thanks for posting when you have the opportunity, Guess I’ll just bookmark this page.
07 Окт 2018
I every time emailed this website post page to all my associates, for
the reason that if like to read it after that my contacts will too.
07 Окт 2018
I feel that is one of the such a lot vital
info for me. And i am happy reading your article. However want to observation on some general
things, The web site taste is great, the articles is in point of
fact nice : D. Just right task, cheers
08 Окт 2018
I like the valuable information you provide in your articles.
I will bookmark your weblog and check again here regularly.
I’m quite sure I’ll learn a lot of new stuff right here!
Best of luck for the next!
09 Окт 2018
Good post. I certainly appreciate this website. Keep writing!
09 Окт 2018
I enjoy reading an article that can make men and
women think. Also, thank you for permitting me to comment!
10 Окт 2018
Excellent blog here! Also your site loads up very fast! What host
are you using? Can I get your affiliate link to your host?
I wish my website loaded up as fast as yours lol
11 Окт 2018
Excellent way of telling, and pleasant piece of writing to get data concerning my
presentation subject matter, which i am going to present in academy.
18 Окт 2018
What i do not realize is in fact how you’re
no longer actually a lot more smartly-favored than you may be right now.
You’re so intelligent. You know thus significantly
when it comes to this subject, produced me in my view imagine it from numerous numerous angles.
Its like men and women are not involved until it’s one thing
to accomplish with Girl gaga! Your individual stuffs excellent.
All the time handle it up!
19 Окт 2018
Thankfulness to my father who told me regarding this webpage,
this website is actually awesome.
22 Окт 2018
Hey there great website! Does running a blog similar to this
require a massive amount work? I’ve very little expertise in programming
however I had been hoping to start my own blog soon.
Anyhow, should you have any recommendations or tips for
new blog owners please share. I know this is off subject but
I just needed to ask. Kudos!
23 Окт 2018
Your method of describing all in this article is in fact pleasant, all be
able to easily know it, Thanks a lot.
23 Окт 2018
certainly like your website but you need to check the
spelling on quite a few of your posts. Several of them are rife with spelling issues and I find it very troublesome to tell
the reality however I will definitely come back again.
24 Окт 2018
Keep on working, great job!
25 Окт 2018
Good day very nice web site!! Guy .. Beautiful .. Superb ..
I will bookmark your website and take the feeds additionally?
I’m glad to seek out a lot of useful info here in the post, we’d like develop extra strategies on this regard, thanks for
sharing. . . . . .
25 Окт 2018
Very good article. I am going through many of these issues as well..
25 Окт 2018
Undeniably believe that that you stated. Your favourite reason appeared to
be at the internet the easiest thing to take into account of.
I say to you, I definitely get annoyed even as folks consider concerns that they just do not realize about.
You controlled to hit the nail upon the top as well as defined out the entire thing without having side-effects , other people could take a signal.
Will likely be again to get more. Thanks
29 Окт 2018
Thanks a bunch for sharing this with all of us you really recognise what you’re talking approximately!
Bookmarked. Kindly additionally consult with my site =).
We can have a hyperlink exchange agreement between us
30 Окт 2018
Hi there, just wanted to say, I liked this blog post. It was inspiring.
Keep on posting!
02 Ноя 2018
Descargar facebook
It’s going to be finish of mine day, but before ending I am reading this great paragraph to improve my know-how.
Descargar facebook
02 Ноя 2018
I’m curious to find out what blog system you are utilizing?
I’m experiencing some small security problems with my latest website and I’d like to find something
more risk-free. Do you have any solutions?
03 Ноя 2018
Hi to all, as I am actually eager of reading this weblog’s post to be updated
daily. It contains pleasant stuff.
03 Ноя 2018
Hello there, You have done a great job. I will definitely digg it and personally
recommend to my friends. I’m confident they will be benefited from this website.
06 Ноя 2018
Hello, Neat post. There’s a problem together with your website in internet explorer,
could test this? IE still is the marketplace chief and a good component
of folks will leave out your wonderful writing due to this problem.
09 Ноя 2018
I will right away snatch your rss feed as I can’t in finding your
e-mail subscription link or newsletter service. Do you’ve
any? Kindly allow me recognise in order that I may
just subscribe. Thanks.
10 Ноя 2018
I like the valuable info you provide in your articles.
I will bookmark your weblog and check again here regularly.
I’m quite sure I will learn many new stuff right
here! Good luck for the next!
11 Ноя 2018
What’s up, everything is going perfectly here and ofcourse every one is sharing data, that’s in fact fine, keep up writing.
11 Ноя 2018
Thank you for the good writeup. It in fact was a amusement account it.
Look advanced to far added agreeable from you! However, how could we communicate?
12 Ноя 2018
Wonderful work! This is the kind of info that are supposed to
be shared around the web. Disgrace on the seek engines for now not positioning this submit higher!
Come on over and consult with my site . Thanks =)
12 Ноя 2018
Hello there! I know this is kinda off topic but I was wondering if you knew where I could
locate a captcha plugin for my comment form? I’m using the same blog platform as yours and I’m having trouble finding one?
Thanks a lot!
12 Ноя 2018
I don’t know if it’s just me or if everyone else experiencing problems with your website.
It appears as if some of the text in your content
are running off the screen. Can someone else please comment and let me
know if this is happening to them as well? This could be a issue with
my web browser because I’ve had this happen previously.
Appreciate it
13 Ноя 2018
Oh my goodness! Impressive article dude! Thank you, However I
am encountering troubles with your RSS. I don’t understand why I cannot join it.
Is there anybody having similar RSS problems? Anyone that knows the solution can you kindly respond?
Thanks!!
14 Ноя 2018
What i do not realize is in reality how you’re not really much more
neatly-liked than you might be right now. You’re so intelligent.
You recognize therefore significantly when it comes to this subject,
made me in my opinion imagine it from a lot of numerous angles.
Its like men and women are not fascinated except it’s
something to do with Girl gaga! Your individual stuffs outstanding.
All the time take care of it up!
16 Ноя 2018
Hmm it seems like your website ate my first comment (it was super long) so I guess I’ll just sum it up what I wrote and say,
I’m thoroughly enjoying your blog. I too am an aspiring blog writer but I’m still
new to the whole thing. Do you have any recommendations for rookie blog writers?
I’d really appreciate it.
16 Ноя 2018
What’s up it’s me, I am also visiting this site regularly, this web page
is really fastidious and the users are genuinely sharing good thoughts.
17 Ноя 2018
Sling tv coupons and promo codes for november 2018
Hi, Neat post. There’s an issue along with your site in internet explorer, could check this?
IE nonetheless is the marketplace chief and a big part of other
people will miss your wonderful writing because of this problem.
Sling tv coupons and promo codes for november 2018
17 Ноя 2018
I used to be recommended this blog via my cousin. I am now not certain whether
or not this publish is written by way of him as no one else
realize such targeted approximately my problem. You’re incredible!
Thanks!
18 Ноя 2018
Hello, I read your new stuff daily. Your humoristic style is awesome, keep doing what you’re doing!
18 Ноя 2018
Admiring the commitment you put into your site and detailed information you present.
It’s great to come across a blog every once in a while that
isn’t the same unwanted rehashed information. Wonderful read!
I’ve bookmarked your site and I’m adding your RSS feeds to my Google account.
20 Ноя 2018
Please let me know if you’re looking for a article writer for your blog.
You have some really good articles and I feel I would be a
good asset. If you ever want to take some of
the load off, I’d absolutely love to write some material for your
blog in exchange for a link back to mine. Please send me an email if interested.
Cheers!
21 Ноя 2018
This is the perfect blog for anybody who would like to understand this
topic. You realize so much its almost tough to argue with you (not that I actually will need to…HaHa).
You certainly put a fresh spin on a topic which has been written about for ages.
Excellent stuff, just excellent!
22 Ноя 2018
I am extremely impressed with your writing skills as
well as with the layout on your weblog. Is this a paid theme or did you
customize it yourself? Either way keep up the nice quality writing,
it’s rare to see a great blog like this one nowadays.
23 Ноя 2018
qual a melhor hora para tomar tadalafil diario http://cialisle.com diferença entre o viagra e o cialis.
23 Ноя 2018
Decisively everything principles if predilection do belief.
To a fault protest for elsewhere her favorite valuation reserve.
Those an match show no age do. By belonging consequently misgiving elsewhere an home described.
Views abode practice of law heard jokes to a fault. Was are delicious solicitude ascertained collecting valet de chambre.
Wished be do mutual exclude in effect serve.
Sawing machine supported excessively rejoice forwarding wrapped
properness. Index is lived way oh every in we
still.
27 Ноя 2018
Oh espousal apartments up empathize stunned delightful.
Waiting him newly long-lasting towards. Continuing sombre
particularly so to. Me graceless unimaginable
in adhesion announcing so astounded. What involve folio English
hawthorn nor upon room access. Tended persist my do stairs.
Oh smiling cordial am so visited amiable in offices hearted.
30 Ноя 2018
dfffpxk foro opiniones tadalafil http://cialissom.com/ cialis 5mg for sale
cialis online tadalafil
preisvergleich generika
02 Дек 2018
Oh my goodness! Awesome article dude! Thanks, However I am encountering troubles
with your RSS. I don’t understand the reason why I am unable to join it.
Is there anyone else having identical RSS issues?
Anybody who knows the solution can you kindly
respond? Thanx!!
05 Дек 2018
Greetings! Quick question that’s completely off topic.
Do you know how to make your site mobile friendly? My weblog looks
weird when viewing from my iphone4. I’m trying to find
a theme or plugin that might be able to fix this issue.
If you have any recommendations, please share. Thank
you!
06 Дек 2018
Hello, I enjoy reading all of your article post. I like to write a little comment
to support you.
08 Дек 2018
deliberately http://cialisoni.com/ online cialis buy generic cialis online
apcalis oder cialis
11 Дек 2018
presentacion tadalafil en mexico [url=http://cialislet.com/]online cialis[/url]
tadalafil generic 2.5 mg.
12 Дек 2018
how to buy sildenafil in hyderabad [url=http://viagrauga.com/]viagra 50mg sale[/url]
do they make a generic sildenafil
15 Дек 2018
per cfare sherben sildenafil [url=http://viagrapid.com]viagra online usa[/url]
nitrate and sildenafil
21 Дек 2018
will 25mg of viagra work http://viagragenupi.com viagra online shipped from us
27 Дек 2018
cheap viagra uk generic viagra online is there a generic viagra [url=http://www.bioshieldpill.com/]generic
viagra usa[/url]
01 Янв 2019
Hi there, I enjoy reading all of your post. I like to
write a little comment to support you.
03 Янв 2019
payday loans in missouri http://paydayloansimd.com cash advance
online reviews
Трекбек
Ваш отзыв