Семеро одного ждут, или как работают сессии в PHP
Сессии в PHP - вещь замечательная, она позволяет ускорить многие вещи на сайте, например, при выполнении долгих запросов к базе данных их можно записать в сессию и затем полученные значения сохранять в сессию и использовать по мере необходимости, однако, у сессий есть одно свойство, которое может гарантированно свести на нет все попытки увеличить быстродействие вашего сайта. Дело в том, что сессии в PHP блокируют ВСЕ страницы загружаемые для текущего пользователя до тех пор, пока страница, которая перавая успела заблокировть сессию не будет выгружена из памяти сервера. Т.е. если имеем одну медленную страницу с открытой сессией, которая выполняется, скажем, десять секунд - то в течении этих десяти секунд ВСЕ параллельно загружаемые странички будут блокированы и будут ждать пока медленная страница не будет сгенерирована до конца и выгружена и памяти.
В качестве примера, создадим две странички:
slow.php
<?php print 'START....'; sleep(10); print 'DONE';
fast.php:
<?php print 'START....'; print 'DONE';
как видим обе странички работают вместе просто прекрасно, пока одна страничка генерируется десять секунд вторая загружается почти мгновенно, теперь добавим в обе страницы работу с сессиям:
slow.php
<?php
session_start();
print 'START....';
if (!isset($_SESSION['counter'])){
$_SESSION['counter'] = 0;
}
else {
$_SESSION['counter']++;
}
sleep(10);
print 'DONE';
fast.php:
<?php session_start(); print 'START....'; print isset($_SESSION['counter'])?$_SESSION['counter']:'none'; print 'DONE';
Все попались, теперь, пока медленная страничка не завершиться, быстрая страничка будет ее ждать, т.к. файл с сессией остался заблокирован медленной страницей.
Одним из вариантов для решения подобной проблемы можно вызвать session_write_close(); перед заведомо медленной процедурой. В этом случае сессия будет закрыта досрочно и блокировка с файла будет снята, правда изменять какие либо значения в сессионных переменных уже не получится.
Финальный вариант slow.php:
<?php
session_start();
print 'START....';
if (!isset($_SESSION['counter'])){
$_SESSION['counter'] = 0;
}
else {
$_SESSION['counter']++;
}
session_write_close();
sleep(10);
print 'DONE';
В большинстве случаев это должно помочь. К счастью, каждый пользователь имеет собственную сессию и других пользователей медленная страница блокировать не будет. Но все равно, при работе с сессиям нужно учитывать возможности блокировки и по возможности их избегать.
Upd: Кроме этого, если после долгой операции нужно еще что нибудь поменять можно перед долгой операцией сначала закрыть сессию при помощи session_write_close() а потом её снова открыть при помощи session_start(). Однако, делать это можно только если вы ничего ещё не начали выводить в поток, иначе будет известный Warning: Headers already sent....
Как изменить внешний вид кнопки FB Connect
Есть несколько способов:
Способ 1 (правильный). Зайти на сайт разработчиков и прочитать инструкцию.
Способ 2 (ленивый). Поискать в Интернет как это делают другие.
Способ 3 (сверхленивый). Взять стандартную кнопку и допилить её CSS модификаторами:
.fb_button_medium {
float:left;
width:234px !important;
height:42px !important;
background:url(../image/layout/homepage-facebook-main.png) no-repeat 0 0 !important;
}
.fb_button_text {
display:none !important;
}
New York Times in HTML5
Нью-Йорк Таймс сделали online версию своей газеты на HTML5, однако, действительно, удобная штука получилась, как будто читаешь реальную газету. Нужно будет присмотреться повнимательнее к этой технологии.
Как добавить/удалить несколько файлов в/из svn
добавляем:
svn status | grep "^?" | awk '{print $2}' | xargs svn add
теперь удаляем из svn те файлы что были удалены из файловой системы:
svn status | grep "^\!" | awk '{print $2}' | xargs svn remove
