Задать вопрос
  • Как гарантировано закрыть сокет через ServerSocket?

    Vamp
    @Vamp
    Vadim_Student, я уже и не помню что конкретно читал. Это было очень давно.

    Я бы посоветовал Java Network Programming, Elliotte Rusty Harold, изд. o'reilly.
    d8a656f9acec295ca40eb7bbf3ee13cb.png

    И хоть конкретно эту книгу я не читал, но все книги издательства o'reilly отличаются отменным качеством материала. Поэтому и рекомендую. Пробежался по содержанию и думается мне она подойдёт под ваш запрос. Сразу скажу, я не в курсе есть ли эта книга в переводе на русский. Сам я читаю в оригинале на английском и вам советую, так как русские переводы в большинстве случаев содержат кучу ошибок. Да и переведено зачастую какое-то издание, после которого уже успело выйти ещё несколько переизданий, которые уже никто никогда переводить не будет или переведут через 10 лет.
    Написано
  • Windows. БД и php — IIS или open-source?

    Vamp
    @Vamp
    в win я привык к папкам "С" и "D"

    В win эти "папки" обозначают логические разделы накопителя (ssd или hdd) и у каждого такого раздела своё название - "С" и "D". Дальше эти разделы видны как отдельные папки.

    В линуксе разделы называются иначе - sda1, sdb1, nvme0n1 и т. п. Посмотреть список разделов можно консольной командой lsblk или программой gparted. Дальше консольной командой mount -t ext4 можно посмотреть в какую папку смонтированы эти разделы. Один из них точно будет смонтирован в папку "/". Второй скорее всего в папку "/mnt" или "/media".

    При это я не пользуюсь каталогами "Изображения", "Документы", "Музыка", "Видео"

    Можно спокойно удалить.

    Короче, суть в том, что мне нужна дирректрия "D". Где в линух (Debian) мне её создать? — в разделе "Home" или при установке системы сразу создать раздел типа "D" (назвать можно, как угодно)

    Это можно сделать в момент установки. Там будет предложено смонтировать "/home" на отдельный раздел накопителя. Это как раз и было бы аналогом хранения рабочих файлов в папке "D". На уже установленной системе надо смотреть какие разделы куда смонтированы и складывать свои файлы туда, куда смонтирован раздел, который в win назывался как "D".
    Написано
  • Windows. БД и php — IIS или open-source?

    Vamp
    @Vamp
    akogch, xed. Это обычный блокнот, имеющийся в linux mint из коробки. Ещё mcedit. Это уже консольный редактор. Для разработки на php - PhpStorm.
    Написано
  • Windows. БД и php — IIS или open-source?

    Vamp
    @Vamp
    а что станет с php написанном на win в xampp? — хотелось бы прояснить для себя именно этот нюанс.

    akogch, на 99,999% ничего не случится. PHP - кроссплатформенный язык и нужно очень сильно постараться, чтобы наступить на платформо-специфичную граблю, чтобы она работала на одной ОС и не работала на другой. Но обязательно будет сказываться разница в конфигурации PHP - это наиболее частая причина почему локально работает, а на хостинге нет. И это, кстати, уже не зависит от ОС.

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

    Если не собираетесь покорять вершины, то и прыгать в омут с головой не нужно. Оставайтесь в windows.
    Написано
  • Windows. БД и php — IIS или open-source?

    Vamp
    @Vamp
    GavriKos, здесь имеется ввиду прыгать ли в этот омут сразу с головой или только ноги помочить.

    на ваш взгляд ставить "php, apache, mysql", xampp или уходить таки на linux?

    akogch, не заметил этот вопрос. Я советую уходить в линукс. Причём это должна быть полноценная инсталляция на компьютер (можно в dualboot с виндой), а не виртуальные машины или недолинуксы типа wsl. Если решитесь пойти этим путём, то советую взять linux mint. Этот дистрибутив наиболее дружелюбен для пользователей windows.
    Написано
  • Windows. БД и php — IIS или open-source?

    Vamp
    @Vamp
    akogch, всё же смена операционки - довольно чувствительный шаг. Если php, nginx, mysql - новые инструменты и их изучение будет производиться с нуля, то с ОС люди уже умеют работать, знают как она устроена, есть сформированные привычки и паттерны при работе с ней. Всё это придётся сломать при переходе на линукс. Поэтому wsl - это максимум для большинства людей. Так что дело тут не в том, что опен сорс.
    Написано
  • Защита данных в программе без опыта криптографии?

    Vamp
    @Vamp
    ТС пишет, что ему чат гопота посоветовала библиотеку с готовой реализацией aes. С чего вы решили, что он собирается изобретать что-то своё?

    Берешь rsa, ключ 2048 - и шифруешь.

    А потом удивляешься почему это не получается зашифровать больше 245 байт за раз и начинаются костыли с делением на сегменты. После чего ещё раз удивляешься почему оно тормозит.
    Написано
  • Как исправить include в php 8.3?

    Vamp
    @Vamp
    loed, потому что на другом хостинге включена php.ini опция short_open_tag.
    Алексей Уколов уже упоминал эту опцию в своём ответе.

    Но всё же лучше писать скрипты с <?php вместо <?, потому что <?php работает на всех хостингах, а <? только на тех, где включена опция short_open_tag.
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, с такой скоростью для счётчика даже бита не нужно выделять. Раз уж в пределах секунды может быть только один идентификатор, то сама эта секунда и станет идентификатором. Поэтому 2 ^ (34 - 2) ≈ 136 лет
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, это расчет на автоинкремент. Для snowflake будет немного иначе:
    Счётчик на 100 - 7 бит
    Machine id - 2 бита (на 4 машины)
    Для метки времени остаётся 34 - 7 - 2 = 25 бит, что даёт всего 33554431 секунд (388 дней).
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, с такими вводными snowflake исчерпает идентификаторы за год. Слишком мало бит на метку времени.

    С другой стороны, 100 в сек - это ерунда, для которой хватит и централизованного автоинкремента. Если уж хотите распределённости, делите диапазон между машинами. Например:

    Машина 1: 1 - 2 499 999 999
    Машина 2: 2 500 000 000 - 4 999 999 999
    Машина 3: 5 000 000 000 - 7 499 999 999
    Машина 4: 7 500 000 000 - 9 999 999 999

    И пусть каждая машина последовательно генерит в своём диапазоне.
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, напишите требования. Алгоритм можно достаточно гибко тюнить под них.

    Сколько идентификаторов в секунду вас устроит? Сколько генерящих машин будет максимум?
    Написано
  • Что подразумевается под полем http_x_real_ip в log_format Nginx?

    Vamp
    @Vamp
    Salamandrine, в таком случае отметьте ответ решением.
    Написано
  • Как вести историю работы с записями во всех таблицах для всех пользователей?

    Vamp
    @Vamp
    historydev, переименовывать таблицы - вот ужасное решение. Это допустимо на этапе разработки, но в продакшене это лишь ненужный гемор с неясным выхлопом. И чем больше проект и команда, которая над ним работает, - тем хуже последствия.
    Написано
  • Как вести историю работы с записями во всех таблицах для всех пользователей?

    Vamp
    @Vamp
    historydev, такого ещё не было, но если пофантазировать, то я бы историю не трогал, новые записи вставлял с новым именем таблицы (забыл, кстати, указать в ответе, что есть ещё колонка с именем таблицы, в которой производилось изменение) и переименование обыграл в коде, отвечающем за web ui. Например, массивом с инфой о переименованиях.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Михаил Ливач, нет, не будет закрыта. Второй скрипт откроет своё отдельное соединение и там будет своя транзакция. Функция mysqli_change_user не применяется в обычных php скриптах. Если у вас не roadrunner, swoole, reactphp и прочие ивент лупы, то вам mysqli_change_user не нужен.
    Написано
  • Какая может быть причина отключения ПК?

    Vamp
    @Vamp
    Оперативную память протестируйте мемтестом с загрузочной флешки. А то проверили всё, а самое очевидное пропустили.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Я только не понял, откуда возьмётся перерасход TCP портов при обычном коннекте. Создавая новое соединение мы закрываем старое. Ку да у вас при этом пропадает исходящий порт?

    Ипатьев, коннект при закрытии не освобождает занятые ресурсы, а просто переводится в состояние TIME_WAIT, в котором он находится какое-то время. В линуксе это 60 секунд. И только по истечению этого времени ОС подчищает коннект и освобождает занятый порт. Это поведение описано в RFC на TCP, поэтому оно одинаковое везде. Итак, первое: после закрытия коннекта порт остаётся занятым ещё минуту.

    При открытии TCP коннекта к удалённому серверу клиент может указать номер локального порта, но в подавляющем большинстве случаев никто этого не делает и ОС выбирает доступный порт из так называемого диапазона эфемерных портов. В моём случае это порты с 32768 по 60999:
    $ sysctl net.ipv4.ip_local_port_range
    net.ipv4.ip_local_port_range = 32768	60999

    Второе: всего доступен 28231 порт для исходящих TCP соединений

    Делим 28231 на 60 и получаем теоретическую производительность в 470 rps в течение минуты и более, при превышении которой начнут появляться ошибки вида "Cannot assign requested address" при коннекте к базе. Разумеется при условии, что каждый запрос триггерит соединение к базе.

    Решений у этой проблемы много разных. Например, можно выставить опцию net.ipv4.tcp_tw_reuse=1 и тогда система начнёт прибивать TIME_WAIT коннекты до истечения таймаута, если свободных портов больше нет. Ещё можно расширить диапазон эфемерных портов. Или перевести коннекты к базе на юникс сокет (хотя здесь уже начинает работать лимит на количесто открытых файловых дескрипторов). Но это всё лечение симптомов. Более правильным вариантом был бы переход на персистентные соединения. Но у меня проект сидел на PDO и я не рискнул, так как PDO не чистит коннект между http запросами как это делает mysqli. В итоге я просто включил tcp_tw_reuse для быстрого решения проблемы на месте, затем задеплоил проект на второй сервер, настроил балансировку запросов между ними, а в конце-концов просто переписал эту часть проекта на java, где есть нормальные пулы коннектов.

    Был у меня и другой случай. Хоть и не про базу, но тоже про экономию TCP коннектов. Есть сервер, находящийся за маршрутизатором cisco. На сервере прописан только серый ip и выход в интернет делается при помощи NAT на циске. На сервере работает приложение, которое рассылает клиентам уведомления на их http колбэки. В какой-то момент уведомлений стало так много, что циска упёрлась в лимит NAT трансляций и новые коннекты в интернет вообще не устанавливались. Решением было включение опции keep-alive в используемой http библиотеке (это было на java). В итоге вместо отдельного TCP соединения на каждый http запрос создалось немножко постоянных TCP соединений на каждого отдельного клиента (домен клиента), в которых гонялись http запросы.

    А используется там практически безальтернативно PDO, которое в mysql_change_user() не умеет. Так что советуйте свои советы пользователям Ларавля и Симфони, а когда они с вами согласятся - то тогда так и быть, попинайте и меня, грешного.

    Да, у PDO с этим действительно проблема и она никак не решается. Единственный реальный вариант там - переоткрыть коннект. Есть ещё вариант тщательно следить за кодом, но я не верю в него, так как пхп, "созданный, чтобы умирать", не воспитывает в программистах аккуратность и внимание к деталям. В частности, из-за этого у нас есть битрикс, вордпресс и прочие ругательные слова, а сам язык имеет репутацию языка для быдлокодеров.

    К счастью у ТС mysqli, с которым можно красиво порешать.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    "Экономию исходящих TCP портов" вы себе выдумали на пустом месте, при использовании обычного коннекта будет такая же "экономия".

    Ипатьев, TCP коннекты - тяжёлый и ограниченный ресурс. Осознание этого факта обычно приходит с опытом работы в хайлоаде. Нет ничего зазорного в том, что вы не верите. Я бы тоже не поверил, если б не столкнулся лично.

    В документации на эту функцию нигде не написано, что она служит для проверки соединения или замены mysqli_ping.

    А она и не предназначена для замены mysqli_ping. Не понимаю с чего вы так решили. Я лишь посоветовал ТСу заменить mysqli_ping на mysqli_change_user в данном конкретном скрипте, потому что это лучший вариант конкретно в этом случае.
    И вот именно для того, чтобы сэкономить все эти операции, mysqli_change_user не следует дёргать при каждом обороте event loop-a. Это просто глупость.

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

    Всё верно. И на такой случай ТС уже ввёл переменную $connOk и она прекрасно сработает в тандеме с mysqli_change_user.
    поэтому надо написать свою замену mysqli_ping
    ...
    и не выдумывать.

    А потом ловить непонятные проблемы, когда скрипт вызывает mysql функцию get_lock, а release_lock не вызывает, потому что где-то между этими вызовами скрипт ловит эксепшен и выдает клиенту ошибку и приступает к обработке нового http запроса, который сразу же впадает в дедлок, пытаясь захватить этот не освобожденный лок. Или транзакция не успевает закоммититься из-за того же эксепшена, а глупый программист не натыкал где надо ролбэков, в итоге следующий http запрос продолжит чужую транзакцию. Я понимаю, что get_lock, транзакции из более чем одного запроса - это уже продвинутые фичи и не каждый с ними знаком. Но всё же они существуют и по мере развития проекта могут больно ударить пользователей roadrunner и других ивент лупов.

    Не, ну можно конечно наплевать на логику, понадеяться на авось и взять в работу "грязный" коннект. Но я бы не советовал.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Ипатьев, не напутал. Так написано в документации на эту функцию. К тому же нативные персистентные коннекты в mysqli очищаются ровно таким же способом перед запуском нового php скрипта (об этом тоже написано в доке).

    С таким же успехом можно и вовсе новое соединение открывать.

    Можно, но тогда каждый раз будет создаваться новое TCP соединение. Вероятно, помимо экономии на установке TCP, экономится ещё и время на создание внутренних структур и проведение какой-то подготовительной работы на стороне сервера для каждого нового коннекта. Ещё бонусом идёт экономия исходящих TCP портов, но ТС вряд ли когда-то столкнётся с проблемой исчерпания портов.
    Написано