Задать вопрос
  • Можно ли тянуть от оператора два кабеля интернета?

    @Vitsliputsli
    возможно ли будет увеличить скорость, если тянуть два интернет кабеля?

    как уже написано, если провайдер обеспечит на каждом кабеле по 100, то возможно.

    Какое оборудование для этого лучше использовать?

    Проще всего 2 железки, способные подключиться к интернету провайдера и раздать на 10 машин каждая. Будет 2 подсети, если надо можно и локальный доступ сделать между ними.
    В случае 1 железки придется хитро маршрутизировать, или задавать каждой машине свою подсеть со своим шлюзом.

    Интернета не хватает (20+ компьютеров).

    Не факт, что после увеличения скорости интернета будет хватать. Ктото 5Мб фалик не может по почте получить, а у когото фильмец медленно через торрент льется. Вполне возможно, что вам нужно смотреть в сторону шейперов.
    Ответ написан
    Комментировать
  • Проектирование БД: чем сейчас люди пользуются?

    @Vitsliputsli
    Основное требование: востребованность в будущем этих навыков.

    Для разработки бд в будущем как и сейчас будет востребован навык разработки бд. А где вы схему нарисуете, да хоть на бумажке, это вообще дело десятое.
    Если расчет, что инструмент както сам большую часть сделает, то нет, не сделает. А что сделает, то и самому легко написать.
    Ответ написан
  • Возможно ли задать подсказку в phpstorme для возвращаемого типа?

    @Vitsliputsli
    Это не просто подсказки, это контроль типов. То, что зная какой тип возвращается Шторм может подсказать варианты это побочное удобство. Основное же должно быть то, что конкретная переменная имеет определенный тип, а значит не нужны дополнительные проверки и методы будут лаконичны и конкретны. У вас пока, то ли объект, то ли массив, то есть каждый раз нужно проверять что это. Лучше бы сделать объект-коллекцию.
    Чтобы указать Шторму, что в конкретной переменной лежит только этот тип используется хинт, типа такого:
    /** @var User $user */
    но разумеется, он должен быть только в том коде где в $user лежит обязательно объект класса User и ни что иное.
    Ответ написан
    1 комментарий
  • Как трудоустроиться системным аналитиком?

    @Vitsliputsli
    Начните с бизнес-аналитика. Там можно чтото найти без опыта и специфических знаний, нужна только логика. А уже с опытом и изучив необходимые инструменты, сможете двигаться дальше.
    Аутстафф - это когда специалисту платят меньше рынка, его труд продают по рыночной цене, а разницу забирает тот, кто придумал схему. Все остальное будет зависеть от конкретной аутстафф компании и конечных компаний.
    Ответ написан
  • Почему вдруг нагружается сервер и потом все сбрасывается?

    @Vitsliputsli
    1Гб это очень мало для современных дистрибутивов, тем более для сервера с СУБД. apt check в Ubuntu (не знаю как в других) любит жрать память без причины, просто так, и никто это не чинит уже более 10 лет. А когда память заканчивается неизвестно, что попадет "под нож", вполне может и СУБД, как самый жирный процесс. Поэтому проверьте когда в последний раз запускали СУБД.
    Если увеличить память никак нельзя, попробуйте полностью отключить запуск apt-check. Если у вас обновления автоматические, то перевести их на cron.


    сбрасывается индексное значение (auto_increment) до 1

    Таблица постоянно чистится, и в этот момент она пуста?
    Ответ написан
  • Есть ли преимущества от удаления поля id при создании таблицы?

    @Vitsliputsli
    На практике не делал, но чисто теоретически, поле id подразумевает что для него построен индекс primary key (иначе зачем оно нужно). В PostgreSQL primary key в партиционированной таблице - это индексы каждой отдельной партиции, т.е. если мы партиционировали не по полю id (а скорее всего так и есть), то при попытке обращения по полю id нам нужно отдельно пройтись по каждому индексу каждой партиции, а это уже не так весело как по одному индексу. А если партиции сделаны достаточно маленькими и их много, то фуллскан одной партиции скорее всего будет быстрее. А если контроль уникальности вынесен в приложение, то можно обойтись вообще без primary key, даже натурального, тогда и при вставке не нужно сканить все эти индексы.
    Ответ написан
    2 комментария
  • Как проводить автоматизированное тестирование приложения php в процессе deploy?

    @Vitsliputsli
    При применении миграций после переключения на новый код вам придется постоянно в коде проверять версию базы и держать код работы с разными версиями. Иначе - постоянная некорректная работа во время деплоев.
    Гораздо проще применить миграции и переключиться новый код. Обратную совместимость базы данных поддерживать легче (если база - это данные, а не хранимые процедуры), поэтому откатить код можно будет без проблем, а откатывать миграции скорее всего даже не потребуется.
    Самый простой способ тестирования для отката - это контроль ошибок реальной работы и скрипты health check по основным метрикам, их будет достаточно.
    Ответ написан
    Комментировать
  • Как оценивать сроки по задачам?

    @Vitsliputsli
    чтобы мне такого почитать про оценку времени вообще и про декомпозицию задач в частности?

    Я бы посоветовал ничего не читать и не тратить впустую время. Оценка времени разработки никогда не бывает точной и с этим нужно смириться. Декомпозиция вещь хорошая, но тут теория вряд ли поможет, только опыт разработки.
    Любая попытка более точной оценки - это устранение неопределенностей, для этого, например, разбивают на более мелкие задачи в которых точно уже известно что делать и кажется что все контролируешь. Но, оценка никуда не делась и она всегда строится на "похожих" задачах, которые уже делались. Только вот если мы говорим про нормальную разработку, то там это не работает, совсем... Если действительно похожая задача реализована, значит основной функционал уже есть и нужны только минимальные правки, а значит вторая задача будет стоить несравнимо меньше. Другой момент, действительно со стороны может показаться что есть похожие задачи и на них всегда тратится похожее кол-во времени, но в какойто момент времени окажется что следующая "похожая" обойдется в 10 раз дороже. Поэтому если где-то похожие задачи всегда стабильно стоят одинаково, то скорее там не разработка, а набор текста.
    Если про правки "в сильно незнакомом коде", то даже не пытайтесь, здесь неопределенность зашкаливает. Такой код требует предварительно изучения, и не важно какая задача, она может решаться как добавлением 2 строчек, так и переписыванием всего и вся.
    "возможно предварительно поисследовав", как только вы употребили слово исследование, никакие оценки здесь уже не применимы. Исследования не оценивают, на них выделяют время, когда время закончилось решают нужно ли еще время или бессмысленно копать в эту сторону.
    Это все, конечно, несколько утрировано, но, на мой взгляд все что требуется со стороны разработчика (а я так понял вопрос именно с этой стороны) это просто давать оценку задачам, а затем обращать внимание на аспекты которые потребовали много времени, но которые упустили при планировании.
    Ответ написан
    Комментировать
  • Как проводится нагрузочное тестирование на проекте?

    @Vitsliputsli
    Прям очень по-разному, но чаще очень редко или никогда.
    Вообще, нагрузочное бывает 2х видов:
    1) тестирование релиза на возможную деградацию производительности;
    2) тестирование запаса прочности приложения (это когда повышаем нагрузку, пока все не упадет).
    И еще важно где применяется:
    а) где деплой полностью контролируется, т.е. на свои серверы;
    б) где сборка разворачивается где-то на удаленных серверах 3ми лицами.
    Нагрузочное 1 типа для варианта "б" проводят для каждого билда, вряд ли есть исключения, иначе чревато. Для варианта "а" часто "забивают" вообще на этот тип тестирования. Причины просты, прям какаято сильная деградация будет заметна при прогоне обычных тестов, просто по их замедлению. А если тесты еще идут параллельными потоками, то и некоторые блокировки можно отловить. С другой стороны, если чтото не так, то деплой полностью контролируется и можно всегда откатиться. И тут реально в первую очередь лучше озаботиться blue-green серверами и плавным переключением трафика, а потом уже нагрузочным тестированием. Да и чаще, это будут какието медленные деградации, которые отловит мониторинг и опять же либо будет время поправить, либо можно откатиться.
    Нагрузочное типа 2 делают очень редко (например 1-2 раза в год), т.к. штука затратная, и опять же мало где его вообще встретишь, только там где стабильность очень важна и/или пиковая нагрузка может в разы отличаться от стандартной.
    Ответ написан
    Комментировать
  • Кто нибудь объясните мне про индексы в БД, я не вижу в них никакого смысла?

    @Vitsliputsli
    Если очень кратко:
    Вам нужно понять, что индексы это не такая уж элементарная вещь. Нельзя просто поставить на поле флажок "индексировать". Индексы это тонкая настройка, и чем сложнее выборки, тем она сложнее. Даже не рассматривая различные типы индексов, выбрать какие поля, в какой последовательности, с какой сортировкой и в каком индексе должны присутствовать бывает не так просто. Для этого нужно очень хорошо понимать и как устроены индексы, и как с ними будет работать оптимизатор и какова селективность конкретных данных. И тогда, скорость выборок можно увеличить в разы, но все это конечно не бесплатно.
    Тем не менее, другой ваш вопрос, если нужно фильтровать и сортировать по всем полям таблицы, а полей очень много, здесь уже использование реляционных СУБД не оправдано и на помощь приходят другие инструменты, типа ElasticSearch.
    Если заботитесь о стабильности, то индексы всегда назначаются при разработке соответствующих запросов. Если потом мы их и меняем, то потому что чтото не предусмотрели.
    Индексы могут замедлить работу. Очевидно, что они замедляют вставки и апдейты, но при криворукости можно замедлить и выборки, ведь и оптимизатор тоже ошибается. Индекс это по сути еще одна таблица, что уже намекает что не всегда это будет быстрее, т.к. придется работать не с одной таблицей, а с двумя (не всегда с двумя, но опять же, в двух словах все не охватишь).
    Ответ написан
    Комментировать
  • Как узнать из-за чего прерывается фоновый процесс запущенный через exec?

    @Vitsliputsli
    В logfile.log ничего не будет, вы же ничего не выводите в поток.
    Проверяйте логи php, если там ничего нет, проверяйте как вы их пишете (если не меняли ничего в логировании, то должны писаться).
    Если логи работают (эмулируйте fatal error и посмотрите), но ничего в них нет, значит чтото внешнее убивает процесс php не давая ему возможности записать лог. Обычно так жестко поступает oom killer.
    Ответ написан
    Комментировать
  • Как передать имя таблицы как параметр?

    @Vitsliputsli

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

    Prepare подготавливает план, нельзя подготовить план без таблицы.
    Тем не менее, prepare будет выполняться 1 раз, но для каждой запрошенной таблицы.

    А в чем собственно сложность? Prepared statements это всегда как минимум на 2 запроса больше, чем без них, если просто считать запросы. Хотя колво запросов и скорость не везде зависимы. Да и pdo по-умолчанию предпочитает их не использовать, заменяя своей эмуляцией.
    Ответ написан
    Комментировать
  • Как правильно использовать гит, если нужны данные из другой ветки?

    @Vitsliputsli
    создать branchTwo из мастера и туда смержить branchOne, или просто создать branchTwo из ветки branchOne в которой есть нужные изменения ? или вообще черрипикнуть коммиты в branchTwo из branchOne ?

    1 и 2 одинаковы, разве что в 1 случае телодвижений больше, такое нужно только если у вас какието внутренние правила создания только из master. А вот 3 отличается.
    В 1 и 2 вы забираете всю ветку, т.е. забираете всю фичу. В 3 случае, вы забираете только 1 конкретный коммит. И, именно так это и нужно использовать.
    Т.е. если для фичи branchTwo нужен функционал branchOne, то используете 1 или 2 вариант. Если для фичи branchTwo функционал branchOne не нужен, но чтобы заново не писать вы решили скопировать несколько строк из branchOne - то cherry pick.
    Проблема 1 и 2 варианта, что branchTwo не может поехать раньше branchOne, они связаны. И если в какойто момент окажется, что branchTwo ой как нужна, а branchOne совсем не нужна, будет весело. А, если в этом случае, вы выбрали cherry pick только нужных технических деталей, но не бизнесового функционала, то таких проблем не будет.
    Вообще cherry pick это некий костыль в ситуации, когда вы заранее не выделили общую часть в отдельную фичу (некую branchCommon из который бы уже создали branchOne и branchTwo), т.к. скорее всего еще до branchTwo понятно что это самостоятельная независимая задача.
    Ответ написан
    Комментировать
  • Переподключение PHP к MySQL как правильно организовать?

    @Vitsliputsli
    Самый правильный вариант - отключаться, если соединение не используется. Правильно, т.к. не используем ресурсы для поддержания ненужного соединения, ни на клиенте, ни на сервере. И не ловим эксепшены.
    И только если ну никак нельзя это контролировать, тогда реконнект по эксепшену.
    Ответ написан
  • Как найти циклы в массиве?

    @Vitsliputsli
    Вариант с единственным чтением каждого элемента, если ссылок на кольцо много, оно все равно будет прочитано 1 раз, хотя кольцо храним в отдельном массиве.
    do {
        $path = [key($array), $link = current($array)];
        while (isset($array[$link2 = $link])) {
            $link = $array[$link2];
            unset($array[$link2]);
            $pathPos = array_search($link,$path); // более для понятности, для длинных колец эффективнее хранить только ключи и искать по ним
            if (false !== $pathPos) {
                var_export(array_slice($path,$pathPos));
                break;
            }
            $path[] = $link;
        }
    } while (false!==next($array));
    Ответ написан
    Комментировать
  • Как грамотно реализовать одно соединение с базой данных на все приложение, с помощью Dependency Injection Container?

    @Vitsliputsli
    Создать зависимость можно только 2 способами, получив объект изнутри или проведя инъекцию снаружи. Если изнутри, то так или иначе понадобится синглтон, если снаружи, то ктото снаружи должен контролировать передачу одного и того же объекта во все нуждающиеся объекты.

    1. Изнутри. Очевидно просто инстанцировать объект - это очень плохой вариант. Более менее нормальный вариант, это сервис локатор, с методом возвращающим нужный объект работающим как синглтон (т.е. не нужен прям класс синглтона, только метод который проверяет существует ли объект). Выглядит это не очень, синглтон и сервис локатор не считают хорошим решением. Из минусов статичное обращение к сервис локатору создаст проблемы для подмены объекта. Для разных подключений вы можете создать отдельные методы сервис локатора или разрулить в одном методе динамический выбор. Реальная проблема - тестирование, вы не сможете мокировать объект работы с БД. Но, можно это сделать ухищрениями, сделав ленивое подключение, и метод подмены объекта БД, хотя придется этот метод тащить в каждый класс. Как вариант, делать инъекцию объекта сервис локатора. Но остается другой большой минус, сервис локатор "гвоздями прибит" к большинству классов и вам придется его везде таскать, т.е. о красивых компонентах без странной зависимости от сервис локатора можно забыть.
    2. Снаружи. Оптимально, и считается трендом - инъекция нужного объекта в конструктор. Будет ли это делать DIC или чтото иное не имеет значения. Не нужно таскать какието дополнительные сервис локаторы. Но данное решение имеет тот же минус, что и п.1, вы не сможете подменить объект на другой при мокировании:
    public function __construct(PDO $db)
    внедряемый объект обязан быть классом PDO, если хочется чтобы мок просто подсовывал одни и те же значения нужно менять на интерфейс, тогда моку достаточно выполнять требования интерфейса. Но, если ваш DIC использует автоматическое определение требуемых объектов по структуре конструктора, то использовать интерфейс не получится.
    Ответ написан
    Комментировать
  • Как передать переменную?

    @Vitsliputsli
    Используйте prepared statements. И пересмотрите архитектуру, генерировать код нужно только для очень специфичных задач, и уж точно не для того, чтобы "показать новости". Посмотрите на свой код, вы там ничего не генерируете, у вас статичный код и просто меняются данные.
    Ответ написан
    Комментировать
  • Как использовать fixtures при наличии данных в БД?

    @Vitsliputsli
    Фикстуры существуют для многократной заливки/перезаливки большого кол-ва различных слепков данных, что незаменимо при тестировании. При инстанцировании продовой (да вообще любой) базы данных, первоначальные данные вам понадобится залить только 1 раз, по-моему не стоит тут выдумывать сложных механизмов, просто залейте данные из файла прямо в БД. Если есть зависимые данные, можно заливать их сразу с указанными id, т.к. база пустая, и так как база только готовится и приложения не работают, то атомарность нам не важна.
    В миграцию помещать данные не слишком удобно, в крайнем случае можно, но только те, которые не зависят от окружения, небольшие по объему, и которые не будут программно меняться.
    Ответ написан
    Комментировать
  • Как парсер читает скрипт в случае асинхронных запросов?

    @Vitsliputsli
    Парсер просто последовательно читает текстовой файл, он ничего не знает о выполнении кода, но знает синтаксические правила языка. Если речь про интепретатор, то он выполняет код последовательно, но в нем есть команды перехода к различным участкам кода, от простейших условных и безусловных до функций и объектов с методами.
    Поддержки асинхронности из коробки в php нет, но есть специальные библиотеки для этого, например ReactPHP. Если же говорить про чистый php, то в нем есть несколько асинхронных функций (например multi_curl), но правильнее сказать, что они неблокирующие, а асинхронность придется воплощать вручную, периодически передовая управление этим функциям.
    Ответ написан
    Комментировать
  • Почему скрипт выполняется не до конца?

    @Vitsliputsli
    никаких ошибок не выдает... Там просто в моменте обрывается и всё

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

    Без этой информации можно лишь гадать, варианты:
    1) скрипт выполняется корректно (например, у вас не 8к записей, читаете не из той БД, не с теми параметрами и т.п.);
    2) происходит ошибка, но мы ее не видим (смотрим не в тот лог, гдето присобачен обработчик, который перехватывает ошибки и подавляет их сообщения, и т.п.);
    3) скрипт действительно аварийно прерывается без каких либо сообщений об ошибках (значит чтото дает команду на это, если самовредительством не занимались, то остается только oom killer, но вряд ли у вас безлимит на память php, и то что закончилась память вы бы заметили, так что очень маловероятно);
    4) неведомая хрень (баги в php, в ОС и хз что еще, еще менее вероятно, чем п3).
    Ответ написан