Задать вопрос
  • Как распараллелить парсинг и загрузку в БД на php?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    updateOrInsert несовместим с "собирать в ОЗУ". Он тупо делает select а потом insert.

    Хз сколько это 2гб в записях. Если до нескольких миллионов - то тупо делаете пачками по 3-5 тыс. select, потом insert недубликатов такими же пачками по 3-5кж

    Если больше - делаете тоже самое, но разбиваете файл на несколько и раздаете задачи джобам.
    Ответ написан
    Комментировать
  • Какая логика обфускации php кода под доменное имя?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    1. Если у вас действительно супер-пупер секретный алгоритмы которые никто не знает или может повторить.
    Использовать исключительно модель SaaS или производить вычисления через ваш сервер(но продукт всё равно будет стоять на сервере клиентов).

    2. Если никаких алгоритмов взлома гугла/пентагона/игил/телеграма там нет.
    Просто отдавать открытые исходники для работы.

    3. Если вы пишите очень плохой код и вам стыдно или хороший код, но вы жадный.
    Используйте SaaS.
    Технологии позволяют привязать домен клиента к вам, создать ему отдельное рабочее пространство(виртуалку/сервер) и всё что только придумать можно.

    http://sanasol.ws/2017/06/22/%d0%ba%d0%be%d0%b3%d0...
    Ответ написан
    2 комментария
  • Какая логика обфускации php кода под доменное имя?

    DevMan
    @DevMan
    обфускация никак не спасет от попадания на варезники, любой опытный дев без особых проблем "полечит".
    помочь могут энкодеры вроде ioncube. но ровно пока ваш продукт не станет популярным и востребованным.

    единственный действенный способ оградить код – не отдавать его, а запилить saas.
    Ответ написан
    2 комментария
  • Где вы храните запросы к базе в коде или используйте хранимые процедуры?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Просто для информации, хранимые проценуры не используются вообще нигде, кроме, наверное, хардкорного энтерпрайза.
    Тем более непонятно, как процедуры решают проблему переделывания кода.

    Если отвечтаь на вопрос буквально, то

    1. Для большинства простых операций с БД запросы вообще не пишутся, пишутся обращения к ORM. Например в вместо
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
    $stmt->execute([$id]);
    $user = $stmt->fetch();

    Пишется

    $user = $em->getRepository(User::class)->find($id);


    2. Сложные запросы с фильтрами лежат в специальных классах, которые называются репозиториями.
    Ответ написан
    7 комментариев
  • Где вы храните запросы к базе в коде или используйте хранимые процедуры?

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

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

    Все хорошо работает, пока бизнес не меняет логику, меняться запрос и получается много переделывать.
    а переписывать и тестировать процедуры в субд проще? тем более, скорее всего, с изменением процедуры придется переписывать код все равно.
    Ответ написан
  • Как контролировать жизнь php-консюмеров?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    И как решают это другие?

    У меня такое решение в голову приходит:
    Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
    И по крону, другой скрипт проверяет записи в таблице, если какой-то консюмер долго не обновлял запись - убить процесс по pid.


    В принципе, вам уже ответили. Хочу только добавить немного.
    Обратите внимание на systemd. В нём есть механизм проверки признаков жизни watchdog. Можно пингать самого себя тестовым сообщением, например. И рестартить по отказу.
    [Service]
    ...
    WatchdogSec=30s
    Restart=on-failure

    И конечно же прикрутить мониторинг, чтобы смотреть через Grafana или т.п.
    Ответ написан
    2 комментария
  • Как контролировать жизнь php-консюмеров?

    Stalker_RED
    @Stalker_RED
    Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.

    Кажется, вы близки к тому, чтобы изобрести gearman.

    Если делать самоделку, то обычно воркер беря задачу отмечает в таблице время старта и свой pid, и время завершения. И какой-то watcher проверяет таски которые слишком долго в работе и перезапускает.
    Ответ написан
    Комментировать
  • Как реализовать реал тайм чат и нотификации?

    evgen_dev
    @evgen_dev
    Веб-разработчик
    Вариантов есть несколько:
    1. Long-polling
    2. Server Side Events
    3. WebSocket

    Рекомендую выбрать последний, но с реализацией fallback на long polling (для поддержки старых браузеров).

    Для авторизации,можно например использовать memcached как хрантлище сесии в php и читать ее из nodejs по session id: https://stackoverflow.com/questions/24296212/php-n...
    Ответ написан
    Комментировать
  • Как реализовать реал тайм чат и нотификации?

    @Randewoo
    Загугли, что такое WebSockets.
    В php рекомендую использовать библиотеку Worker, там даже чайник разберется.
    Ответ написан
    6 комментариев
  • Как создать свой .phar из своего класса или файла .php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Конструктор new Phar('my_new_phar.phar') создаёт новый архив
    addFile('SimpleClass.php') добавляет в архив ваш файл с классом.
    Ответ написан
    Комментировать
  • Как зашифровать АПИ токен на стороне клиента?

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

    Поэтому если нужно проводить какие то операции, делайте их на сервере, а результат отправляйте клиенту.
    Вообще есть такая парадигма не доверяй клиенту, все данные у него и обмен с ним могут быть раскрыты.
    Ответ написан
    2 комментария
  • Как зашифровать АПИ токен на стороне клиента?

    Ninazu
    @Ninazu
    Ничего шифровать не нужно. Алгоритм такой
    1. Берете https://github.com/Valve/fingerprintjs2
    2. Отправляете результат его работы c каждым запросом
    3. Авторизируетесь и получаете токен который на сервере привязан к fingerprint и IP
    4. При получении запроса с токеном и fingerprint, проверяете наличие токена в своем хранилище, и соответсвие токена IP и fingerprint которые пришли с клиента
    5. Если не прошла проверка, заставляйте авторизироваться снова.

    P.S. IP часто динамический. Так что учитывайте это. Например много людей используют мобильный интернет. Плюс нужно понимать что может быть несколько устройств. Пользователь может зайти с планшета, телефона и ПК
    Ответ написан
    2 комментария
  • Как добавить водяной знак на видео, используя php?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    через сам php никак, только с помощью ffmpeg
    Ответ написан
    3 комментария
  • Существует ли простой способ добавить RabbitMQ в существущий проект в докере?

    coderisimo
    @coderisimo Автор вопроса
    В общем, вот такой конфиг завелся :
    version: '2.0'
    services:
        rabbitmq:
            image: rabbitmq:3-management-alpine
            container_name: rabbitmq
            volumes:
                - ./.docker/rabbitmq/etc/:/etc/rabbitmq/
                - ./.docker/rabbitmq/data/:/var/lib/rabbitmq/
                - ./.docker/rabbitmq/logs/:/var/log/rabbitmq/
            ports:
                - "5672:5672"
                - "15672:15672"
        nginx:
            image: nginx:latest
            ports:
                - "8000:80"
            # монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
            volumes:
                - ./hosts:/etc/nginx/conf.d
                - ./www:/var/www
                - ./logs:/var/log/nginx
            links:
                - php
        php:
            # у нас свой образ для PHP, указываем путь к нему и говорим что его надо собрать
            build: ./images/php
            links:
                - mysql
                - rabbitmq
            volumes:
                - ./www:/var/www
        mysql:
            image: mariadb
            ports:
                - "3306:3306"
            volumes:
                - ./mysql:/var/lib/mysql
            environment:
                MYSQL_ROOT_PASSWORD: secret
            environment:
                PMA_HOST: mysql
                MYSQL_USERNAME: root
                MYSQL_ROOT_PASSWORD: secret


    Далее ставим плагин , дающий возможность изучать происходящее в кролике используя браузерный UI.
    Для этого заходим в контейнер docker exec -it rabbitmq bash
    Ставим плагин rabbitmq-plugins enable rabbitmq_management
    Можно убедиться , что все установлено rabbitmq-plugins list
    Нам покажут список установленных плагинов.
    После заходим по адресу localhost:15672 (пароль-логин , по умолчанию guest).

    Кролик готов! :)
    Ответ написан
    2 комментария
  • Как реализовать фасетную навигацию в интернет магазине?

    @IgoNsk
    backend web developer
    На еластике это решается так https://project-a.github.io/on-site-search-design-...

    на mysql - тоже можно, через запросы с фильтрацией по выбранным значениям в форме и группировкой по атрибутам всех имеющихся значений для товаров. Тут с ростом данных будет проседать время ответа, но это надо оценивать исходя из кол-ва данных на проекте, по которым идет поиск.
    Ответ написан
    1 комментарий
  • Как получать данные об артистах и музыке ВК в 2020?

    cr1gger
    @cr1gger Автор вопроса
    Все дороги ведут в Рим — встретимся в Риме!
    Крч я через сниффер перехватил запрос, куда отправляет приложение бум.
    И просто отправить такой же запрос мало.
    Нужно отправить точно такие же заголовки, иначе будет ошибка либо пустой массив возвращать.
    Поэтому я передал все в точности как и бум. И получил такой рабочий код:
    $ch = curl_init('https://api.um-agency.com/feed/tracks/get?pass_key=bamboo5e4d9fcf47abb&block_type=3&offset=0&count=100');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Accept: application/json",                                             //
            "User-Agent: VK_Music/4.2.1 (Android 4.2.4749 8.1.0)",                  // Получение списка топ 100 чарта вк, маскируясь под Boom
            "Host: api.um-agency.com",                                              //
            "Accept-Encoding: utf-8",
            "Connection: Keep-Alive"
        ));
        $html = curl_exec($ch);
        curl_close($ch);
        $list_arr = json_decode($html);
    Ответ написан
    8 комментариев
  • Долгая обработка запроса php как передать браузеру что бы ждал ответа?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    У меня такие тяжелые процессы вынесены в отдельный сервис. Пользователь создает задачу, все это записываю в БД, сервис запускается по крону, смотрит наличие новых задач, выполняет, отмечает что выполнил и откуда можно забрать результат. У пользователя в интерфейсе висит сообщение что задача обрабатывается. Он может пойти погулять где-то, потом прийти и посмотреть результат и скачать файл.
    Ответ написан
    1 комментарий
  • Как организовать уведомления в Telegram с различными интервалами для каждого пользователя?

    i__dmitry
    @i__dmitry
    Weaving a web
    Я генерировал раписания постов для каждого пользователя, когда стояла аналогичная задача.
    Пользователь регистрируется у бота, и в этот момент для существующих в БД постов к рассылке генерируется расписание для данного пользователя. Далее кроном дергается скрипт, который проверяет, есть ли на данный момент расписание для рассылки, и отправляет сообщения.
    Не уверен в оптимальности такого решения, но в моем случае получилось достаточно гибко.
    Можно попробовать сделать нечто аналогичное.
    Ответ написан
    1 комментарий
  • Как лучше всего кешировать запросы с учетом строки поиска на фотостоках с API в PHP?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Кэшируйте через клиента, исполняя запрос к API из браузера, а результат - отправляйте себе на бэкенд и там - кешируете, группируя одинаковые ответы на различные запросы в единую группу.

    Если это невозможно - группируйте поисковые запросы и привязывайте результат к такой группе.
    Для отображения - находите группу для запроса и достаёте ответ из кэша этой группы.
    Привязка простая: "один-ко-многим": ответID->запросы.

    Дополнительно:
    Можно проставлять "веса" на каждое слово в запросе и составить свой словарь синонимов, чтобы выдавать релевантные результаты из своего кэша на запросы, которые похожи на предыдущие, но которые не отправлялись ни разу на API фотохостинга.
    Иными словами: сделать свой промежуточный поиск до поиска в фотохостинге через API.
    Ответ написан
    2 комментария