Архив рубрики: Разработка

Что делать с доменом .рф?

— Но что-нибудь ведь надо же с ними делать!

Д. Хармс

Если у вас есть домен .рф и вы не знаете, как его использовать, кроме редиректа на основной адрес — отдавайте через него статику! Все равно для этого обычно покупается отдельный домен, ибо куки, выставленные на domain.com, распространяются и на все поддомены (и это не лечится, если только вы не хотите иметь основным адресом www.domain.com).

Здесь ставлю ссылку на webo.in в благодарность Н. Мациевскому, книга которого «Методы клиентской оптимизации веб-страниц» и меня кое-чему научила.

URL как ключ массива в PHP

Видимо, что-то не так с использованием URL в качестве ключа массива в PHP — это вопреки часто встречающемуся мнению, что любую разрешенную строку можно использовать как ключ. Нет времени разбираться, но у меня при этом вываливается «PHP Warning:  Illegal offset type in isset or empty» (PHP 5.4.21).

Решено простейшим образом: не $array[$url], а $array[md5($url)].

Тормоза Facebook API

Facebook API оказался нереально медленным. Сидя в России, конечно, чувствуешь, как немного медленнее, чем хотелось бы, Фейсбук работает для пользователя, но вот его API просто побил все рекорды. Я забираю сопоставимый набор информации из ВКонтакте и из Фейсбука. В обоих случаях есть возможность объединить несколько запросов в один. Про VK уже писал, и там информация немного устарела — теперь выполняется не два запроса, а один составной, в среднем за 0,15...0,2 с. С Фейсбуком получается 2...2,5 с, что совершенно неприемлемо. Мне и полсекунды много, а тут две. Даже когда запускаешь какой-нибудь FQL-запрос в Graph API Explorer, видно, как мучительно он соображает.

Тяжеловесно, да.

На этот момент получается, что Фейсбук задерживает все остальное, так как сначала генерится страница целиком и только потом отдается пользователю. Нужно переводить все это дело на AJAX, но тогда, на первый взгляд, придется запускать несколько параллельных запросов, что усложняет схему. Пока думаю. И еще неясно, как это будет выглядеть на мобильных.

Лечение тормозов при обращении к API внешних сервисов

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

Очень просто и некрасиво замерить временные интервалы в PHP можно так. Можно грубо оценить, что выполняется быстро, что — медленно; понять порядок величин.

В моем случае работа с API ВКонтакте состояла из 5 обращений к нему, что в сумме занимало (в среднем) почти 0,5 с. Если скорость загрузки страницы критически важна, это очень много. К счастью, у них в API есть замечательный метод execute, позволяющий не только объединять несколько запросов в один, но и использовать промежуточные результаты, не загружая их к себе (там несложный скриптовый язык). Сокращение 5 обращений до 2 дало двукратный выигрыш в скорости.

Шаблонизатор на XML/XSLT: нет пути?

На прошлой неделе убил, наверное, целый день на то, чтобы сделать специфический шаблонизатор на XML/XSLT (сам проект на PHP). Все красиво и замечательно, но вот проблема: когда мы включаем содержимое внешнего файла конструкцией вида

<xsl:copy-of select="document('/include/something.html')" />,

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

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

В итоге отказался от этой затеи, сами страницы оставил в XML, а шаблоны — классика, HTML с примесью PHP. Загружаю XML в DOMDocument и едем.

Кэширование форм в Firefox и autocomplete

Из разряда «каждый день узнаешь что-то новое». В Firefox (и, возможно, в других браузерах) применяется агрессивное кэширование форм. После обновления страницы, даже если она действительно обновилась, а не была взята из кэша, браузер восстанавливает значения элементов, установленные или введенные пользователем. Это относится, например, к состоянию чекбоксов — на этом месте я и задумался. Получается, что страницу мы перегенерировали, состояние чекбоксов указали (checked="checked" или пустое), но браузер расставил галочки так, как они стояли до перезагрузки.

В интернете имеют хождение два решения.

  1. Отправлять заголовок Cache-Control: no-store — попробовал, не сработало. По крайней мере, на Firefox 23.0.1. В принципе, логично, ведь к кэшированию страниц это не имеет прямого отношения, это «фича».
  2. Указывать  autocomplete="off"внутри тега <form> — сработало. Да, это не валидный XHTML, но это помогает. Можно указывать не для всей формы, а для конкретных ее элементов. Еще кое-что интересное, в том числе про валидацию, есть в статье «Отключайте autocomplete».