Php простой метод кэширования для маленькой середины веб-сайтов размера

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

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

Мое решение:

"returns the count of how many words are in the entire file excluding the current line 
"updates the buffer variable Global_Word_Count to reflect this
fu! OtherLineWordCount() 
    let data = []
    "get lines above and below current line unless current line is first or last
    if line(".") > 1
        let data = getline(1, line(".")-1)
    endif   
    if line(".") < line("$")
        let data = data + getline(line(".")+1, "$") 
    endif   
    let count_words = 0
    let pattern = "\\<\\(\\w\\|-\\|'\\)\\+\\>"
    for str in data
        let count_words = count_words + NumPatternsInString(str, pattern)
    endfor  
    let b:Global_Word_Count = count_words
    return count_words
endf    

"returns the word count for the current line
"updates the buffer variable Current_Line_Number 
"updates the buffer variable Current_Line_Word_Count 
fu! CurrentLineWordCount()
    if b:Current_Line_Number != line(".") "if the line number has changed then add old count
        let b:Global_Word_Count = b:Global_Word_Count + b:Current_Line_Word_Count
    endif   
    "calculate number of words on current line
    let line = getline(".")
    let pattern = "\\<\\(\\w\\|-\\|'\\)\\+\\>"
    let count_words = NumPatternsInString(line, pattern)
    let b:Current_Line_Word_Count = count_words "update buffer variable with current line count
    if b:Current_Line_Number != line(".") "if the line number has changed then subtract current line count
        let b:Global_Word_Count = b:Global_Word_Count - b:Current_Line_Word_Count
    endif   
    let b:Current_Line_Number = line(".") "update buffer variable with current line number
    return count_words
endf    

"returns the word count for the entire file using variables defined in other procedures
"this is the function that is called repeatedly and controls the other word
"count functions.
fu! WordCount()
    if exists("b:Global_Word_Count") == 0 
        let b:Global_Word_Count = 0
        let b:Current_Line_Word_Count = 0
        let b:Current_Line_Number = line(".")
        call OtherLineWordCount()
    endif   
    call CurrentLineWordCount()
    return b:Global_Word_Count + b:Current_Line_Word_Count
endf

"returns the number of patterns found in a string 
fu! NumPatternsInString(str, pat)
    let i = 0
    let num = -1
    while i != -1
        let num = num + 1
        let i = matchend(a:str, a:pat, i)
    endwhile
    return num
endf

Это тогда добавляется к строке состояния:

:set statusline=wc:%{WordCount()}

я надеюсь, что это помогает любому ищущему живой подсчет слов в Vim. Хотя тот, который не всегда точен. Кроме того, конечно, g ctrl-g предоставит Вам подсчет слов Vim!

5
задан Hossain Khan 5 October 2009 в 19:06
поделиться

5 ответов

Memcached приходит на ум, как действительно легкое и эффективное решение.

Но вы также можете кэшировать содержимое в простых файлах. Файловая система обычно быстрая и без проблем обрабатывает блокировки чтения/записи. И нет необходимости в какой-нибудь причудливой библиотеке для работы с этим... функции filemtime, file_put_contents и file_get_contents - это все, что вам нужно.

  1. Проверьте, не был ли кэш написан более N секунд назад с помощью filemtime()
  2. Если он слишком старый, сгенерировать содержимое и записать его с помощью file_put_contents()
  3. Если нет, просто загрузите его с помощью file_get_contents()

Edit: Я добавлю ссылку на запись, которую я сделал несколько месяцев назад : Лучшее решение для кэширования. Это не совсем по теме, но может помочь вам в ваших исследованиях :)

.
2
ответ дан 15 December 2019 в 01:06
поделиться

Кэширование на основе сеанса, вероятно, не лучшая идея. Это подходит только в ограниченных случаях, когда вам нужно кэшировать определенный результат для каждого пользователя (не для всех).

APC довольно широко развернут, поэтому, если у вас есть к нему доступ, я бы посмотрел на Zend_Cache с APC на внутренней стороне. Если APC недоступен, Zend_Cache с плоскими файлами на сервере будет достаточно для сайтов малого / среднего типа

1
ответ дан 15 December 2019 в 01:06
поделиться

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

0
ответ дан 15 December 2019 в 01:06
поделиться

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

<?php

function callback($buffer)
{
  // Code to store output in cache
}

if (/* Test cached copy is still valid */) {
    /* Output cached copy to browser */
    exit(0);
}

ob_start("callback");
?>

<html>...</html>

<?php
ob_end_flush();
?>

При желании можно опустить ob_end_flush(), т.к. она сработает автоматически в конце вывода.

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

.
0
ответ дан 15 December 2019 в 01:06
поделиться

JPCache - приличная легкая библиотека кэширования.

1
ответ дан 15 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: