Клиент серверное приложение php

Делаем вебсокеты на PHP с нуля

Некоторое время назад я выбирал библиотеку для работы с вебсокетами. На просторах интернета я натыкался на статьи по интеграции node.js с yii, а почти все статьи о вебсокетах на хабре ограничивались инструкциями к тому, как использовать phpdaemon.

Я изучал библиотеки phpdaemon и ratchet, они достаточно монструозны (причём используя ratchet для отправки сообщения конкретному пользователю рекомендовано дополнительно использовать wamp). Мне не совсем было понятно для чего использовать таких монстров, которые требуют установку других монстров. Почитав исходники этих, а также других библиотек, я разобрался как всё устроено и мне захотелось написать простой вебсокет-сервер на php самостоятельно. Это помогло мне закрепить изученный материал и наткнуться на некоторые подводные камни, о которых я не имел представления.

Так я решил написать необходимый для меня функционал с нуля.

Получившийся код и ссылка на демонстрационный чат в конце статьи.

Поставленные цели:

1) разобраться с серверными сокетами в php
2) разобраться с протоколом вебсокетов
3) написать с нуля простой сервер вебсокетов

1) Серверные сокеты в php

До этого момента я имел смутные представления о серверных сокетах. Почитав исходники нескольких библиотек для работы с вебсокетами я столкнулся с двумя схемами их реализаций:

используя расширение php «socket»:

или используя расширение php «stream»:

Я предпочёл второй вариант ввиду его краткости.

Итак, мы создали серверный сокет и теперь хотим обрабатывать новые соединения к нему, для этого опять же есть два варианта

или с использованием stream_select

Т.к. нам в дальнейшем нужно будет одновременно обрабатывать и серверный сокет на предмет новых соединений, и уже существующие подключения, на предмет новых сообщений, то остановимся на втором варианте.

2) Протокол вебсокетов

«Рукопожатие» или handshake:

Считываем значение Sec-WebSocket-Key из пришедшего заголовка от клиента, рассчитываем на его основе Sec-WebSocket-Accept и отправляем итоговый ответ:

обмен сообщениями

Простой сервер вебсокетов

Итак, у нас есть вся необходимая информация.
Используя код простого http сервера из первой части, а также функции handshake, decode и encode из второй мы можем собрать простой сервер вебсокетов.

В приведённом примере можно менять пользовательские сценарии onOpen, onClose и onMessage для реализации необходимого функционала.

Поставленные цели достигнуты.
Если этот материал вам покажется интересным, то в следующей статье я опишу как можно запускать несколько процессов для обработки соединений (один мастер и несколько воркеров), межпроцессное взаимодействие, интеграцию с вашим фреймворком на примере компонента yii.

Источник

Простой клиент-сервер на Android (интернет-мессенджер)

Важно. Все написанное ниже не представляет собой какой либо ценности для профессионалов, но может служит полезным примером для начинающих Android разработчиков! В коде старался все действия комментировать и логировать.

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

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Уделим внимание каждому элементу и отметим:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Клиент, установленный на устройстве А, посылает сообщение для клиента, установленного на устройстве Б. И наоборот. Сервер играет роль связующего звена между устройством А и Б… С, Д… и т.д. Также он играет роль «накопителя» сообщений, для их восстановления, на случай удаления на одном из клиентских устройств.

Для хранения сообщений используем SQL БД как на сервере, так и на устройствах-клиентах (в принципе, вся работа клиентов интернет-мессенджеров и сводится к постоянной синхронизации локальной и удаленной БД с сообщениями). Дополнительно, наш интернет-чат будет уметь стартовать вместе с запуском устройства и работать в фоне. Взаимодействие будет происходить путем HTTP запросов и JSON ответов.

Более логично, если синхронизация происходит через порт/сокет, это с одной стороны упрощает задачу (не нужно циклично слать HTTP запросы на проверку новых сообщений, достаточно проверять состояние прослушиваемого сокета), но с другой стороны, это усложняет создание серверной части приложения.

Делаем сервер

Для реализации «сервера», нам нужно зарегистрироваться на любом хостинге, который дает возможность работы с SQL и PHP.

Создаем пустую SQL БД, в ней создаем таблицу.

Структура запросов к api:

Клиентская часть

Теперь структура Android приложения:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

В фоне работает FoneService.java, который, в отдельном потоке, каждые 15 секунд делает запрос на сервер. Если ответ сервера содержит новые сообщения, FoneService.java записывает их в локальную БД и отправляет сообщение ChatActivity.java о необходимости обновить ListView, с сообщениями. ChatActivity.java (если она в этот момент открыта) получает сообщение и обновляет содержимое ListView из локальной БД.

