Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何最好地在服务器上缓存整个HTML输出_Php_Apache_Caching_Memcached - Fatal编程技术网

Php 如何最好地在服务器上缓存整个HTML输出

Php 如何最好地在服务器上缓存整个HTML输出,php,apache,caching,memcached,Php,Apache,Caching,Memcached,我有一个相当基本的网站,用纯php编写,没有使用框架,运行在基本的LAMP环境中 该站点根据HTTP用户代理头和一些查询字符串参数动态生成标记。例如,“itemdail.php”将检查querystring参数“itemid”和用户代理头并生成一些标记 我想缓存这个标记,以便下次当查询字符串中具有相同用户代理和itemid的设备尝试请求页面时,它只会转储缓存中的任何标记 我意识到我可以使用memcache在php中手动执行此操作,只需在页面顶部编写一些代码来检查相关参数,然后尝试从memcach

我有一个相当基本的网站,用纯php编写,没有使用框架,运行在基本的LAMP环境中

该站点根据HTTP用户代理头和一些查询字符串参数动态生成标记。例如,“itemdail.php”将检查querystring参数“itemid”和用户代理头并生成一些标记

我想缓存这个标记,以便下次当查询字符串中具有相同用户代理和itemid的设备尝试请求页面时,它只会转储缓存中的任何标记

我意识到我可以使用memcache在php中手动执行此操作,只需在页面顶部编写一些代码来检查相关参数,然后尝试从memcached提供服务,或者呈现页面并将标记存储在memcached中,但我想可能完全避免使用php层,使用类似于这里描述的东西

因此,我的问题是,我意识到这可能是模糊的,这篇文章将被杀:


这里推荐的缓存实现是什么?确实是在php级别使用memcache,还是apache模块足以满足我的需要?

根据用户代理生成不同的页面是一种糟糕的做法。你不应该那样做。 如果您想缓存整个页面,因为您的网站运行缓慢,那么可能必须在代码中搜索该问题

关于主题:编写一个简单的函数,用一个占用空间小的哈希函数(md5,sha1,…)对提供的uri进行哈希 e、 g


如果你对OpenCart很熟悉,我写了一些东西来做这件事。考虑到可能的不熟悉情况,希望你能得到这个想法
上下文

ob_start();
$enableCaching = false; // Boolean flag

$route = !isset($_GET['route']) ? 'home' : str_replace("/",'-',$_GET['route']);
$cacheFile = DIR_CACHE . $route . '.' . md5($_SERVER['QUERY_STRING']) . ".cache.tpl";

if ($enableCaching !== false && in_array($_GET['route'], $cachePages) && file_exists($cacheFile) ||
    $enableCaching !== false && file_exists($cacheFile) && !isset($_GET['route'])) {
    /**
     * This block of code will output the contents of the cache file.
     */
    require ($cacheFile);
}
else {
    /**
     * Cache file doesn't exist, process the request
     */ 
    $response->output();    

    if($enableCaching !== false && in_array($_GET['route'], $cachePages) || 
       $enableCaching !== false && !isset($_GET['route'])){
        file_put_contents($cacheFile, str_replace(array("\n","\r","\t"),'', str_replace("  "," ",ob_get_contents())));  
    }
}
基本上,创建一个基于文件名和任务字符串生成唯一文件名的变量。 创建该文件,将所有HTML输出写入该文件


然后,在处理请求时,您可以检查是否存在唯一的缓存文件,然后发送该文件,而不是处理请求。

使用memcached库。。。
您必须先安装它,然后memcached为php提供了内存缓存系统

好的,用户代理的功能是根深蒂固的。它是一个针对移动设备的内容销售网站,因此不同的设备可以获得不同的内容。使用您的解决方案,您将如何清除缓存?一个用于清空缓存文件夹的cron,或者其他什么?您可以编写一个cron,它只需检查所有缓存文件的创建时间(例如,使用scandri()和filemtime()),并在文件太旧时将其删除。您也可以在回显缓存内容之前执行此操作,但随后会产生额外的开销,即检查文件的时间戳。
ob_start();
$enableCaching = false; // Boolean flag

$route = !isset($_GET['route']) ? 'home' : str_replace("/",'-',$_GET['route']);
$cacheFile = DIR_CACHE . $route . '.' . md5($_SERVER['QUERY_STRING']) . ".cache.tpl";

if ($enableCaching !== false && in_array($_GET['route'], $cachePages) && file_exists($cacheFile) ||
    $enableCaching !== false && file_exists($cacheFile) && !isset($_GET['route'])) {
    /**
     * This block of code will output the contents of the cache file.
     */
    require ($cacheFile);
}
else {
    /**
     * Cache file doesn't exist, process the request
     */ 
    $response->output();    

    if($enableCaching !== false && in_array($_GET['route'], $cachePages) || 
       $enableCaching !== false && !isset($_GET['route'])){
        file_put_contents($cacheFile, str_replace(array("\n","\r","\t"),'', str_replace("  "," ",ob_get_contents())));  
    }
}