Необходимо один раз с бд получить данные, сделав массив ключ значение(небольшой порядко 200 элементов), и далее обращаться к этому массиву с множества копий скриптов, не обращаясь к бд, а обращаясь к тому массиву который в памяти оперативной. Можно ли так сделать, если да то куда рыть? memcache или memcached или куда рыть чтобы правильно было? php7
1. Я совсем новичек в этом языке, можете по простому на пальцах сказать что это такое APCu? 2. Ни memcache, ни memcached я в php 7 воспользоваться не смогу так? максимум 5.6 ? Да или нет? чтобы я не рыл дальше этот вопрос.
Есть сборки для седьмого. Вроде там через pecl надо, но под известные дистрибутивы уже собрали всё умные люди https://php.ru/manual/book.apcu.html Ещё есть редис, и библиотека predis для работы через php без установки доп. расширений
ты можешь мемкеш юзать, но если кроме пхп с этим кешем работать никому не надо, то проще и быстрее и удобнее юзать apcu тебе нужно два метода https://php.ru/manual/function.apcu-store.html кладёт https://php.ru/manual/function.apcu-fetch.html берёт и всё
я свое грызло всуну и немного оффтопа)) если вдруг хостинг и там нет APC можно два варианта попробовать: 1. Таблица MYSQL MEMORY - создай - залей в нее то что нужно - и периодически когда надо обновляй данные.. 2. Файл на диске с сериализованными данными.. тоже быстро будет.. если к нему часто обращаться будут - он попадет в кеш и оттуда уже совсем быстро его брать скрипты будут)
Хорошо, а как заставить дружить 7 версию, если тут только http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/ до 5.6?
https://webshake.ru/post/653 к примеру. Я же говорю, умные люди для самых известных дистрибутивов всё собрали
Так, вроде настроил memcache, на гитхабе нашел под 7.2.x версию. Одним скриптом записал, другим считал данные, вроде все норм. Теперь вопросы такие: 1. Есть массив ключ-значение в оперативной памяти, если я захочу еще небольшой массив такой же ключ-значение положить, по факту это будет один общий массив так? не два же. Просто подлиньше массив ключ-значение так? 2. Данные с этого массива, по ключу get считываться значение, если одновременно к массиву или даже к одному ключу будет множество запросов, ничего страшного? будет работать или крах будет? 3. Если понадобится выполнить метод инкремента или декримента, то есть изменить значение, при одновременном 2 и более запросе произойдет крах так? например было значение 2, одновременно 2 копии скрипта пришли увеличить значение, и получилось что должно быть 2 + 1 + 1 = 4, а будет 2 + 1 + 1 = 3, как бороться с такими вещами, куда рыть, ключевые слова подскажите пожалуйста.
Я думаю, надо очень постараться (какие-нибудь 100000 запросов в секунду, или что-то в этом роде), чтобы сервер memcache не справился с одновременными запросами, не дураки писали его, это по поводу 2 и 3. По поводу 1: если у тебя в memcache по ключу key1 лежал массив [1, 2, 3, 4], а потом ты по тому же ключу туда положил пассив [4, 5], то теперь у тебя там массив [4,5], а массив [1, 2, 3, 4] потерялся. Чтобы именно доложить, надо считать в свою программу, доложить, записать обратно. Ты пойми, memcache - отдельная программа, со своим пространством памяти, ты обращаясь к серверу через вызовы соответствующего php-класса, копируешь либо из своей области памяти в её либо обратно. Прямой доступ к чужой области памяти получить из php нельзя (в принципе, обычно и из низкоуровненных языков типа C в современных ОС нельзя, но там могут быть исключения)
ради интереса только что гуглил)) у memcache есть какие то очереди)) их используют когда несколько серверов используют один memcache сервер))
Так по apcu, поставил версию 5.1.8, она с php 7.2 работает. Смотрите, получается чтобы использовать memcache надо поставить программку, которая будет запускаться службой(винда) либо демон(юникс) и работать в фоновом режиме + будет длл(винда) файлик. Далее, если использовать acpu, то там необходим только dll файлик и все, я к тому что необходимо минимизировать зависимость от сторонних вещей. Получается лучше использовать acpu так?я и тем и тем методом могу записать и считать данные из опер.памяти выходит. И еще, а какой размер по дефолту может иметь кэш acpu? Memcache я так понял имеет 32мб, если не ошибся.
обычно кто последний тот и папа но такие методы заводят как раз чтобы такого избежать, т.е. в теории будет хорошо и правльно. потестируй.
Можете сказать, правильно ли я думаю или нет. В плане преимуществ acpu перед мемкеш под конкретную задачу. 1. В мемкеш идет свой сервер, программка + расширение(если винда). А в acpu нет этого и идет только расширение. 2. acpu это только хранилище данных ключ-значение, что мне и нужно, а в мемкеш есть и это, но и еще другие вещи, которые под данную задачу не нужны, верно ?
мемкеш можно по десяти сервакам размазать, подключение к нему возможно по сети, а apcu встроен внутрь пхп процесса и позволяет сохранять прямо живые пхп переменные, что делает его капец каким быстрым и удобным. Собственно можно сказать, это все значимые различия. но я не знаю какая у тебя задача. ты пока не сказал. То, что сказал - это общие размазанные вещи. А вот точно сказать можно будет если ответить на следующие вопросы: - нужно ли обеспечить уникальность кеша пример: мемкеш может работать на 55 серваках, и они все будут хранить что-то, а читаешь ты наобум из одного, и как бы насрать, если это список комментариев к странице, и не насрать, если это биржевые котировки - нужно ли обеспечить доступ нескольких серваков к кешу, или всё будет крутиться на одной машине - это действительно тупо кеш, или ты будешь как-то менять его записи частями, а не целиком - зачем тебе вообще кеш, если ты забираешь из бд 200 элементов? Т.е. зачем ты вообще это мутишь? Ты делал нагрузочное тестировани? Ты уверен, что это вообще нужно?
1 сервак. Будет один скрипт, на который будут долбится куча http запросов, под каждый запрос будет запущена копия скрипта. Поэтому и не хочу чтобы при каждом вызове скрипта было обращение к бд. Хочу чтобы один раз было обращение к бд при первом запуске скрипта и далее массив значений хранился в оперативной памяти, и все последующие копии скрипта брали значения из массива именно из опер.памяти сервака, он(массив) постоянен и может изменится лишь раз в неделю может или раз в месяц. Это будет нужно. Теперь интересен момент по поводу "или ты будешь как-то менять его записи частями, а не целиком" вот это. Можно ли сделать массив для другой задачи, где у ключа его значение будет инкрементироваться и декрементироваться? ну тут уже будут тысячи элементов или для этой задачи не использовать уже оперативную память?
@igordata, примажусь маленько с вопросом, но по теме )) В функции apcu_store(), что за четвертый параметр "values", для чего он используется? А то описание "Names in key, variables in value" - как-то мало о чем говорит.
это не четвёртый параметр, а просто вариант засунуть не одну переменную за раз, а целый массив. см примеры - их там два сверху.