Отправка нового сообщения из ChatActivity.java происходит сразу на сервер, минуя FoneService.java. При этом наше сообщение НЕ записывается в локальную БД! Там оно появится только после получения его назад в виде ответа сервера. Такую реализацию я использовал в связи с важным нюансом работы любого интернет-чата — обязательной группировкой сообщений по времени. Если не использовать группировку по времени, будет нарушена последовательность сообщений. Учитывая, что клиентские приложения просто физически не могут быть синхронизированы с точностью до миллисекунд, а возможно будут работать даже в разных часовых поясах, логичнее всего будет использовать время сервера. Так мы и делаем.

Создавая новое сообщение, мы передаем запросом на сервер: имя автора сообщения, имя получателя сообщения, текст сообщения. Получая эту запись назад, в виде ответа сервера, мы получаем то, что отправляли + четвертый параметр: время получения сообщения сервером.

Источник

Клиент-серверная работа с табличными данными для начинающих

Вместо начала.

Недавно пришлось заняться написанием приложения по работе. Раньше работал исключительно с PHP и web-мордами, однако быо требование сделать полноценное windows-приложение с авторизацией, использованием forms и прочей «петрушки». Эту статью я пишу на отвлеченном абстрактном примере с целью сделать ман доступным и простым. Собственно, здесь важен сам ход действий, нежели само приложение.

Задача была без веб-интерфейса работать с табличными данными, получаемыми с сервера. Доступные инструменты: web-сервер Apache + PHP + MySQL и C#-приложение на стороне клиента.

Профессионалам вряд ли будет интересно. А вот новичкам, мне кажется, может пригодиться. Очень надеюсь, что я не перемудрил с воплощением идеи.
Кому интересна реализация связки — прошу под кат.

Для начала опишу часть кода, которая обеспечивает обмен данными с сервером, а также работу со строками в отправляемых и получаемых сообщениях.
У меня это реализовано в готовых классах, но здесь я приведу лишь нужные методы, а не целиком листинги всех классов.

Клиент, напомню, пишется на языке C#. От WPF пришлось отказаться, т. к. в нашей конторе больше жалуют стандартный вариант с Windows Forms. Серверная часть создавалась на PHP, ибо это просто оказалось быстрее, чем писать полноценный CGI-клиент под Mono Complete, хотя в будущем планируется отказываться от «пыхи» PHP в пользу писанного на C# демона.

Хочу сказать, что это мой первый опыт работы с VisualStudio (использую VS2013 c ReSharper) и C#. Потому если где-то можно было сделать удобнее, не судите строго — с удовольствием почитаю комментарии и учту в дальнейших своих разработках.

Шифрование данных

За основу взят формат Base-64 из-за своей универсальности на различных платформах.

Запрос к серверу

Для работы потребуется библиотека «Newtonsoft.Json«. Добавьте ее в References проекта, иначе не будет работать. Сразу хочу отметить, что сервер работает под управлением Debian Squeeze и везде используется кодировка UTF-8. Потому в коде предусмотрены строки для совместимости. Никому не хочется кракозябр в гуе. Комментировать такой код по ходу не вижу смысла — он очевиден.

Теперь перейдем к основной теме статьи.
Давайте рассмотрим на примере бесполезной таблицы контактов.

Поля (заголовки столбцов) таблицы пусть будут следующими:

Для начала опишу часть на PHP (серверная сторона).

В общих чертах. Здесь мы подключаемся к базе данных, получаем нужные данные (используется PDO) и формируем ответ в виде массива. Если записи отсутствуют, возвращаем сообщение об ошибке.

Массив с данными имеет формат:

Array[
0 => array[«Id» => «значение», «Title» => «значение», «PhoneNumber» => «значение», «Email» => «значение», «Messengers» => «значение»],
1 => array[«Id» => «значение», «Title» => «значение», «PhoneNumber» => «значение», «Email» => «значение», «Messengers» => «значение»],

N => array[«Id» => «значение», «Title» => «значение», «PhoneNumber» => «значение», «Email» => «значение», «Messengers» => «значение»]
]

В дальнейшем считаю такую форму наиболее удобной для работы с базами данных и наборами двумерных данных вида «ключ — значение».

Обмен данных происходит по протоколу HTTP, потому достаточно обычного вывода «на экран» полученных данных и завершения работы скрипта.
Значение каждого поля кодируется в Base-64 формат, а весь массив данных преобразуется в JSON-формат и снова кодируется в Base-64. Достаточно безопасно и удобно для разбора в клиентской части приложения.

Теперь разберем сторону клиента.

