Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->PHP4/PHP5 ->正文

可扩展 可伸缩的 Oracle 与 PHP

来源: ORACLE 作者:webmaster 时间:2007-04-16 点击: [收藏] [投稿]

卸载静态内容。如果 Web 应用程序中的页面一般包含九幅图像,则发送到您的 Web 服务器的请求中只有百分之十实际上使用了为其分配的持续连接。换句话说,百分之九十的请求正在浪费有用的(从可伸缩性的观点来看,还是成本很高的)Oracle 连接句柄。您的目标应该是确保只有那些需要 Oracle 连接(或至少需要动态内容)的请求才能接受动态 Web 服务器的服务。这会增加由每个进程所完成的与 Oracle 相关的工作量,而这又会减少生成动态内容所需的子进程数量。

改善这种状况的最简单方法是将您的所有图像卸载到单独的 Web 服务器(或一组 Web 服务器)上。这非常容易。第一步是建立第二个 Web 服务器处理静态请求。虽然您可以为此而使用 Apache,但是还有些专门擅长于为静态数据提供服务的其他 Web 服务器(例如 tux 和 thttpd),它们的结果或许更好。应该建立这个 Web 服务器,为另外子域的请求提供服务。常见做法是将 "www.example.com" 的图像流量委托管给 "images.example.com"。某些硬件负载均衡器实际上允许您为同一域中的图像提供服务,并在内部进行分配 - 有关详细信息请查看负载均衡器文档。

一旦建立了域,就应该创建一个全局配置文件,它包含您在整个应用程序中使用的所有全局常数,并应该至少添加下面一行:

define(CDN_URL, "http://images.example.com");

此文件可以手动地包含在每个文件的顶部,或者可以在 php.ini 配置文件中添加下行,从而在每个脚本开始时能够自动运行该文件:

auto_prepend_file = /path/to/config.inc

现在,不管何时在 HTML 中创建图像标记,都应该添加以下代码:

<img src="<?= CDN_URL ?>/path/to/image.png">

如果您更愿意拥有标记编写库,则可以编写一个图像标记创建函数,如下所示:

function img_tag($local_uri, $attr)
{
$attribute = '';
foreach ($attr as $k=>$v) {
$k = urlencode($k);
$v = urlencode($v);
$attribute .= " $k=\"$v\" ";
}
return "<img src=\"".CDN_URL."$local_uri\" $attribute>";
}

即使不准备立即使用图像专用网络,还是应该对您的应用程序进行编码,为图像使用单独的基础路径,并简单地将其设置如下:

define(CDN_URL, "http://www.example.com/images");

这允许您在任何时候仅仅更改单行代码,就将整个网站削减为一个替代性的图像服务网络。根据您的网站中静态内容/图像的比例,可以看到服务器资源明显减少甚至极大地减少。在一个客户端,将静态内容从 Apache 移动到专用的系列 thttpd 箱中,可以使它们的总体基础架构减少百分之五十。

为什么要在不必工作的时候而工作呢?对任何查询的最终性能增强是根本不运行查询。很多“动态”Web 页面实际上不是动态的,在短期时间内纯粹是静态的。假设有一个新网站:在新闻项目更新之前,其内容并不改变。无论这种更新是每分钟发生还是每小时发生,在两次更新之间,网站是静态的。这意味着,不必为每个页面请求而在当前新闻项目中进行数据库查找,只需在每个更新周期中作一次查找。

最简单类型的高速缓存是全页随需高速缓存。在这种情况下,当请求到来时,应用程序在高速缓存中查找所需文件。如果存在高速缓存的副本,则将其返回给请求者;否则创建一个高速缓存副本,并将其返回给用户。要刷新高速缓存,只需简单地将旧的高速缓存副本删除即可 - 下一个请求将会自动重新生成高速缓存。

图 2 显示了我们希望完成的流程图:当一个请求需要 /archive/123.html 时,Web 服务器应该查看该文件是否实际存在。如果该文件存在,则返回该文件。如果该文件不存在,用户会被重定向到一个 PHP 页面 generate.php,并将页面标识符 "123" 作为参数传递。随后该页面生成页面的高速缓存项。在 Apache 环境中,执行这种高速缓存查找的两种典型方法是使用自定义的 ErrorHandler 或者 mod_rewrite。mod_rewrite 提供更好的灵活性,因此我将实施这种方法。

图 2:全页随需高速缓存流程图

首先,需要在 httpd.conf 中建立重写规则。以下是一个示例片段:

RewriteEngine   On
RewriteConf %{REQUEST_FILENAME} ^/archive/[0-9]+\.html
RewriteConf %{REQUEST_FILENAME} !-f
RewriteRule ^/archive/([0-9]+)\.html /generate.php?id=$1

此示例首先启动重写引擎,然后说明将会重写任何与归档模式 (^/archive/[0-9]+\.html) 相匹配并且不存在 (!-f) 的被请求文件名,将页面标识符作为参数传递,转到生成页面处。

生成器页面同样很简单:

<?php
$id = $_GET['id'];
$dbh =& new DB_Oracle_TestDB;
$cursor =& $dbh->execute("SELECT content FROM news WHERE id = $id");
$result = $cursor->fetch();
if(!$result) {
header("HTTP/1.0 404 Not Found");
exit
}
} else
echo $result['CONTENT'];

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:使用 PHP 和 Oracle 开发企业应用程序   下一篇:PHP 5 数据对象 (PDO) 抽象层与 Oracle

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号