Pull to refresh
4
0
Дегтярёв Евгений @bat

Go/PHP Developer

Send message
все верно
$ go build
$ ldd main
linux-vdso.so.1 => (0x00007fffd4bf7000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc4679b7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4675f0000)
/lib64/ld-linux-x86-64.so.2 (0x000055cfc4c89000)

но, при определенных условиях это не так
$ CGO_ENABLED=0 GOOS=linux go build -ldflags "-s -w" -a -installsuffix cgo
$ ldd main
не является динамическим исполняемым файлом
По мне так интерфейсы для работы с БД не очень.
Добавлю, что Go-приложение (при определенных условиях) может запускаться в докер-контейнере без ОС (FROM scratch).
Например реализация websocket сервера на php, будет ли она быстрее на php7/8/5? на те же 40%?

шо, опять? ©
какой-то странный у вас flow

вполне распространенный вариант
думаю что связано с тем, что в выходные/праздничные запросто может не быть нужного размера, а списать деньги а потом отправить клиента за возвратом как-то не очень
1. да FB не для веба, если веб на PHP
2. про тупиковую не согласен
3. зачем используете классик если у вас коротко живущие коннекты?
4. тестировали ли FB 3?

зы
про 400 пользователей: что за железо?
есть БД ежедневно 3k+ подключений, проблемы начинаются ближе к 4к
причем есть основания полагать, что истинный корень проблемы в количестве соединений а в неправильной работе с транзакциями в некоторых АРМах
Из того что бросилось в глаза

По умолчанию расширение Firebird/Interbase автоматически подтверждает транзакцию после выполнения каждого SQL запроса

это не так, транзакция по умолчанию подтверждается только при закрытии соединения/завершении скрипта либо явно при вызове ibase_commit($dbh)

    ibase_execute($sth, $user[0], $user[1]);
    // Если произошла ошибка, бросаем исключение
    $err_msg = ibase_errmsg();
    if ($err_msg)
      throw new \Exception($err_msg);

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

Главное проклятие драйверописателей для FB/interbase (не только в PHP) — понимание специфики транзакций и работа с ними.
Умолчательные параметры транзакции подходят для большинства случаев, и менять их параметры требуется очень редко. Дело в том что соединение с базой данных, как и все связанные с ним ресурсы существуют максимум до конца работы PHP скрипта. Даже если вы используете постоянные соединения, то все связанные ресурсы будут освобождены после вызова функции ibase_close.

Имхо, лучше использовать подходящие параметры для каждого случая (чтение данных, изменение данных, построение отчетов), а не использовать параметры по умолчанию. Да это проще, но это плохо. Чем плохо давно разжевано на том же ibase.ru
Как reactphp ведет себя при 10 тыс соединений?
crm была в облаке (sfdc), в ней таких вещей не сделаешь, поэтому решение должно было хоститься на своих мощностях. По этой причине было больше свободы в выборе инструментов. PHP не рассматривали по вышеописанной причине, хотя 2 из 3х разработчиков пхппешники, третий — perl. Прототип на perl пхпешникам не вкатил )), попробовали на nodejs — покатило, даже без экспертных знаний в JS

зы
сейчас бы сделал на GO
Несколько лет назад подобную задачу решали на nodejs. Не знаю как сейчас, но в тот момент экосистема nodejs для подобных сервисов была предпочтительнее.
И чем всё это закончится…

skynet?
не правда, вернее, не всегда
результаты больших выборок обрабатывать массивом неоптимально, а порой невозможно
уже написаны 3 статьи по ADO.NET desktop, ASP.NET MVC и Delphi, в работе для PHP, Java, Android

есть опыт работы с FB на PHP, было бы интересно почитать соответствующую статью
не связывался

а зря
говорите как будто это бяка какая-то ))
весьма полезная штука

автора за подобный код осуждаю
$where .= ' AND provider = "'. $provider. '"';

возможно, что там значение из предопределенного списка констант, и тем не менее
Думается, проблему бы решило

$where = «providerUserId = '?'»;

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

WS хорош, но сложен в реализации.

используйте готовое решение, вся сложность спрятана внутри.

По поводу long-polling vs websocket: если только https — можно смело использовать websocket, иначе long-polling либо гибридные решения типа socket.io. В ws есть бинарные сообщения, в некоторых ситуациях это очень полезно.

Есть опыт по транспорту котировок в браузер и моб.приложение. Каждому клиенту раз в секунду отправляется информация по изменившимся котировкам (до 50 штук). Первый прототип на node.js+socket.io на 2 тыс соединений на 100% грузил ядро. Были подозрения на избыточность протокола socket.io, раскопки показали что избыточность есть, но не такая значительная. Основной затык был в сжатии ws-фреймов, которое включено по умолчанию и через параметры socket.io не конфигурируется. В принципе хорошее решение для не интенсивного трафика.
Второй и рабочий вариант сделали на чистых вебсокетах, сжатие отключено, данные пересылаются в бинарном виде (protobuf). За счет использования бинарного формата даже при отключенном сжатии удалось выиграть в объеме. Так же бинарный протокол позволил избежать повторного кодирования одних и тех же данных для разных клиентов, пакет собирается из готовых бинарных кусков. Результаты тестов: 5 тыс активных соединений при 25% загрузке ядра, трафик 75Mbps.
Про оформление и поддержку был скорее сарказм…

Зачем придумывать и героически преодолевать трудности? Да на php можно написать http-сервер, websocket-сервер. Но зачем? Когда есть готовые решения? пусть и на других платформах. Например, nodejs — event loop и http из коробки, реализации ws на выбор, и все это отлично работает + язык знакомый для вебразработчика. Или, например, go — тоже все есть, да, может язык и незнакомый, но эффективнее по по процессору и памяти.
Спасибо за внимание, используйте на здоровье весь приведенный выше код (разумеется, я советую завернуть его в нормальные объекты, тут всё упрощено исключительно для понимания. Особенно callback на пришедший от пользователя frame советую сделать по-нормальному). Если вы будете использовать этот код, напишите пожалуйста где-то в коде «Спасибо Anlide и PhpDeamon».

Ну так оформите нормально, опубликуйте код и документацию, поддерживайте, тогда вам скажут спасибо.
А так — мыши и кактус
в статье упомянули про livestreet

Information

Rating
5,079-th
Location
Алтайский край, Россия
Registered
Activity

Specialization

Backend Developer
Senior