Архив категории Кодинг

Dating Pro и загрузка файлов на сервер

8 Сентябрь 2011

Шалом! Довелось мне тут давеча поработать с движком Dating Pro – если кто не знает, такая большая тяжелая шестеренка для организации сайта знакомств. Не смотря на свои размеры (дистрибутив более 100мб) – работает весьма шустро и не сравнится с джумлой в связке с кривыми модулями от испанских разработчиков-индусов  (был опыт, ага). Так вот, проблема была в том, что при попытке обновить аватарочку вываливалось сообщение об ошибке – попросили исправить.

Начал разбираться. В админке нашлась галочка «Модерировать загружаемые изображения», однако там было все в порядке. С «владельцем» и правами доступа/записи на временную директорию и на директорию назначения самого движка все тоже было в норме. Полез копаться в коде. Выяснилось вот что: загрузка файла происходила нормально, после чего движок пытался изменить размер загруженного изображения ДО его переноса из временной папки темп (общей для всего сервера), т.е. открыть картинку, изменить ее размер и записать обратно. После этого видимо все и ломалось. Показалось мне, не по феншую это, и проблема могла исходить именно отсюда. Для этого сразу после кода загрузки файла, перед всеми остальными действиями движка, я вставил вот такой код:

# --- Перемещаем загруженый файл во временную папку --- #
$new_file_name = $this->GetNewFileName($upload["name"], $id_user);
$upload_path = $_SERVER['DOCUMENT_ROOT']."/images_tmp/".$new_file_name;
$moved = move_uploaded_file($upload["tmp_name"], $upload_path);
$upload["tmp_name"] = $upload_path;
# ----------------------------------------------------- #

Что здесь происходит? В первой строке генерируем имя нового файла, используя стандартную функцию движка – здесь ничего особенного. В массиве $upload хранятся данные по загруженному файлу. Далее собираем полный путь до временной директории в каталоге самого движка чтобы засунуть туда нашу картинку – после всех действий мы ее отсюда удалим. В третьей строке, с помощью стандартной пхп-шной функции переносим загруженный файл из общей папки серевера (например, /var/tmp) в нашу временную директорию. И последней строкой меняем в массиве полный путь с именем загруженного файла на новый, только что созданный. Делается это потому, что далее движок для всех своих действий (ресайза, создания картинок для предпросмотра, большой и маленькой аватарок) использует именно этот массив, и получается что теперь все действия производятся над файлом в локальной директории сайта, где он имеет полные права и может хозяйничать там как хочет. В теории, и во временной папке он имеет достаточные права – но вот как-то так.

После проделанных действий все заработало как надо. Осталось только после всех телодвижений движка удалить файл из временной директории:

# --- удаляем картинку из временной папки --- #
unlink($upload["tmp_name"]);
# ------------------------------------------- #

Готово, теперь картинки загружаются как надо, и временная директория не захламляется ненужными временными изображениями. Все просто :)

Учитесь разбираться в чужом коде – пригодится ;)

Кэш Яндекса, статистика LI и финт ушами

30 Август 2011

Привет. Пишу редко – времени совсем мало. А может просто лень-матушка :)

Хочу рассказать о ситуации, произошедшей на днях. Пусть это не «тема», но возможно кому-то будет полезно.

Есть у меня музыкальный сайт, с поиска идет порядка 1k посетителей в день. И вот, в очередной раз просматривая статистику LiveInternet и проверяя единичные запросы с удивлением обнаруживаю, что по одному из них Яндекс предлагает пользователю перейти на файл *.txt в одной из служебных директорий сайта. Надо сказать, что в robots.txt эта дира не была закрыта от ПСов, но и ссылок на нее нигде не было и не могло быть! Там лежат 2-3 txt-файлика, куда пишутся логи и запросы посетителей. А поскольку сайт музыкальный, то в один из файлов попадали названия треков и исполнителей. Вот эту сборную солянку и раскопал Яндекс, с удовольствием скушал и вываливал в результаты поиска по низкочастотным кеям. Причем, перейдя по этой ссылке, пользователь получал файл в 25 мегабайт, абсолютно никак не структурированный и не форматированный.

Во дела, подумал я. Ведь чел, заходя на сайт и видя такой бардак – сразу сбежит! Плюс к этому, я не знаю сколько таких людей попадает на сайт и скольких потенциальных посетителей я лишаюсь, т.к. кода статистики ЛИ там по просту нет, а с парсерами логов веб-сервера заморачиваться не хотелось.

Что я сделал? Первым делом закрыл директорию от индексации в robots.txt, а потом подумал – стоп! Траф есть – зачем его обрубать? Убрал запрет и сделал следующее…

