Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Обработчик кеширования
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Приветствую, как и обещал, привожу пример кеша на PHP. Сделано это не как попытка создания быстрого кеша, который может быть реально использован по назначению (то есть, ускорению приложения), поскольку быстрота исполнения интерпретируемого кода оставляет желать лучшего.
Однако же концепция, которую я вкладываю в понятие "кеш", должна быть понятна на данном примере. Кроме того, для изучения может быть полезен просмотр кода - в плане работы с сетью через сокеты. Пример достаточно прост, не имеет множества вещей, которые были бы полезны (полной обработки ошибок, или, например, попыток повторных соединений), но, так как в любом случае интерес этот код может представлять лишь академический, а не практический, я не углублялся в такие детали.
Как это работает. Очень просто - существует кеш-сервер, который слушает входящие соединения на предопределенном порту. Он обрабатывает клиентов, которые с ним соединяются, и, если те шлют команды по протоколу, который он понимает, делает всю полезную работу - хранит кеш, предоставляет значение по ключу и т.п. Код сервера:
- на этом функции сервера завершаются. То есть он не делает ничего "активного", лишь являясь хранилищем данных и принимая запросы на их изменение/предоставление.
Теперь клиент. Здесь тоже все предельно ясно - реализован синглтон, который пытается соединиться с сервером и умеющий работать с ним по предопределенному протоколу. Этот синглтон не закрывает сокет каждый раз при обращении, что экономит сетевой оверхед. Это может быть важной деталью - если использующий клиента скрипт не предполагает поддерживаемых соединений, то, вероятно, такой подход не подойдет. Правда, это легко исправимо. Код клиента:
Пару слов о протоколе. Как это нетрудно заметить, данные, которые шлются между клиентом и сервером - обычный текст. Поэтому на помощь приходит функция serialize. Сериализуется команда, которая отправляется серверу, её параметры, а так же значение ключа, если оно передается. Клиент, соответственно, десериализует ответ при получении данных из кеша, а прочие же строки сервер отдает как есть (например,статус успешности операции установки ключа).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dubasua
Отправлено: 21 Февраля, 2013 - 16:26:32
Посетитель
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
EuGen пишет:
Код сервера:
Я так понял он запускается единожды? Допустим после старта самого сервера? И он не пускается с пользовательских скриптов.
А ему нужны какие нибудь права супер пользователя, я к тому что его реально запустить на недорогом покупном хостинге?
EuGen
Отправлено: 21 Февраля, 2013 - 16:36:10
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Запускается 1 раз. Никаких прав не нужно, единственное, что нужно - это установленное расширение сокетов для PHP (но не уверен, что можно отыскать хостинг без него).
Но этот код - хоть и рабочий, все же является лишь прототипом, поскольку по-хорошему нужно делать обработку ошибок, сброс кеша на диск в случае непредвиденной остановки и т.п.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dubasua
Отправлено: 21 Февраля, 2013 - 16:46:16
Посетитель
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
Ну таки не плохо, но все же, я пока что не увидел разницы над тем что предложил DeepVarvar.
DeepVarvar
Отправлено: 21 Февраля, 2013 - 16:47:46
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Разница в том, что во-первых, ресурс полностью разделяемый (блокировки отсутствуют в принципе, так как каждый клиент имеет свой кеш), и во-вторых, не требует специфичного shm-расширения (а вот оно-то как раз, не так часто бывает).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 21 Февраля, 2013 - 16:48:48
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
dubasua пишет:
я пока что не увидел разницы над тем что предложил DeepVarvar.
EuGen сделал "копию" мемкеша, а я предложил хранить в оперативке напрямую без стороннего "сервера". (Добавление)
Ну не суть. Суть в том какие задачи у dubasua
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
DeepVarvar пишет:
а я предложил хранить в оперативке напрямую без стороннего "сервера".
Это, кстати, порождает еще одно отличие - клиент может иметь намного меньше потребляемой памяти по сравнению с сервером (поскольку клиент может вообще не хранить данные, а только работать с ними, таким образом, количество памяти, требуемой клиенту, ограничится лишь размером, требуемым для обработки конкретного ключа (или набора ключей) из кеша)
Копия memcached - звучит громко, хотя бы потому, что все это написано на PHP. Но суть - да, та же.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dubasua
Отправлено: 21 Февраля, 2013 - 16:55:00
Посетитель
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
Хм,хм. Это к примеру если на одном хосте будут работать две одинаковые CMS, на которых работает пример DeepVarvar, то могут возникнуть парадоксы? А если будет пример EuGen, то кеш будет изолирован от каждой CMS?
EuGen
Отправлено: 21 Февраля, 2013 - 16:56:56
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
В случае с кешем, который привел в пример я, кеш-сервер вообще ничего не знает о том, кто его использует. Это могут быть CMS или CLI-скрипты или вообще даже не PHP-скрипты - разницы нет, лишь бы соблюдали протокол работы с сервером.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dubasua
Отправлено: 21 Февраля, 2013 - 17:02:27
Посетитель
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
EuGen пишет:
клиент может иметь намного меньше потребляемой памяти по сравнению с сервером
,
Я вот только начал въезжать , клиент это мой хостинг, а сервер может быть совсем в другом месте(физически) на другом айпи???
EuGen
Отправлено: 21 Февраля, 2013 - 17:04:11
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Именно так. Можете даже через WAN данные передавать. Правда, остается только посочувствовать той системе, быстродействие которой будет "улучшаться" подобным образом, поскольку скорость работы станет напрямую зависима от скорости передачи по сети и её надёжности.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dubasua
Отправлено: 21 Февраля, 2013 - 17:09:11
Посетитель
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
Дык родилась идея создать платный сервис!!! покупаем VPS и кешируем половину ru-нета (Добавление)
Тем более половина готового кода уже есть! ;)
EuGen
Отправлено: 21 Февраля, 2013 - 17:47:03
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
На трафике разоритесь. Кешировать половину рунета можно и в memcached. Никакой Америки здесь не открыто.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Shyt
Отправлено: 05 Января, 2014 - 14:46:12
Новичок
Покинул форум
Сообщений всего: 2
Дата рег-ции: Янв. 2014
Помог: 0 раз(а)
p.s Если что не судите строго, первый раз вообще смотрю на это
так всё интересно, но я много чего не смог понять, не могли бы вы мне помочь разобраться в этом примере и посмотреть как я разобрался в нем, я прогнал всё что понял но не уверен конечно что прав и остались некоторые нюансы
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.