Задать вопрос
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    Vitsliputsli,
    учитывая что в той теме упорно не читали что вам пишут, игнорировали собственно вопрос автора

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

    "массив в пхп вещь тяжелая" подразумевает, что есть лучшие реализации вне пхп

    Лучшее в чем? В функционале или в количестве памяти на реализацию функционала? И еще раз если брать какой нибудь статический массив на сях - никаких накладных расходов по памяти. Но вагон минусов по функционалу. Массив в php - хеш таблица, с вагоном плюсов по функционалу, но вагон оверхеда по памяти. Создаете массив в php - надо понимать что в памяти будет валяться не только переменная а вагон всего. Ну это и есть тяжесть. В чем так сказать ваши претензии? Я написал что-то неверное? Да вродь нет. Вам нравится реализация массивов в PHP? Мне тоже - но это не отменяет того что там вагон оверхеда по памяти и надо понимать что $arr = [1]; у вас памяти займется несколько больше нежели 1. Вы просто испытываете боль от упоминания оверхеда? ну примите нурофен
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Вот это тоже не верно. Вы НЕ понимаете как работает сервис, вот и всё.
    Здесь можно ставить точку.

    Нееее. Вы не в состоянии обьяснить контекст задачи.

    При ста попытках без "Idempotence-Key" будет создано 100 платежей, которые будут висеть в ЛК ЮКасса в статусе "Не оплачен". И только если 101 будет успешным, в аналитике будет 101 платеж.

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

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

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

    Александр Талалаев, чей ответ я отметил решением, дал конкретный ответ. Сразу. Понимаете?

    Я бы наверное отсоветовал использовать функцию crypt, ибо она здесь избыточна, не генерирует строку достаточного размера что будет неудобно, если целью будет получение UUID, как того советуют в доке. И вам стоит поводить мышкой по ссылкам что содержится в моих комментариях там будет библиотека генерации UUID v3, v5 на основе алгоритмов md5 и sha-1, которые для этого и должны использоваться по спецификации, вродь как, и на основе данных которые позволят вам автоматом получать уникальный UUID если содержимое заказа поменялись. Но c вашим подходом похоже что угодно прокатит.
    Правда ответ к номеру договора никакого отношения не имеет. :)

    Вы же втянули меня в такой блудняк.. но это было здорово). Уже в 10й раз говорю вам спасибо.
    В блудняк втянули себя вы. Если бы вы остановились бы и задумались банально на ПЕРВОМ вопросе, - то было бы 2 варианта продолжения. Вы бы поняли что имодентность и возня с сохранением вам не нужна, можно было бы без нее, либо вы описали такой контекст задачи что я бы понял что вам она нужна, и сразу бы предложил вариант генерации UUID на основе данных.
    Но вы с какого то перепугу решили что на той стороне провода сидит человек который не знает что такое идемпотентность, и решили обьяснять базовые вещи, приводить статьи которые к вашей задаче отношения не имеют, и нести какую то ахинею в какой-то нелепой попытке не признать что блин просто не дочитал, блин просто не задумался, блин просто решил повыпендриваться - получился блудняк и полная веселуха.

    З.Ы. Лет то сколько? Если не секрет. Как мне маме то теперь возражать?
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    Vitsliputsli, Массив через хеш таблицы как в пхп - прекрасен по скорости работы - O(1), и по функционалу - запихивай что хочешь и сколько хочешь. Ценой за это превосходство над массивом который тупо выделенная память со смещением - является дополнительный расход памяти. Ничто не дается бесплатно и реализация в пхп тяжелая ПО ПАМЯТИ. Так как разговор шел именно про ПАМЯТЬ, то я это и сказал.

    З.Ы. Помнится вы уже как то пытались защищать пхп от моих слов в теме про обработку задач, может не пойдем на те же грабли? :) Я так если чего не хейтер пхп - я на нем пишу.
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    ключ идемпонентности (Idempotence-Key) и id платежа (payment_id) - это разные вещи. Вы чего?

    Возможно - мне лень читать всю доку.

    Упростим просто для примера Idempotence-Key до номера договора.

    Если у вас УЖЕ есть уникальное поле, которое можно использовать как параметр идемпотентности, тогда ваш изначальный вопрос как его хранить или как генерировать вообще о чем? Вы не знаете как хранить номер договора? Или что значит "что использовать для ключа идемпотентности" - у вас же номер договора?

    Мдяяяя мама была права. Сколько лет то говорите?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Зачем, по вашему, создавать новый объект платежа, если данные неизменны?

    Потому что реализация идемпотентности требует ресурсов сервера? А если у вас не поделка на 3 пользователей в год к таким вещам стоит относится бережно? Потому что реализация идемпотентности требует дополнительного кода? А если у вас кодовая база не на 5 строк, а на сотни тысяч или миллионы - не нужный функционал это плохо? Потому что реализация идемпотентности требует времени программиста? А если у вас зп не аникейщика 50к в месяц, а нормальный миддл от 150к, этот праздник за их счет не нужен конторе?

    Зачем API ЮКассы обеспечивает идемпонентность запросов в 100% случаев?
    Напомню, что вы не сможете обратиться к API ЮКассы без ключа. Никак.

    АПИ ЮКассы имеет возможность идемпонентности запросов. Но обязательным оно не является что можно увидеть в доке, или в коде оф. библиотеки. Сам id платежа, ну или ключ в этой дискуссии - является обязательным потому что именно по нему вы будете обмениваться с ЮКассой о том успешен ли ваш платеж или нет.

    Это ведь не такси, зачем это им? По вашей логике, это функционал поверх необходимого.

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

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


    Требование такое, чтобы по одному и тому же номеру договора, платеж может быть только один.
    Это годами устоялось, клиент привык к такому поведению и осознанно не желает это менять.
    Привык, т.к. основной метод приема платежей работает именно так, ЮКасса подключается как дополнительный, альтернативный способ.

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

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Я не спрашивал нужна или нет. Вы не найдете такого вопроса здесь.

    Вы спросили как ее реализовать - вам задали вопрос - нахрена.

    Итак - я НЕ смогу ответить вам более подробно, чем описано в статье "Стажёр Вася и его истории об идемпотентности API", ссылку на которую я давал вам выше.

    И в 3 раз вам говорят, в вашей статье вызов АПИ блочит ресурсы, меняет состояние обьектов, вне зависимости от того успешный он или нет. Там нужна идемпотентность потому что 100 запросов утерянных по пути - приведет к тому что все ресурсы будут заблокированы, и даже сам клиент не сможет ими воспользоваться - не говоря о других клиентах. В вашем случае запрос ничего не заблокирует, если он не успешен, вы можете отправить миллион не успешных запросов - это никак не изменит состояние ресурсов, обьектов, ровно до того момента как запрос не станет успешным, как он только станет успешным вам прилетит постбэк абсолютно не связанный с плохим интернетом клиента. То есть в статье описана одна ситуация, в вашей конкретно ситуации совершенно другая. Не я понимаю что слово идемпотентность красивое звонкое, но в айти любой подход, любой инструмент, любой паттерн/антипаттерн имеет свою область применения. И вашем случае разница между этим двумя вариантами ровно одна - второй вариант потребует чуть больше кода. Все, точка - области применения нет. Выгод вы с этого не получите, только нарушение принципа KISS - Keep It Simple, Stupid - не надо тащить функционал поверх необходимого. Этот вывод можно было сделать по первому моему вопросу, если бы вы взяли на себя труд задуматься.
    По этому вы не ответили. вопрос звучал как "В чем КОНКРЕТНО в вашей ситуации". Я даже выделили заглавными буквами. Окей давайте подчеркну еще раз:
    В чем КОНКРЕТНО в вашей ситуации 2 вариант будет иметь преимущество? Две строки, один вопрос. Сможете осилить?

    Зачем яндексу - видно из статьи. Блокировка ресурсов. Более того я и раньше знал зачем нужна идемпотентность. Но мы говорим о вашем конкретном случае - обращении к АПИ платежного шлюза ЮКассы. В вашем конкретном случае - выгода в чем?

    З.Ы. Слушайте если не секрет - сколько вам лет? Обьясняю контекст вопроса - у меня мама заслуженный учитель, высшая категория, все регалии, все дела. Слава богу давно уже на пенсии, но тем не менее - у нас есть с ней давний спор, она говорит что нынешняя молодежь имеет "клиповое мышление", оно не в состоянии строить цепочки. Я всегда отвечал что мол каждое прежнее поколение ныло что молодежь глупеет. Но вот я встретил вас, человека который умудрился заблудиться в 3 фактах, и мне тупо интересно - я уже проиграл или нет?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Вы вообще со мной разговариваете? Ответы сервиса видите? - Нет!!! Сервис НЕ будет генерить ключ. Вообще. Никак. Точка! Он будет возвращать "invalid_request". Очнитесь.

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

    На этом все. Дальше можно только ходить по кругу.

    А давайте совсем просто. Что бы моя младшая дочь смогла осилить. Берем две ситуации:

    1. Ложим болт на имподентность - генерим ключ при каждой попытке оплаты. Отправляем каждый раз новый ключ.
    2. Не ложим болт на имподентность - генерим ключ один раз, сохраняем его, или пишем какую нибудь функцию генерации на основе какого нибудь Order ID, и его содержимого и отправляем один и тот же ключ.

    В чем КОНКРЕТНО в вашей ситуации 2 вариант будет иметь преимущество? Две строки, один вопрос. Сможете осилить?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    спасибо, но это именно то, что я вам скидывал и хотел, чтобы вы прочитали. Вы молодец, справились.
    Буду спать спокойно.

    Т.е. через оф. клиента платеж будет создан в любом случае, это видно в исходниках и я провел тесты.
    Да при каждой попытке оплаты они будут генерить ключ. Имподентности нет и хрен с ней. Можете считать что Idempotence-Key это у вас какой то Invoice Id. Никакая имподентность вам нахрен не нужна. Каждый раз тупо генерите ключ.

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

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

    ИИИИИИ вопрос повторяется - зачем вам этот гемморой с повторным использованием ключа? Какие ресурсы вы блокируете что бы париться? Бабки клиента? Уверяю вас если найдется платежный шлюз который будет так обращаться с бабками клиента - он вылетит в трубу. В чем цимес? Какова прибыль? Зачем? Почему? Сядьте и подумайте.

    Стоят верблюд-сын и верблюд-отец. Сын спрашивает:
    — Папа, а зачем нам на спине нужен горб?
    — В горбу, сынок мы накапливаем воду. Когда мы идём по пустыне, нас не мучает жажда.
    — Папа, а зачем нам такие копыта?
    — Это чтобы в пустыне ноги не проваливались в песок.
    — А зачем нам такие большие и жёсткие губы?
    — Это чтобы в пустыне можно было есть колючки.
    — Тогда, папа, объясни мне, на кой чёрт нам весь этот тюнинг в Саратовском зоопарке?..

    И так. Нахрена вам повторное использование ключа?

    Вы, возможно, скажете, мол как же так

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

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Расскажите потом, удалось убедить разрабов сервиса, что ключ не нужен, лишний и вот эту историю с собакой. Тут всем будет полезно.

    Обязательно. Но тут в чем трабла, попробую обьяснить проще. Ключ идемпонентности, будет ключом идемпонентности только в случае того что вы его будете хранить и использовать в повторных запросах. А без этого это будет банальный id запроса без которого никуда. А если взять и пойти чуток дальше первой строчки документации: это можно прочитать
    Если вы повторяете запрос с теми же данными и тем же ключом, API обрабатывает его как повторный. Если данные в запросе те же, а ключ идемпотентности отличается, запрос выполняется как новый.


    А если открыть скажем официальную библиотеку для работы с юкассой можно встретить код:

    if ($idempotenceKey) {
                $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotenceKey;
            } else {
                $headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
            }

    где легким движением кладется болт на всю эту вашу идемпонентность. По этому можно оставить эти фантазии насчет требований разрабов, и включив мозги вернуться к моему изначальному вопросу:
    А зачем отправлять повторно с тем же ключом?

    Иииии так - нахрена? У вас остались подсказки - помощь зала, звонок другу и 50 на 50

    З.Ы. Чего нибудь включилось? Зашуршало?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov, Пробую. В вашей ссылке обращение к апи приводили к выделению/освобождению ресурсов (такси) - и тут да, нужна идемпонентность. И если бы вы работали напрямую с счетом пользователя - да. Заблочили средства, запрос умер, повторили - а денег насчету уже не хватает, первый запрос по таймауту умер, а второй не выполнится. Потеряли свою прибыль. Куда без нее.

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

    iMedved2009
    @iMedved2009
    Andrey Dontsov, очень красивая история. В вашем случае - случае вызова платежного шлюза, оно зачем? Бабки через такси будут передаваться?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    А зачем отправлять повторно с тем же ключом?
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, потому что это не утечка. Просто процесс менеджер жрет для себя что то и не сразу освобождает
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, ну если держится стабильно - то утечек нет.
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, ну массив в пхп вещь тяжелая.
    <?php
    while(true){
       $data = array();
    for($i = 0; $i<2000000; $i++) {
        $data[] = array(
            'id' => $i
            );
    }
       var_dump(memory_get_usage(true));
       unset($data);
       var_dump(memory_get_usage(true));
    }


    а если это в консоли запустить?
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga,
    var_dump(memory_get_usage(true));
    $data = array();
    for($i = 0; $i<2000000; $i++) {
        $data[] = array(
            'id' => $i
            );
    }
    var_dump(memory_get_usage(true));
    unset($data);
    var_dump(memory_get_usage(true));
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, ну я так понимаю это вы одновременно максимум хреначите? Попробуйте дергать сколько то - на протяжении длительного времени
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, дык перед этим unset сделайте. Вы вызов коллектора делаете до того как для него работа появится