Я использовал сочетание компонентов dataSet и dataGridView.

На форме есть два (для начала) компонента: dataSetContactsTable, dataGridViewContactsTable.

Советую сразу давать всем компонентам понятные имена — иначе потом такая каша в коде начнется, что проще написать софтину заново, нежели ее отрефакторить.

При добавлении компонента dataSet я выбрал вариант «Нетипизированный набор данных».
Теперь настроим компонент dataSet. В свойствах я установил ему:

Жмем кнопочку «Добавить» и настраиваем созданную таблицу. Вот те параметры, которые я установил:

Колонки таблицы должны соответствовать прилетающим с сервера данным. Потому, было сделано так:

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

Переходим к настройке компонента dataGrid. И сначала опишу те изменения в свойствах, которые я сделал для него.

Видимо, не имеет смысла описывать дизайнерскую часть конфига — у каждого она может быть своя. Коснусь только вопроса колонок и привязки к компоненту dataSet.

Все поля таблицы, кроме ID записи, должны отображаться пользователю приложения. Потому поле Id — единственное, у которого установлен параметр «Visible» в значение «False». В остальном настройки похожи.

Всё. Работа мышкой завершена, теперь можно перейти к коду.

Для дальнейшей работы сразу создадим класс, который поможет нам в разборе JSON-массива, прилетающего с сервера.

Теперь необходимо создать метод, очищающий и заново загружающий данные в таблицу на форме (он уже упоминался выше в коде FormContacts_Load).

Вот, в принципе, и всё. При всех удачных условиях (есть сервер, написан обработчик для запроса, есть ответ от сервера, есть данные в базе) на форме отобразятся данные, которые нам необходимы.

По аналогичному принципу можно построить любое другое табличное приложение. Вроде, всё. Надеюсь, что ничего не забыл описать и что материал описан достаточно доступно и просто.

Источник

Клиент-серверная архитектура в картинках

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Знакомая картинка? А вы ведь постоянно сталкиваетесь с этой архитектурой — когда покупаете билет в кино онлайн, бронируете путевку на море или записываетесь к врачу.

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

Об этом я и расскажу в статье. Объясню на пальцах, с примерами и забавными картинками =) Если вы больше любите видео-формат, можно посмотреть мой ролик на youtube на ту же тему.

Содержание

Что это и как работает

Вот есть у нас некий Вася, который решил купить машину. Такую, как в рекламе — быструю, мощную, красивую! Только стоит она как хвост самолета, у Васи таких денег нет.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Конечно, Вася может подкопить несколько лет, а потом уже покупать машину. Но ведь хочется здесь и сейчас! Да и средство передвижения нужно…

А еще Вася не умеет копить — получил зарплату, закупился основным, оплатил жилье, всё! Остальное можно потратить. Для таких людей есть банки, куда можно прийти и взять деньги в кредит.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

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

Вася подумал, прикинул и сказал:

— Да, хочу именно так! 100 рублей с зарплаты платить в банк могу, а откладывать — нет. Потрачу.

Поэтому Вася идет в банк и говорит:

— Я Василий Иванов, хочу автокредит на 1000р.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

У Кати есть специальная программа для проверки данных по клиентам. Эта программа может быть как web, так и desktop:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Катя вбивает в программу «Василий Иванов» и получает информацию по клиенту — есть ли он в черных списках? Была ли кредитная история раньше? И так далее. Но что происходит в потрохах приложения?

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Катя ввела данные на клиенте. Но когда она нажала «проверить», клиент отправил запрос на сервер:

— Дай мне информацию по Васе Иванову!

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Сервер отправил запрос в БД, базу данных:

— Select * from clients where fio = ‘Василий Иванов’. (Дай мне всю информацию по ФИО ‘Василий Иванов’)

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

— Вот тебе все, что нашла.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Сервер вернул эту информацию клиенту:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

А клиент уже отрисовал ее для Кати:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

— Ага, кредитная история хорошая.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

И делает предложение Васе:

— Пожалуйста, если хотите взять кредит, то мы готовы выделить 1000р на 12 лет под 80% годовых. Устроит?

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

— Да, меня всё устраивает, давайте скорее деньги, и я побежал за машиной!
Все счастливы, все довольны.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Катя даже не догадывается, какой путь проделали данные в программе, когда она вбила туда ФИО своего клиента. Но мы с вами должны узнать, что же это за путь такой? И к чему все эти сложности? Почему именно такая структура? Почему есть клиент, почему есть сервер?

Зачем нужен клиент

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

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Зачем нужен сервер

Клиентов может быть много. В примере с банком у нас может быть по 10 отделений в 10 городах России, а в каждом отделении по 10 операционисток. Тысяча Катек, и у каждой отдельный компьютер.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