В файле .htaccess прописал RewriteRule с этого txt-шника на файл с php-кодом. Далее, препарировал достаточно известный модуль для DLE «Переходы», вырезал из него код для определения поискового запроса, и если посетитель пришел с какой-либо поисковой системы – генерировал локальный адрес на сайт и редиректил посетителя туда, где он находил то что ему нужно.

Другими словами, если бы при запросе «Джигурда» ПС выдала ссылку на мой txt-шник и пользователь перешел бы по ней, то скрипт, перехватив поисковый запрос («Джигурда»), отправил бы посетителя на… адрес вида «http://site.ru/search/Djigurda».

Проверил – все работает. Следующий нюанс – если к нам забрел поисковый робот, а не посетитель с поиска – показываем ему содержимое txt-файла. Пусть думает, что все так и должно быть :)

И последний момент – надо же как-то собирать статистику. Т.к. на проекте установлен счетчик LiveInternet – то и сливать посещения нашего txt-шника надо ЛайвИнтернету. Смотрим исходный код счетчика:

<!--LiveInternet counter--><script type="text/javascript"><!--
new Image().src = "//counter.yadro.ru/hit?r"+
escape(document.referrer)+((typeof(screen)=="undefined")?"":
";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
";h"+escape(document.title.substring(0,80))+
";"+Math.random();//--></script><!--/LiveInternet-->

И переносим его на PHP:

$url = "http://site.ru/path_to_dir/txt_file.txt";

$li = "http://counter.yadro.ru/hit?q;r".urlencode($_SERVER["HTTP_REFERER"]).";s100*100*8;u".urlencode($url).";huniquequeries;0.".rand(999999999, 9999999999);

file_get_contents($li);

Разрешение экрана пользователя PHP определять не умеет, поэтому ставим 100х100 – проще будет отслеживать статистику. УРЛ страницы на первое время оставляем оригинальный – чтобы понять, много ли туда народу попадает. С курл’ом заморачиваться не было необходимости, поэтому обошлось малой кровью – file_get_contents(), благо на своем сервере можно делать все что хочешь. Для надежности все же сделал отдельно локальное логирование посещений.

Вот собственно и все. Заливаем файлы и ждем. В итоге за сутки в данный файл тыкнулось порядка 100 посетителей. Немного? 10% от дневного трафа. Файл стал самой частой точкой входа по статистике LI.

Вот такой вот эксперимент, возникший случайно и на ровном месте.  Экспериментируйте, находите нестандартные решения ;)

XML-RPC постинг через прокси

13 Май 2011

xmlrpc_proxy_wp

Всем алоха! Итак, сегодняшний пост я хочу полностью посвятить кодингу, но сначала немного предыстории.

Появилась у меня тут необходимость наполнить контентом большое количество блогов WPMU. WordPress Multiple User, если кто не в курсе. Постов эдак по 400-500 в каждый, с отложеной публикацией естественно :) Начал искать готовое решение, и в принципе нашел его. Им оказался класс для работы с WordPress блогами методом XML-RPC – WP-poster. Кстати, его автор – Charnad – уже свалил из Рашки, в Гермашку :D По коду возникли некоторые вопросы, пообщался с ним по аське – вполне адекватный человек, приятно было поговорить. Класс можно найти на его блоге, с разъяснениями и мануалом.

Так вот: wp-poster – это WordPress-обертка для другого класса – ixr_client, который и осуществляет все XML-RPC запросы. Скачав все это добро, покурив мануалы и заметки автора – я адаптировал скрипт под свои нужды. Однако чуть ли не в самый последний момент стрельнула мысль – а ведь нужно прикрутить прокси! А то как-то спамить в блоги, пусть и свои, да еще массово – это ж никакой хостер не выдержит и заблокирует IP! :)

Полез копаться в коде.. И о ужас! Для отсылки запросов ixr_client использует сокеты! :( Хочется отметить, что я привык юзать CURL, да и работа с проксями у него реализована проще. Немного поколдовав, класс был переписан под использование CURL вместо сокетов – и теперь можно было спокойно прикрутить прокси. Что я и сделал.

А нужно было всего-то переделать: метод query в классе IXR_Client. Я внес необходимые изменения и кусок кода, который отвечает за отправку запроса, принял следующий вид:

$ch = curl_init("http://".$this->server.$this->path);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$to = $this->timeout ? $this->timeout : 30;
curl_setopt($ch, CURLOPT_TIMEOUT, $to);
curl_setopt($ch, CURLOPT_USERAGENT, $this->useragent);
if (@$this->proxy) { curl_setopt($ch, CURLOPT_PROXY, $this->proxy); }
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$result = curl_exec($ch);
curl_close($ch);

Что тут делается, по порядку: 1) Инициализируем сессию curl с адресом  нашего блога; 2) включаем заголовки в ответ; 3) хотим в переменной видить «тело» ответа; 4) ответ будет возвращен в переменную, а не выведен юзеру на экран; 5) определяем таймаут запроса: установленный пользователем или 30 сек. по дефолту; 6) устанавливаем таймаут для запроса; 7) устанавливаем юзерагента; 8.) если используем прокси-сервер – устанавливаем его для текущей сессии; 9+10+11+12) устанавливаем доп.параметры для POST-запроса; 13) отправляем запрос и получаем ответ в переменную; 14) закрываем сессию curl.

