it-swarm.dev

Cara cache dinamis PHP halaman

Bagaimana cara cache PHP halaman yang memiliki permintaan mysql. Contoh apa pun akan menjadi hebat dan bermanfaat.

20
Nagy

Saya menggunakan phpFastCache (untuk hosting bersama, jika Anda tidak ingin menyentuh php.ini dan root untuk mengatur memcached). Lihat Menu Contoh. Mereka memiliki contoh detail lengkap, dan sangat mudah.

Pertama Anda mengatur dengan phpFastCache :: set dan kemudian dapatkan dengan phpFastCache :: get - DONE!

Contoh: Kurangi Panggilan Database

Situs web Anda memiliki 10.000 pengunjung yang sedang online, dan halaman dinamis Anda harus mengirim 10.000 pertanyaan yang sama ke basis data pada setiap pemuatan halaman. Dengan phpFastCache, halaman Anda hanya mengirim 1 permintaan ke DB, dan menggunakan cache untuk melayani 9.999 pengunjung lain.

<?php
    // In your config file
    include("php_fast_cache.php");
    phpFastCache::$storage = "auto";
    // you can set it to files, apc, memcache, memcached, pdo, or wincache
    // I like auto

    // In your Class, Functions, PHP Pages
    // try to get from Cache first.
    $products = phpFastCache::get("products_page");

    if($products == null) {
        $products = YOUR DB QUERIES || GET_PRODUCTS_FUNCTION;
        // set products in to cache in 600 seconds = 5 minutes
        phpFastCache::set("products_page",$products,600);
    }

   OUTPUT or RETURN your $products
?>
18
Ken Le

Preferensi saya adalah menggunakan proxy reverse caching, seperti Varnish .

Sejauh solusi PHP murni, Anda bisa memiliki beberapa kode di akhir skrip Anda yang menyimpan hasil akhir, dan kode di awal yang memeriksa untuk melihat apakah halaman di-cache. Jika halaman ditemukan dalam cache, kirim dan keluar daripada menjalankan kueri lagi.

<?php

function cache_file() {
    // something to (hopefully) uniquely identify the resource
    $cache_key = md5($_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']);
    $cache_dir = '/tmp/phpcache';

    return $cache_dir . '/' . $cache_key;
}

// if we have a cache file, deliver it
if( is_file( $cache_file = cache_file() ) ) {
    readfile( $cache_file );
    exit;
}

// cache via output buffering, with callback
ob_start( 'cache_output' );

//
// expensive processing happens here, along with page output.
//

function cache_output( $content ) {
    file_put_contents( cache_file(), $content );
    return $content;
}

Jelas ini membutuhkan banyak penyesuaian untuk pengaturan Anda, termasuk kedaluwarsa cache, $cache_key yang memenuhi kebutuhan Anda, dan deteksi kesalahan sehingga halaman yang buruk tidak di-cache.

13
Annika Backstrom

memcache html Anda dan kemudian melakukan sesuatu seperti ini: 

$memcache = memcache_connect('localhost', 11211);

$page  = $memcache->get('homepage');
if($page == ""){
    $mtime = microtime();
    $page = get_home();
    $mtime = explode(" ",$mtime);
    $mtime = $mtime[1] + $mtime[0];
    $endtime = $mtime;
    $totaltime = ($endtime - $starttime);
    memcache_set($memcache, 'homepage', $page, 0, 30);
    $page .= "\n<!-- Duly stored ($totaltime) -->";
}
else{
    $mtime = microtime();
    $mtime = explode(" ",$mtime);
    $mtime = $mtime[1] + $mtime[0];
    $endtime = $mtime;
    $totaltime = ($endtime - $starttime);
    $page .= "\n&lt;!-- served from memcache ($totaltime) -->";
}
die($page);
2
sathia
    <?php
    //settings
    $cache_ext  = '.html'; //file extension
    $cache_time     = 3600;  //Cache file expires afere these seconds (1 hour = 3600 sec)
    $cache_folder   = 'cache/'; //folder to store Cache files
    $ignore_pages   = array('', '');

    $dynamic_url    = 'http://'.$_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']; // requested dynamic page (full url)
    $cache_file     = $cache_folder.md5($dynamic_url).$cache_ext; // construct a cache file
    $ignore = (in_array($dynamic_url,$ignore_pages))?true:false; //check if url is in ignore list

    if (!$ignore && file_exists($cache_file) && time() - $cache_time < filemtime($cache_file)) { //check Cache exist and it's not expired.
        ob_start('ob_gzhandler'); //Turn on output buffering, "ob_gzhandler" for the compressed page with gzip.
        readfile($cache_file); //read Cache file
        echo '<!-- cached page - '.date('l jS \of F Y h:i:s A', filemtime($cache_file)).', Page : '.$dynamic_url.' -->';
        ob_end_flush(); //Flush and turn off output buffering
        exit(); //no need to proceed further, exit the flow.
    }
    //Turn on output buffering with gzip compression.
    ob_start('ob_gzhandler');
    ######## Your Website Content Starts Below #########
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Page to Cache</title>
        </head>
            <body>
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ut tellus libero.
            </body>
    </html>
    <?php
    ######## Your Website Content Ends here #########

    if (!is_dir($cache_folder)) { //create a new folder if we need to
        mkdir($cache_folder);
    }
    if(!$ignore){
        $fp = fopen($cache_file, 'w');  //open file for writing
        fwrite($fp, ob_get_contents()); //write contents of the output buffer in Cache file
        fclose($fp); //Close file pointer
    }
    ob_end_flush(); //Flush and turn off output buffering

    ?>
2
Rinku

Yang penting, sering diabaikan ketika ada diskusi tentang caching, adalah proses sinkronisasi untuk menghindari perlombaan utas (lihat: https://en.wikipedia.org/wiki/Race_condition ).

Skenario caching tipikal dalam PHP tanpa sinkronisasi terlihat seperti ini: jika Anda tidak memiliki sumber daya dalam cache, atau sumber daya kedaluwarsa, itu harus dibuat dan dimasukkan ke dalam cache. Utas/proses pertama yang terjadi untuk menghadapi kondisi seperti itu adalah mencoba membuat sumber daya, dan selama waktu itu, utas lainnya juga akan menciptakan sumber daya, yang mengarah pada perlombaan utas, penghancuran cache, dan penurunan kinerja.

Masalah diperbesar dengan jumlah utas dan beban kerja bersamaan yang dibuat oleh tugas penciptaan sumber daya. Pada sistem yang sibuk, ini dapat menyebabkan masalah serius.

Ada sangat sedikit sistem caching untuk PHP yang mempertimbangkan sinkronisasi.

Salah satunya adalah php-no-slam-cache: https://github.com/tztztztz/php-no-slam-cache

1
Tomasz Zadora