За последние 24 часа нас посетили 53525 программистов и 1712 роботов. Сейчас ищут 905 программистов ...

Данные в оперативной памяти

Тема в разделе "PHP для новичков", создана пользователем ivanisoff, 28 фев 2018.

  1. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Необходимо один раз с бд получить данные, сделав массив ключ значение(небольшой порядко 200 элементов), и далее обращаться к этому массиву с множества копий скриптов, не обращаясь к бд, а обращаясь к тому массиву который в памяти оперативной. Можно ли так сделать, если да то куда рыть?

    memcache или memcached или куда рыть чтобы правильно было?

    php7
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    1. Я совсем новичек в этом языке, можете по простому на пальцах сказать что это такое APCu?
    2. Ни memcache, ни memcached я в php 7 воспользоваться не смогу так? максимум 5.6 ? Да или нет? чтобы я не рыл дальше этот вопрос.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Есть сборки для седьмого. Вроде там через pecl надо, но под известные дистрибутивы уже собрали всё умные люди
    https://php.ru/manual/book.apcu.html

    Ещё есть редис, и библиотека predis для работы через php без установки доп. расширений
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты можешь мемкеш юзать, но если кроме пхп с этим кешем работать никому не надо, то проще и быстрее и удобнее юзать apcu

    тебе нужно два метода
    https://php.ru/manual/function.apcu-store.html кладёт
    https://php.ru/manual/function.apcu-fetch.html берёт

    и всё
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я свое грызло всуну и немного оффтопа)) если вдруг хостинг и там нет APC можно два варианта попробовать:
    1. Таблица MYSQL MEMORY - создай - залей в нее то что нужно - и периодически когда надо обновляй данные..
    2. Файл на диске с сериализованными данными.. тоже быстро будет.. если к нему часто обращаться будут - он попадет в кеш и оттуда уже совсем быстро его брать скрипты будут)
     
  7. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    APCu надо какой то компонент ставить, не вшито же это?
     
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    это расширение к php - надо на сервере устанавливать..
     
  9. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    https://webshake.ru/post/653 к примеру. Я же говорю, умные люди для самых известных дистрибутивов всё собрали
     
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    точно так же как и мемкеш
     
  13. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Так, вроде настроил memcache, на гитхабе нашел под 7.2.x версию. Одним скриптом записал, другим считал данные, вроде все норм. Теперь вопросы такие:

    1. Есть массив ключ-значение в оперативной памяти, если я захочу еще небольшой массив такой же ключ-значение положить, по факту это будет один общий массив так? не два же. Просто подлиньше массив ключ-значение так?
    2. Данные с этого массива, по ключу get считываться значение, если одновременно к массиву или даже к одному ключу будет множество запросов, ничего страшного? будет работать или крах будет?
    3. Если понадобится выполнить метод инкремента или декримента, то есть изменить значение, при одновременном 2 и более запросе произойдет крах так? например было значение 2, одновременно 2 копии скрипта пришли увеличить значение, и получилось что должно быть 2 + 1 + 1 = 4, а будет 2 + 1 + 1 = 3, как бороться с такими вещами, куда рыть, ключевые слова подскажите пожалуйста.
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я думаю, надо очень постараться (какие-нибудь 100000 запросов в секунду, или что-то в этом роде), чтобы сервер memcache не справился с одновременными запросами, не дураки писали его, это по поводу 2 и 3.

    По поводу 1: если у тебя в memcache по ключу key1 лежал массив [1, 2, 3, 4], а потом ты по тому же ключу туда положил пассив [4, 5], то теперь у тебя там массив [4,5], а массив [1, 2, 3, 4] потерялся. Чтобы именно доложить, надо считать в свою программу, доложить, записать обратно. Ты пойми, memcache - отдельная программа, со своим пространством памяти, ты обращаясь к серверу через вызовы соответствующего php-класса, копируешь либо из своей области памяти в её либо обратно. Прямой доступ к чужой области памяти получить из php нельзя (в принципе, обычно и из низкоуровненных языков типа C в современных ОС нельзя, но там могут быть исключения)
     
    Алекс8 нравится это.
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    ради интереса только что гуглил)) у memcache есть какие то очереди)) их используют когда несколько серверов используют один memcache сервер))
     
  16. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Так по apcu, поставил версию 5.1.8, она с php 7.2 работает.

    Смотрите, получается чтобы использовать memcache надо поставить программку, которая будет запускаться службой(винда) либо демон(юникс) и работать в фоновом режиме + будет длл(винда) файлик.

    Далее, если использовать acpu, то там необходим только dll файлик и все, я к тому что необходимо минимизировать зависимость от сторонних вещей. Получается лучше использовать acpu так?я и тем и тем методом могу записать и считать данные из опер.памяти выходит.

    И еще, а какой размер по дефолту может иметь кэш acpu? Memcache я так понял имеет 32мб, если не ошибся.
     
  17. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Какой dll к черту ? Вы на локальной винде тестите или у вас там сервак на оной ?
     
  18. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Да локальная, в смысле к черту? а че там само по себе работать будет чтоли
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    обычно кто последний тот и папа но такие методы заводят как раз чтобы такого избежать, т.е. в теории будет хорошо и правльно. потестируй.
     
  20. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Можете сказать, правильно ли я думаю или нет. В плане преимуществ acpu перед мемкеш под конкретную задачу.
    1. В мемкеш идет свой сервер, программка + расширение(если винда). А в acpu нет этого и идет только расширение.
    2. acpu это только хранилище данных ключ-значение, что мне и нужно, а в мемкеш есть и это, но и еще другие вещи, которые под данную задачу не нужны, верно ?
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мемкеш можно по десяти сервакам размазать, подключение к нему возможно по сети, а apcu встроен внутрь пхп процесса и позволяет сохранять прямо живые пхп переменные, что делает его капец каким быстрым и удобным. Собственно можно сказать, это все значимые различия.

    но

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

    - нужно ли обеспечить доступ нескольких серваков к кешу, или всё будет крутиться на одной машине

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

    - зачем тебе вообще кеш, если ты забираешь из бд 200 элементов? Т.е. зачем ты вообще это мутишь? Ты делал нагрузочное тестировани? Ты уверен, что это вообще нужно?
     
  22. ivanisoff

    ivanisoff Новичок

    С нами с:
    12 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    1 сервак. Будет один скрипт, на который будут долбится куча http запросов, под каждый запрос будет запущена копия скрипта. Поэтому и не хочу чтобы при каждом вызове скрипта было обращение к бд. Хочу чтобы один раз было обращение к бд при первом запуске скрипта и далее массив значений хранился в оперативной памяти, и все последующие копии скрипта брали значения из массива именно из опер.памяти сервака, он(массив) постоянен и может изменится лишь раз в неделю может или раз в месяц.

    Это будет нужно.

    Теперь интересен момент по поводу "или ты будешь как-то менять его записи частями, а не целиком" вот это. Можно ли сделать массив для другой задачи, где у ключа его значение будет инкрементироваться и декрементироваться? ну тут уже будут тысячи элементов или для этой задачи не использовать уже оперативную память?
     
  23. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @igordata, примажусь маленько с вопросом, но по теме )) В функции apcu_store(), что за четвертый параметр "values", для чего он используется? А то описание "Names in key, variables in value" - как-то мало о чем говорит.
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это не четвёртый параметр, а просто вариант засунуть не одну переменную за раз, а целый массив. см примеры - их там два сверху.
     
    Deonis нравится это.