Ну и метод для установки текущего прокси-сервера:

function SetProxy($proxy = false) {
$this->proxy = $proxy;
return true;
}

Вот в принципе и вся модификация, разве что  подправил обработку ошибок, объявление переменных и еще по мелочи. Ссылка на модифицированный класс – внизу страницы.

Далее, в самом скрипте была реализована «логика» постинга:

  1. перебираем все блоги;
  2. в каждый блог постим нужное кол-во новостей;
  3. если новость не удается разместить из-за текущего прокси-сервера – пытаемся еще N раз (у меня установлено 2 попытки). По достижению лимита прокси сервер сменяется на следующий из списка;
  4. если новость не удается отправить после M количества попыток – берется следующая новость, устанавливается новый прокси и все начинается с пункта 3 :)

Под мои нужды я установил N=2, M=5 – т.е. это будет работать так: установили прокси, отправили новость, если вернулась ошибка – отправляем второй раз. Если опять ошибка – меняем прокси, и пробуем отправить еще два раза. Снова ошибка – в третий раз меняем прокси на следующий по списку. Если и третий прокси-сервер вернул ошибку – пропускаем новость, берем следующую и начинаем все сначала.

Конечно же, как только новость отправлена и ошибки не возникает – скрипт переходит к размещению следующей новости, с тем же прокси-сервером.

Следует отметить, что этот класс поможет постить не только в WP-блоги, но и в другие, которые поддерживают технологию XML-RPC.

Вот так у меня получилось реализовать кросспостинг во множество блогов. Идеально для создания сетки сателитов. Осталось купить (или нарегать) фри-хостов и подобрать задержки для постинга (все таки у хостера нервы не железные). Возможно, придется реализовать постинг «в разброс»: т.е. постить не 1000 новостей в один блог, потом 1000 в следующий и т.д, а скажем одну новость – в первый блог, еще одну – в пятый, следующую в сотый, и т.д. пока все блоги не будут наполнены новостями. Также наверно придется прикручивать многопоточность – ибо блогов будет ну очень много, и пока все наполняться – состариться можно будет :) О результатах эксперимента отпишуть по завершении оного.

Ну и  конечно – ты можешь скачать получившийся у меня класс ixr_client c возможностью отправки запросов через прокси, используя библиотеку CURL.

А в это время: Ленивый забил на майский финстрип, Шакин пишет про Гугл и Адсенс, Терехов – про заинтересовавшую меня в последнее время внутреннюю оптимизацию, а Антон доделал сервис анализа сайтов – что я тоже давно хочу сделать, но все никак.. У меня же просел доход в сапе – Яндекс выкинул из индекса сателит в 15k страниц, но понемногу возвращает – я уж подумал что АГС, но нет – в прошлый Ап ЯВ вернулось 200 страниц, сегодня – уже 1000 в выдаче. Странный он какой-то. Купил несколько сайтов с ТИЦ – авось получится с ними что-нибудь :D Пробую раскрутить СДЛ через вконтакт – довольно интересное занятие. Живем :)

Скрипт массовой замены текста в файлах

12 Январь 2011

Сегодня я хочу поделиться с вами небольшими наработками скрипта, который производит массовую замену определенного текста в необходимых нам файлах. Итак, ближе к делу…

Понадобилось мне вчера создать фейковый сайт программерской конторы. Под свои нужды, не спрашивайте зачем :)

Залез в яндекс.каталог, подобрал небольшой, не самый популярный сайтец одной конторы, занимающейся разработкой ПО 1С и по совместительству делающей сайты, ну и всякое тому подобное… Читать полностью »

Кодинг – что было, есть и будет

20 Декабрь 2010

Хотелось бы немного рассказать о себе, чтобы посетители имели представление о том, кто я и чем занимаюсь.

Когда несколько лет назад я уволился с основной работы (как раз той, где я и постиг основы сео), надо было чем-то заниматься. Юношеский максимализм конечно же кричал: «Не работай на дядю! Работай на себя!». И я решил попробовать… Читать полностью »