А мы ведь хотим, чтобы приложение работало быстро. Чтобы оно не тупило и не зависало, нервируя операциониста и заставляя клиента ждать. Значит, машина нужна мощная. Но если делать мощным каждый компьютер операциониста, денег придется вложить очень много!

Поэтому мы выносим всю основную логику на сервер. И вот его уже делаем мощным! А клиентские машины могут быть дешевыми, потому что на них остается лишь логика в стиле «запросить информацию и красиво отрисовать».

Нет дублирования кода

Если бы у нас были только клиентские машины, на каждой из них хранился бы одинаковый код по обработке логики, лежала вся база данных, все справочники террористов и прочая. Но так как сервер и БД вынесены в отдельные звенья, с клиентской машины освобождается куча места… И кода.

Не надо дублировать код, ведь вся основная логика вынесена на более мощный сервер.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

На сервере и в базе хранится информация, недоступная простому операционисту. Это:

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

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Зачем нужна база

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

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

В таком случае все данных сервер хранит в памяти. Вот только если сервер упадет, или просто перезагрузится — вся информация будет потеряна. Все, что было в памяти, стирается при выключении системы.

БД (база данных) — отдельный программный продукт, который позволяет:

Да, базы может не быть. Но когда она есть, мы уверены в сохранности данных и легко можем по ним поискать.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Плюсы архитектуры

Резюмируем плюсы архитектуры:

Минусы архитектуры

Упало одно звено — все отдыхают

Если упал сервер или отвалилась база, то есть испортилось 1 звено — всё, все в ступоре, все отдыхают. Сотни, тысячи, да хоть миллионы клиентов если есть — никто не может работать. Все операционистки грустно смотрят на окно «Простите, что-то пошло не так» и разводят руками перед клиентом.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Именно поэтому в бизнес-критичном ПО архитектуру усложняют и даже дублируют. Банк с тысячами операционистов не может позволить себе простой. Поэтому они используют кластер серверов — один упал, остальные работают.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Как в таком случае клиент понимает, куда ему отправлять запрос?

Перед серверами ставят балансировщик, и клиент шлет запрос туда. Сколько бы серверов не поставили в кластер, клиенту это не интересно. У него есть один URL — адрес балансировщика.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

И вот с клиента поступает запрос:

— Дай мне всю информацию по Васе Иванову.

— Ребята, новый запрос! Кто меньше загружен?

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

— У меня 5 запросов в очереди стоит.

Балансировщик отправляет запрос второму серверу.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Такая схема используется для высоконагруженного приложения — когда запросов поступает так много, что один сервер с ними просто не справляется.

Facebook, amazon, google — туда заходят миллионы пользователей. Один сервер с ними не справится. Поэтому ставят кластер, а балансировщик делит между ними нагрузку. И в таком случае в кластере может быть не 2 сервера, а 10, 15, сколько нужно, столько и ставим.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

При этом мы можем точно также балансировать базу данных. У нас может быть несколько копий баз данных на самых разных машинах, и балансировщик отправляет запросы то к одной, то ко второй.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

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

При этом может быть и схема холодного резерва — когда у нас второй сервер является резервной копией «на всякий случай». Все запросы идут на первый сервер, второй отдыхает.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Но если с первым сервером что-то случится и он помрет, балансировщик перенаправит нагрузку на второй сервер:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

В это время у администраторов будет время разобраться с проблемой на сервере 1.

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

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

Таким образом, схемы резервирования помогают нам устранить проблему «упало 1 звено — все отдыхают». Клиент никогда не узнает, что один или несколько серверов в кластере сдохли, у него всё как работало, так и работает.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Высокая стоимость оборудования

Сервера стоят дорого. Туда нельзя поставить обычный SSD как для домашнего компьютера. Почему? Потому что к железу для серверов совсем другие требования по надежности + есть поддержка специфичных функций:

— у HDD это специальная микропрограмма контроллера, которая оптимизирована для работы диска в RAID, дома это не нужно.

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

SSD — быстро работающий диск, HDD — обычный. RAID — когда мы N дисков вместе соединили, а DDR кэш — это оперативная память

Плюс у серверных решений гарантия обычно гораздо дольше: 5 лет, а не год.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

По цене отличаются в 2 раза. Например, SSD:

Вроде не сильно отличается, да? Но смысл в том, что для дома 1 тб хватает за глаза — и фоточки все влезут, и кино, и куча приложений… А для базы данных иногда и 10 тб будет мало. А если делать кластер, то умножаем стоимость на 2, если не больше. Поэтому и разница в цене кажется огромная, но при пересчете на гигабайт небольшая выходит.

