За последние 24 часа нас посетили 20114 программистов и 1076 роботов. Сейчас ищет 751 программист ...

Как правильно сделать вывод страницы "технические работы"?

Тема в разделе "PHP для новичков", создана пользователем eldor, 8 янв 2016.

  1. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Подскажите, пожалуйста, как правильно сделать вывод страницы "технические работы"?

    У меня есть пару идей на этот счет:
    1. Т.к. у меня почти все данные хранятся в БД (mysql), то можно сделать одну таблицу, в которой будет один из столбцов выделен под параметр вывода страницы "технические работы" (к примеру при значении 1 перекидывать с любой другой страницы сайта с помощью refresh на страницу "технические работы", а при значении 0 - нет). Но меня смущает тот вариант, когда БД по каким-либо причинам может быть недоступна. И вот из-за этих смущений у меня появилась вторая идея.
    2. Принцип такой-же как и в первом варианте, только вместо БД использовать хранение значений в файле.
     
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Re: Как правильно сделать вывод страницы "технические работы

    В жсоне в файле. Или nosql. Redis, memcache ?
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    переключать виртуальный хост на заглушку, которая показывает "технические работы" не забывая сопроводить правильным статусом.
     
  4. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Как это правильно сделать? Я вот только смог сделать с помощью моей второй идеи. С помощью записи в файл 1 - вывод страницы "тех. работы" или 0 - страница "тех. работы" не выводится. А чтобы данный файл не мог читаться из браузера использовал.

    Код (PHP):
    1. <?php
    2.     //Проверка прохода не по прямой ссылке с помощью константы.
    3.     if(!defined('AAAA')) exit;
    4. ?>
    5. 1
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Re: Как правильно сделать вывод страницы "технические работы

    Нифиг база! Чем меньше зависимостей, тем лучше. Abyss, ты вообще вменяем?

    Как правило, сайт имеет единую точку входа. Ну или каждая из точек подключает один и тот же файл начальной инициализации. Поставь в его начало проверку «если в корне лежит файл maintenance.php, то подключить его и конец».

    Другой абсолютно рабочий вариант предложил Ганзал. Но чуйка мне подсказывает, что ты не управляешь этим хозяйством.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

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

    ну а если ты не управляешь и это массхостинг то естественно правильный вариант это некая переменная/константа в конфигурации и её проверка в точке входа. потому что конфигурацию движок читает на каждом запросе. и не надо городить никаких скуэлей, редисов и так далее. другой момент вытекает из того что это динамика: все статические ресурсы продолжат отдаваться веб-сервером так как он же их с диска читает и в душе не чает есть там технические работы или нет. и тут-то нас и могло выручить элитарное решение из пункта 1.

    Добавлено спустя 2 минуты 2 секунды:
    Re: Как правильно сделать вывод страницы "технические работы"?
    ну тоже знаешь ли накладно файловую систему дергать каждый раз.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Re: Как правильно сделать вывод страницы "технические работы

    Вот давай не будем оптимизировать это )))
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    не, ну конечно попробуем не оптимизировать)))) но знаниями же блеснуть надо)))
    что интересно еще никто не вспомнил что пользуется рерайтером и файлом .htaccess в котором можно написать всего одну строку чтоб закрыть нафиг весь виртуальный хост и со статикой и с динамикой без перезагрузки вебсервера (применимо же к апачи). эх вы)))
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Код (PHP):
    1. # на любой запрос выводим страницы /techwork.html
    2. RewriteRule ^.*/techwork.html
    так?
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    ну как ты наверное уже мог заметить у меня тут примерно уровень бога в рерайтере (да, я использую читы :D) поэтому я естественно могу взять и попросить тебя а прочитай-ка мне это правило слева-направо))))
     
  11. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Закрыть весь виртуальный хост мне не подходит, т.к. при технических работах нужно будет заходить в админку, которая находится на этом же хосте. Или хранение папки админки в корне сайта неправильно?

    Я подошел к данной проблеме так. К примеру есть файл "a.php", который содержит след. код:
    Код (PHP):
    1. <?php
    2.     //Проверка прохода не по прямой ссылке с помощью константы.
    3.     if(!defined('AAAA')) exit;
    4. ?>
    5. 1
    0 - перебрасываем со всех основных страниц на страницу "тех. работы".
    1 - не перебрасываем со всех основных страниц на страницу "тех. работы".

    Далее в каждой основной странице делаю след. проверку:
    Код (PHP):
    1.     $ar = file('a.php');
    2.     echo $ar[4];
    3.     if ($ar[4] == 1)
    4.     {
    5.         //Выводим контент данной страницы.
    6.     }
    7.     else
    8.     {
    9.         //Делаем переход на страницу "тех. работы".
    10.     }
    11.  
    А в админке (или в файлах cron) мы с помощью перезаписи в файл изменяем значение:
    Код (PHP):
    1.     //Запись в файл начала технических работ.
    2.     $filename = 'a.php';
    3.     $farr=file($filename);
    4.     $farr[4] = 0;
    5.     $f=fopen($filename,"w");
    6.     fwrite($f,implode("",$farr));
    7.     fclose($f);
    8.  
    9.     //или
    10.  
    11.     //Запись в файл окончания технических работ.
    12.     $filename = 'a.php';
    13.     $farr=file($filename);
    14.     $farr[4] = 1;
    15.     $f=fopen($filename,"w");
    16.     fwrite($f,implode("",$farr));
    17.     fclose($f);
    18.  
    Такой вариант подхода к данной задаче имеет место быть или нет?
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Re: Как правильно сделать вывод страницы "технические работы

    Ganzal, я это правило нагуглил за минуту). Вообще. получается она берет строку и заменяет соответственно регулярке
    И увидит страницу /techwork.html
    Вот у меня нет таких познаний, хотелось бы увидеть мастер класс как ты это делаешь.
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    ну я бы руки переломал за такой велосипед. ты размещаешь некоторое значение в пхп-файле но при этом вместо того чтоб дать пхп-машине работать с пхп-кодом так быстро как она это умеет - ты вдруг читаешь этот файл в массив. может тогда имеет смысл поместить этот файл в зип-архив и потом закинуть на другой хостинг и заходить туда по фтп? ну чтоб оверхед был не просто огромный а эпически огромный.
    достаточно сделать в тексте файла
    Код (PHP):
    1. <?php return 0; // или 1    
    и инклюдить. впрочем а нужно ли этот лишний файл если у тебя наверняка есть файл конфигурации?
    ну и такой момент как закрывать не весь сайт. ну тыж программист, аллё. чего сложного настроить заглушку на не-показ по твоему айпишнику? ну или по значению печеньки? или еще по каким-то данным которые знаешь только ты? а?

    Добавлено спустя 22 минуты 7 секунд:
    Re: Как правильно сделать вывод страницы "технические работы"?
    ну блин, нагуглил это нагуглил. но ты же сюда это выложил. значит и прочитать должен уметь.
    короче рассказываю тебе что у тебя тут написано:
    для любого ури попадающего под условие "начало-строки, далее ноль-и-более-любых-символов, далее конец-строки" заменить ури на слэш-течворк-дот-эйчтиэмэль.
    теперь внимание на моё самое первое сообщение в теме. я его процитирую и в своей саркастичной манере выделю одну очень важную мысль:
    дорогой мой mahmuzar, если ты напишешь так как ты написал то ты конечно будешь отдавать на любой запрос свою страницу-заглушку. но и в поисковом индексе твой сайт будет выглядеть как сотня-тысяча-миллион-миллиард (в зависимости от размера и популярности) одинаковых страниц-заглушек. просто потому что ты делаешь рерайт без изменения статуса ответа. значит апачи будет отдавать это со статусом 200. то есть как обычную страницу. а поисковая система в ответ на это может выкинуть тебя из поискового индекса как поисковый шум.

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

    теперь о том что я обосрался. да, я уже давно на своем хостинге не держу апачи (ну то есть держал последний год-полтора для багзиллы но за новогодние каникули поборол её глюки и теперь апачи мне не нужен) и соответственно знания постепенно притупляются. по сути только на этом форуме с задачками по рерайту и конфигурированию в целом вебсервера я их и держу в нагретом виде.
    так вот. скорее всего я ошибся в утверждении об одной строке. наверное их там надо три написать. первой - повесить обработку статуса 503 нашей заглушкой. второй - проверить что в данный момент не идет запроса к заглушке. человек может в адресной строке написать прямой адрес, а может запрос уже прошел первый рерайт и теперь уже идет повторная проверка после внутреннего перенаправления. ну и третьей строкой сделать собственно рерайт. между второй и третьей строкой можно дополнительно добавить условие на проверку айпишника или печеньки чтоб идентифицировать адмИна-всеЯ-сайтА.
    что-то типа:
    Код (PHP):
    1. ErrorDocument 503 /maint.html
    2. RewriteCond %{REQUEST_URI} !/maint\.html
    3. RewriteRule ^ /maint.html [R=503,L] 
    вернемся на секунду к твоему правилу: для любого ури попадающего под условие "начало-строки, далее ноль-и-более-любых символов, далее конец строки". обрати внимание как ловко я ссылаюсь только на начало строки. реально зачем тестировать этими символами, которых ноль и более, перед тем как достигается конец строки, если тебе эта информация вообще не нужна. ты бы еще в скобки запихнул - ^(.+)$ - тоже популярное решение. его отличие в том что рерайтер помимо собственно совпадения еще будет в памяти держать группу совпадения. а ты её нигде не используешь. опля!
    так что не надо нагружать сервер лишними вычислениями. я понимаю что сервер делает миллиарды операций в секунду, но вот сама стилистика кодирования, когда программист пишет или не пишет такие тонкие материи - отличает его от говнокодера.
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Re: Как правильно сделать вывод страницы "технические работы

    Ganzal, спасибо, добавил в копилку.
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    на этот счет нет никаких стандартов и правил. поэтому само по себе определение "правильно-не-правильно" невозможно. но как видим - вероятно не очень удобно. у моих клиентов админки сидят на поддоменах чтоб можно было выключать другие домены. плюс защита какая-никакая - кулхацкер может до посинения долбится во все эти вэпэ-админ, пма и так далее по списку - а их-то там просто и нет. плюс статика для админки показывается с другого поддомена - не влияет на статистику посещений и позволяет настроить приватность трафика. в общем кто как хочет так и дрочит :D
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Re: Как правильно сделать вывод страницы "технические работы

    Как по мне - это делать надо только через пахапе. В конфигах приложения заводим пунктик. При инициализации скрипта проверяем его. Если отмечен - выводим содержимое заглушки и отдаем клиенту 503 код, после чего весело убиваем скрипт.

    .хтаксесс - это очень круто, но на нджинксе не сработает. А завтра напишут еще десяток серверов - давайте и под их конфиги костыли писать? Лишняя зависимость приложения от среды исполнения. Как по мне, переносить функциональность приложения на сервер - это не совсем правильно. Сервер должен делать то, что положено серверу. Приложение - то, что положено приложению.
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    а по мне - не надо проверять на каждом запросе то что у тебя случается раз в месяц-год-век. это как раз не функциональность приложения а что-то чуть выше него. а выше - вебсервер. работает виртуальный хост и хрен бы с ним. то же относится и к файлу htaccess - не надо его оставлять юзеру если он меняется раз в год - вынеси его в конфиг виртуального хоста и пусть апачи комплириует это один раз при старте а не обрабатывает каждый раз при запросе.
    зайди в админку своего хостера, переключи домен и проводи работы. как закончишь - переключай обратно. хотя если честно я вообще не знаком с реалиями современного массхостинга. но судя по тому какие тут сообщения размещаются - не очень-то радостные. причем скорее всего от неготовности клиента заплатить за впс/вдс или просто банально на дружественном языке разговаривать с техсапом хостинга.
     
  18. dcc0

    dcc0 Активный пользователь

    С нами с:
    27 июн 2014
    Сообщения:
    209
    Симпатии:
    4
    Re: Как правильно сделать вывод страницы "технические работы

    Лучше диссертацию сразу писать по заглушке на сайте.
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    кстати, раз уж мы тут заговорили о таком произведении искусства как nginx то я тут вдруг соглашусь с Abyss. у меня на хостинге используется openresty и достаточно много логики переложено на lua. так вот, можно в redis, memcache или другой любимый инструмент положить ту саму переменную, на которую смотреть на этапе проверки доступа. и если эта переменная в нужном значении - показывать заглушку с правильным статусом. но стоит отметить что я - типа провайдер хостинга на впс-ках, а тут много бомжей, которые сидят на массхостинге и не могут вообще никак влиять на вебсервер, кроме как правилами htaccess. и тут же успокоимся что на массхостинге апачи еще очень популярен значит предложенные выше три строки - один из простых и универсальных вариантов. для массхостинга. раз вы все равно включаете рерайтер для "заворота" запросов на свой index.php то нет ничего страшного в том что вы добавите лишнее правило на время проведения сервисных работ. а потом удалите. изи же.

    Добавлено спустя 25 минут 17 секунд:
    Re: Как правильно сделать вывод страницы "технические работы"?
    кстати, я тут вспомнил что много лет назад описывал интересный способ не просто держания админки на субдомене а еще и защиты его через рерайтер. ссыль - http://ganzal.livejournal.com/23550.html - на радость mahmuzar'y я тогда еще был говнокодером поэтому все рерайртрулы написаны как (.*), хотя нужно учитывать что моё говнокодерство не в том заключалось - я просто не хотел использовать переменную REQUEST_URI а задавал именно переменную окружения. поэтому там надо было не просто совпадением ловить а создавать группу захвата. ну а флаг NC там вообще везде лишний - .* матчит все символы а не какие-то конкретные наборы вроде a-z поэтому не обязательно отключать проверку регистра.
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Re: Как правильно сделать вывод страницы "технические работы

    Приятно почитать умных людей. Но, в общем случае, моё предложение самое клёвое. Оно не накладывает никаких доп. требований к хостингу и к квалификации "вебмастера".

    Накреативил страничку "сайт на обслуживании" как она должна выглядеть для посетителя (включая статус и что угодно). Когда нужно бросил её на хостинг и готово. По окончании удалил файл и снова радуешся.
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    я же уже с тобой согласился)))) если единая точка и прячем только динамику - переменная в конфиге и всё. если прятать весь хост - хтаксес. если не бомж и с вдс - переключать виртуальный хост.
     
  22. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Примерно таким образом?
    Код (PHP):
    1. $filename = 'a.php';
    2.  
    3. if (!file_exists($filename))
    4.     {
    5.         //Если файл $filename не существует, то заносим контент страницы.
    6.     }
    7. ...
    8. <html>
    9.     <head>
    10.         if (file_exists($filename))
    11.         {
    12.             //Если файл $filename существует, то перекидываем на него пользователя.
    13.             echo '<meta http-equiv="refresh" content="0; URL=http://www.xxx.ru/a.php">';
    14.             exit;
    15.         }
    16. ...
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Re: Как правильно сделать вывод страницы "технические работы

    не надо искать файл в файловой системе. это лишняя нагрузка. есть некоторый файл конфигурации - просто сделать в нем дополнительное значение отвечающее за закрытие сайта. и всё.
     
  24. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Re: Как правильно сделать вывод страницы "технические работы

    Ммм... Что это за файл? Я его сам должен сделать для настроек или есть какой-то системный наподобие .htaccess?
     
  25. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    у меня индексный файл такой
    Код (PHP):
    1. <?php
    2. function __autoload($name) {
    3.     include "./" . $name . ".php";
    4. }
    5.  
    6. $controller = new mahmuzar\controller\Controller();
    7. $controller->run();
    eldor, это и есть единая точка входа.
    Закомментитровать две строчки и инклуд нужной странитцы и все, вот тебе и тех работы.