Как лучше изменять php-файлы на рабочем проекте?

Имеется сайт, на котором, одновременно сидят, например 100 чел.
Задача, - изменить некоторые скрипты php так, что бы в момент откачки данного файла на сервер, у пользователя, который как раз в этот же момент открывал сайт - не вылетел Fatal error.
Подскажите пожалуйста, какие варианты выполнения данной задачи есть и в какую сторону лучше всего копать...
Спасибо.

UPD. Основная проблема в том, что файл откачивается например через FTP Notepad++, и частенько (я смотрю по логам) люди попадают на Fatal error, т.к. изменяются файлы, ядра CMS...
При этом, если изменить файл, условно, через Upload php (файл-менеджер CMS) данной проблемы - не возникает...
Вот я и думаю, может для (S)FTP-сервера есть какие-то примочки, которые скажем, буферизируют файл до полной его загрузки на сервер, а затем уже заменяют им конечный файл?
  • Вопрос задан
  • 518 просмотров
Решения вопроса 1
@xtreme
Снимаю порчу по SSH :)
Когда заливаете через CMS, файл по сути заливается во временный файл, а затем происходит move, который, в случае, если временный файл и целевой находятся на одном разделе файловой системы является атомарным (т.е. либо в один момент времени это старый файл, либо новый), либо, если происходит move между разделами - все равно происходит очень быстро.
В случае, когда вы заливаете по ftp - сначала удаляется старый файл, т.е. он становится недоступным, а затем уже начинает подливаться новый. В этот момент и происходит "лажа".
Выходов несколько:
- про первый (не сказал бы, что он очень простой, но все равно довольно эффективный), вам уже написал D' Normalization во втором пункте.
- второй - разливать файлы не по фтп, а, допустим, с помощью rsync из некоей директории, куда вы уже заливаете по ftp. То бишь - залили, проверили, что ничего больше заливать не надо - запустили на сервере rsync из этой директории в продакшн. rsync также копирует различающиеся файлы сначала во временный файл, а затем "мувит" на постоянное место.
- третий - может быть с косяками, использовать, например, opcache в PHP и выставить в параметрах opcache не трогать файл, пока он не состарится, например, на несколько секунд. Секунды определяются эмпирически, в зависимости от скорости вашей заливки.
- четвертый... а фиг знает, придумать можно много всего. Например, хранить файлы в SVN или GIT-репозитории, и по commit/push запускать post-hook, который, например, будет синхронизировать файлы тем же rsync или использовать какой-нибудь Jenkins... масса вариантов, главное не трогать самому файлы продакшна.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
Denormalization
@Denormalization
Ой насоветовали..
Существует 2 простых варианта апдейта:
1) Вешаем плашку "Усё пропало. Мы на ремонте.", и пока пользователи в шоке - делаем апгрейд.
2) Учимся использовать симлинки. В соседней папке разворачиваем обновленный проект, и ловким движением руки переключаем симлинк на другую папку.

Если есть много всяких "страшных" способов, но эти два наиболее просты и эффективны.
Ответ написан
Комментировать
MetaDone
@MetaDone
Хорошо сформулированный вопрос - 50% решения
пользователь такого даже не заметит, если конечно у вас файл размером не несколько гигов. Если так - заливайте когда никого нет, и не выводите ошибки на сайте, а пишите их в логи. Пользователь вообще не должен подозревать что сайт может выдавать ошибки.
Если уж совсем необходимо - повесьте табличку "сайт на обслуживании", залейте все нужное и уберите табличку и не делайте проблем на пустом месте
Ответ написан
Комментировать
@galsik
Это можно сделать через управление буфером вывода, php есть такие встроенные функции но если ты задаешь такие вопросы для тебя это будет сложно.
Ответ написан
Я не думаю что это как-то возможно. Конечно, у меня есть предположения:
1. Надо отключить доступ к этому файлу, то есть чтобы обычный пользователь не мог зайти на него, только те, кто пишет скрипты(как вариант: убрать ссылки везде на него, а можно и вовсе подгружать другой документ типа 404 ошибки - такой страницы не существует или же 503 ошибки - страница находится в разработке).
2. Этот способ уже более актуальный - создать на хостинге тестовый домен и именно на этом тестовом домене проводить свои "эксперименты". Как итог получается - вы не трогаете основной сайт, пользователь фаталов ваших не видит но и сайт успешно обновляет файлы, которые вы закинете в случае успеха ваших экспериментов.

НО: если вы просите чтобы именно на этом сайте было и чтобы именно на этой странице было, то тогда подсказать не могу. Так как в любом случае, если Вы ошибетесь где-то и выскочит фатал - вы будете знать в чем ошибка. А отключать это чтобы пользователь не видел и при этом чтобы он видел нормальную страницу - мне кажется невозможно. Ошибки на то и ошибки чтоб вы видели где вы допустили оплошность.
Ответ написан
bigton
@bigton
Web-программист
Вероятность того что один из 100 человек попадет на "белый экран" когда вы будите перезаливать скрипты очень низкая, так что можете не беспокоиться. И можете добавить страницу ошибок типа "Ой! Что-то пошло не так, перезагрузите страницу".
Ответ написан
Комментировать
Залить архивом, на сервере распаковать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы