Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Как в PHP приостановить выдачу контента на время?
цитата
07/05/08 в 18:54
 Proo
Вот напр если апдейчу базу, не хотелось бы чтобы запросы были.. все сайты соответсвенно что на этой базе хочу заблокировать..

в начале файла думаю добавить что то вроде

if ($db_update) {
выдай сообщение и прекрати поток.
}

Т.е. не хочется else добавлять, чтоб весь html код был в скобках, т.е.


if ($db_update) {

} else {

...
<html></html>
..

}



Такое возможно? Или еще какой более хитрый подход есть? icon_smile.gif
цитата
07/05/08 в 18:57
 dejavu
а если:
Код:

if ($db_update) {
выдай сообщение и прекрати поток.
exit();
}
цитата
07/05/08 в 19:02
 fil
Еще короче
Код:
if($db_update)
    die('closed for maintenance and upgrades');
цитата
07/05/08 в 19:12
 xyrib
для этого есть ob_start но как то кривоватенько ты придумал, используй шаблоны и не будет в коде куча хтмл.
цитата
07/05/08 в 19:16
 Proo


Ну уж как придумал icon_smile.gif Вообще спасибо всем.. шаблоны же тоже надо как то подключить, подумаю..
цитата
07/05/08 в 19:37
 Corex
Не обязательно убивать все запросы и показывать пустые страницы с ошибкой, можно поиграться с LOCK TABLE в MySQL. И, возможно, апдейт базы не будет мешать выборкам.
цитата
07/05/08 в 20:19
 Proo
возможно, я потом проконсультируюсь с суппортом, но как на крайний случай надо иметь наверно..
цитата
07/05/08 в 23:28
 Pentarh
С рута в мускуле (в консоли очень желательно)

> FLUSH TABLES WITH READ LOCK;

И все. Отрабатываются последние запросы и все базы глобально локаются.
При этом, терминал не закрывать, из утилиты mysql не выходить. Там же делаем нужные административные телодвижения. В этот момент все приходящие запросы стоят в очереди со статусом "Locked" и ждут пока ты разлочишь базу. Лучше ДО этого подтюнить max_used_connections, чтобы сервер от размера очереди не помер.

Теперь в том же терминале делаем

> UNLOCK TABLES;

Все разлочивается, база работает дальше. В момент лока можно даже снимать физический дамп баз майскула.

А чтобы пых-пых корректно реагировал на эту ситуацию, надо
1. подтюнить таймаут коннекта с мускулем. Он по дефалту 60 секунд в пхп.ини Я бы его заменил на 20. Чтобы апач от ожидающих чайлдов не обосрался.
2.
Код:
$c=@mysql_connect($host,$user,$pass);
if (!is_resource($c)) {
if (mysql_errno()=={Номер ошибки "Too many connections"})
die ("Site is under maintenace, sorry");
else
die ("Could not connect to server");
}
цитата
07/05/08 в 23:40
 Pentarh
пс. про всякие тюнинги это я написал если сервер более-менее нагружен. а если не большая нагрузка, а операции с базой простые и короткие, то можно просто тупо лок - работа - анлок.
цитата
08/05/08 в 02:22
 xreload
Запросы к базе занаимают миллисекунды, что там так апдейтишь, что нужно это блокировать?
в 99% случаев, не нужно нечего, если ты грамотно продумал апдейт.

Мое имхо, проблема высосана из пальца.
цитата
08/05/08 в 17:27
 Proo
Спасибо за подробные объяснения, и за "васосана".. icon_smile.gif

Я на всякий случай, говорю же, надо смотреть в будущее, вдруг БД будет потом очень большая icon_smile.gif
цитата
08/05/08 в 23:02
 Cibtor
Proo писал:

Т.е. не хочется else добавлять, чтоб весь html код был в скобках, т.е.


if ($db_update) {

} else {

...
<html></html>
..

}

Как вариант:
Код:
if ($db_update) {
 
} else <<<HTML
...
<html></html>
..
HTML;
цитата
09/05/08 в 01:18
 Proo
всех оценил, всем спасибо! icon_smile.gif


Эта страница в полной версии