Кэширование PHP без вмешательства в права доступа к файлам (также, как имитировать переменные приложения ASP в PHP)

Я пытаюсь реализовать какое-то кеширование в сценарии PHP, который будет распространяться на множество разных клиентов / сайтов, которые будут развертываться довольно нетехническими пользователями с использованием различных веб-хостов. Из-за нетехнического характера пользователей я бы не хотел просить их настраивать права доступа к файлам. Кеширование должно осуществляться между сеансами, поэтому использование переменных сеанса не допускается. Если бы я кодировал это в ASP, я бы использовал переменные приложения, но они не существуют в PHP (насколько мне известно)

Есть ли у кого-нибудь предложения о том, как это сделать?

Вот некоторые возможности, которые я рассмотрел, любые комментарии по ним были бы полезны:

  • Кэширование через файлы в системных временных папках - я мог бы использовать sys_get_temp_dir () (или какую-нибудь аналогичную функцию на PHP4), чтобы помочь найти такую ​​папку. Недостаток здесь в том, что он, вероятно, не будет работать на хостах, использующих ограничение openbase_dir.
  • На каком-то веб-сайте, на который я смотрел, упоминалось, что PHP обманом заставил все пользовательские сеансы использовать одно и то же состояние сеанса, тем самым заставляя переменные сеанса действовать как переменные сеанса. Конечно, сейчас я не могу найти этот пост ... Все равно это кажется страшным. (Я дополню этот вопрос ссылкой на этот пост, как только найду его снова)
  • Использование стороннего хранилища данных, такого как Amazon Simple Storage Service - кажется излишним
  • Кэшируйте данные на сервере, который я контролирую, и пусть клиент загружает оттуда новые данные при каждом обращении.

Еще раз, любые комментарии к этим идеям или любые новые были бы признательны.

ОБНОВИТЬ: Я пробовал использовать session_id () для использования общего состояния сеанса, но это не сработало. Каждая сессия поддерживает свой собственный "GlobalCache", есть идеи, почему ?:

// This code doesn't work, but the similar code in my answer does!

function test() {
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;


    $count = get_cache( 'count' );

    print "pre application count: $count<br>";

    if ( !$count )
        $count = 0;

    $count++;

    print "session_id: " . session_id() . "<br>";
    print "post application count: $count<br>";
    print "session_count: " . $_SESSION['session_count'] . "<br>";

    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = session_id();
    print "old_session (set): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (set): " . session_id() .  "<br>";

    $_SESSION[$name] = $value;
    session_id( $old_session );
}

function get_cache( $name ) {
    $old_session = session_id();
    print "old_session (get): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (get): " . session_id() .  "<br>";

    $value = $_SESSION[$name];
    session_id( $old_session );
    return $value;
}

session_start();
test();

ОБНОВИТЬ: некоторые предлагали использовать memcached, что на самом деле является отличным решением для некоторых, но, поскольку у меня нет контроля над средой конечного сервера, это не вариант. Идея состоит в том, чтобы иметь сценарий, который люди могут просто использовать FTP до учетной записи общего хостинга, которая просто работает из коробки.

ОБНОВИТЬ: кто-то предложил создать мою собственную папку кеша с помощью скрипта, но разве мне не нужно создавать такую ​​папку внутри папки, у которой уже есть права на запись?

ОБНОВЛЕНИЕ, РЕШЕНИЕ НАЙДЕНО: В итоге я выяснил проблемы в моем сценарии глобального сеанса и опубликовал свой собственный ответ на этот счет. Спасибо всем за помощь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
609
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я голосую за "Кэшировать данные на сервере, который я контролирую, и предлагать клиенту загружать оттуда новые данные при каждом обращении".

Все остальные пути ведут к определенному безумию.

Вы можете использовать сеансы с фиксированным ключом сеанса.

http://de.php.net/manual/en/function.session-id.php:

session_id([id]) is used to get or set the session id for the current session. If id is specified, it will replace the current session id. session_id() needs to be called before session_start() for that purpose.

Используйте свой собственный каталог кеша в каталоге вашего приложения. Таким образом, вам не придется бороться с различными настройками сервера и / или PHP, и вы получите лучшую переносимость.

И убедитесь, что подкаталог кеша создается PHP во время первого запуска, поэтому он является владельцем каталога и может писать в него позже.

Milan Babuškov 22.01.2009 22:41

… И защитите его от запросов из Интернета.

Gumbo 22.01.2009 22:43

Проверьте memcached для php - он действительно хорошо работает.

http://www.php.net/memcache

memcache - это круто, но здесь это не вариант, поскольку я не контролирую сервер, на котором будут развернуты копии моего скрипта.

Tristan Havelick 23.01.2009 04:19
Ответ принят как подходящий

Хорошо, я понял, как это сделать, эмулируя переменные приложения в стиле ASP с использованием общего / глобального состояния сеанса. Два ключевых изменения из моего неработающего кода в соответствующем обновлении:

  1. Чтобы переключить состояние сеанса, мы должны завершить текущий сеанс, переключиться на новый, а затем запустить его. Я инкапсулировал этот процесс в switch_session ()

  2. Поскольку мы переключаем идентификаторы сеансов, мы должны буферизовать вывод страницы с помощью ob_start () / ob_end_flush (), чтобы cookie сеанса не отправлялся слишком рано.

Далее следует полный рабочий код (тоже очищенный!). Это можно легко проверить, загрузив страницу в окнах IE и Firefox и перезагрузив каждую по несколько раз, чтобы увидеть рост счетчиков:

<?php
function test() {

    // Do a regular session count
    print "session_id: " . session_id() . "<br>";
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;
    print "session count: " . $_SESSION['session_count'] . "<br>";


    // Do an application count
    $count = get_cache( 'count' );
    if ( !$count ) $count = 0;
    $count++;
    print "application count: $count<br>";
    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = switch_session("GlobalCache");
    $_SESSION[$name] = $value;
    switch_session( $old_session );
}

function get_cache( $name ) {
    $old_session = switch_session("GlobalCache");
    $value = $_SESSION[$name];
    switch_session( $old_session );
    return $value;
}

function switch_session( $session_id ) {

    // switch the session and return the original
    $old_id = session_id();

    session_write_close();
    session_id($session_id);
    session_start();
    return $old_id;
}

ob_start();
session_start();
test();
ob_end_flush();
?>

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

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

Другие вопросы по теме