Не забывайте, что дома вам просто надо свои фоточки держать, да и те обычно в облаке. А на сервере бизнес-критичный функционал, который жрет дофига ресурсов и который надо дублировать на случай «вдруг первый сдохнет».

Нужно нанять сисадмина

Нам нужно нанять сисадмина, который будет следить за всеми нашеми серверами приложения и БД. Добавляем его зарплату к стоимости оборудования!

Что тестировать

Чтобы понимать, что тестировать, надо понимать, с чем имеет дело человек.

Пользователь работает с клиентом. Это может быть web или desktop приложение, не суть. Операционистке Кате дали рабочее место, показали какую программу запускать и как с ней работать. Она знать не знает о наличии серверов и БД, она работает только с клиентом.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

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

Сервер работает, на клиенте ошибка. И плевать на сотни «зеленых» автотестов. У пользователя все равно ошибка. И наша задача — посмотреть с его точки зрения.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Однако, если у вас есть доступ к серверу приложения и его базе данных — стоит проверять и их тоже! Так мы можем увидеть «будущий баг». Например:

— Ну, наверное, их и не заполняли.

А их заполняли! Просто сохранение криво сработало. Поэтому, если у нас только черный ящик, то нужно проверять, «а реально ли сохранились данные?». Сохранили? Откройте карточку в новом окне или вызовете информацию через API-метод.

Если доступ к базе есть — просто проверьте по ней, что все хорошо. Если есть доступ к серверным логам — проверьте их на наличие ошибок.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Помимо простых пользователей бывают злые люди, которые пытаются встрять в наше приложение и своровать деньги / данные. Они используют не клиент или сервер — туда у них доступа нет. Они пытаются перехватить данные в пути от клиента к серверу, или от сервера к БД.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Ну а раз нехорошие люди могут это сделать, то тестировщик тоже должен это уметь! Потому что тестировщик предоставляет информацию о нашем продукте.

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Тестировщик изучает уязвимости и потом рассказывает команде:

— Ребята, вот я проверил, у нас есть такие-то и такие-то потенциальные дыры. Давайте подумаем, надо нам их как-то закрывать или нет.

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

Но какие-то базовые проверки типа sql-иньекций или XSS-атак стоит изучить и проверить на своем приложении. Хотя бы чтобы понять их критичность. Ведь если атака сломает клиент — ну и пусть, сам себе буратино. А если атака положит сервер, это уже не очень хорошо. И надо хотя бы знать, от чего это бывает.

Итого

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

Клиент — та программа, с которой работает пользователь. Он знать не знает, это у него на компьютере программа целиком, или где-то за ней прячутся сервер с базой, а то и целый RAID. Он работает в браузере или с desktop-приложением. И всё, что ему нужно знать — это «куда тут тыкать».

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

Сервер — компьютер, на котором хранится само приложение. Весь код, вся логика, все дополнительные материалы и справочники. Например, справочник адресов ФИАС или справочник юр лиц ЕГРЮЛ — они тоже занимают место, как сами по себе, так и в памяти приложения.

Иногда говорят «сервер приложения» и «сервер БД». Это нормально, ведь фактически сервер — это просто машина, компьютер. А базу и сервер приложения обычно хранят на разных машинах, ради безопасности. В таком случае, если говорят «сервер приложения» — речь о втором звене нашей схемы.

Приложения бывают самые разные. Есть ресурсоемкие, им нужно много памяти и места на диске. Есть «легкие», которые можно развернуть даже на домашнем компьютере.

БД (база данных) — хранилище данных. Тут вы можете легко поискать информацию + уверены в том, что она сохранится, даже если в приложении что-то сломается. Подробнее о ней — в статье «Что такое База Данных (БД)»

Сколько места нужно под базу, зависит от количества данных. Есть огромные базы в банках, где и 1тб будет мало. А есть совсем небольшие, которые вы можете установить на своей машине. Например, XAMPP можно поставить. И врядли вы напихаете туда столько данных, что у вас не останется под них место.

Отдельной базы может не быть, тогда структура станет двузвенной: клиент-сервер. И все!

Схема условная, в реальной жизни у нас как минимум будет больше клиентов. А если приложение высоконагруженное, то будет несколько серверов и несколько баз данных:

Клиент серверное приложение php. Смотреть фото Клиент серверное приложение php. Смотреть картинку Клиент серверное приложение php. Картинка про Клиент серверное приложение php. Фото Клиент серверное приложение php

PS — больше полезных статей ищите в моем блоге по метке «полезное». А полезные видео — на моем youtube-канале

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *