了解一般的技术和设计,用于编写与 Oracle 数据库的使用直接相关的可管理、可伸缩的快速 PHP
代码。
在过去九年中,PHP
已经从组装个人网站的小型语言发展到为世界上某些最大和流量最高的网站提供动力。任何高流量网站的三个最重要的设计方面是可伸缩性、性能和可维护性。可伸缩性意味着您的应用程序流量负载可以不断增长,而不会从根本上破坏其工作方式。性能是快速为单个请求提供服务的能力。
可维护性是能够在不造成过多负担的情况下修复、重新调整、扩增或更改应用程序的品质。
利用 PHP
来实现这三个设计目标并不困难,但确实需要预先考虑怎么样设计和构建您的应用程序。关于编写可管理、可伸缩的快速 PHP
代码的论题范围很广;针对每个论题都有大量的技术和文章。在本文中,我们将讨论那些与使用 Oracle 及 PHP 直接相关的因素。有很多一般(非 Oracle
专用)技术和设计可能非常有用。
我喜欢以一个尖锐的警告作为任何与性能相关的谈话或文章的开始:始终要记住,最后总有一天,快速却不完善的应用程序将毫无价值。性能调整以及对应用程序不利因素的设计提取都很容易分散您的精力。Web
的性质就是这样,经常发布版本的方法非常有效。(发布网站“新版本”的成本很低,因为最终用户始终需要这些代码。)这就允许您延迟对代码的重大调整,直到需要这样做为止。因此,首要目标应该是创建便于重新调整的代码。
创建和管理连接
与 Oracle
数据库最基本的交互之一是连接。要了解连接怎么样影响您的应用程序的性能和可伸缩性,需要了解连接的生命周期,如图 1 所示。每个步骤所涉及的工作如下:
- 客户创建连接: 客户创建与 Oracle
监听器的网络连接,提供其认证证书,并请求会话。
- 服务器创建一个新会话:在认证之后,服务器为客户创建一个新会话。如果您没有通过 Oracle 多线程服务器(MTS —
它在可伸缩性及性能问题上臭名昭著)使用共享会话,则此步骤包括服务器为会话创建一个专用进程。该进程通常称为影子进程。创建此进程需要不少工作量。除了创建进程的正常开销之外,影子进程在其创建期间还必须临时锁定某些共享系统资源。
- 客户端执行查询:
既然客户端已经具有开放的连接,就可以根据需要来执行查询。
- 客户端关闭连接:
当客户端完成工作后,关闭与服务器的连接。
- 服务器毁坏会话:
与用户会话相关的影子进程被毁坏,任何未提交的事务被回滚。
图 1:连接的生命周期
由于创建新的影子进程的成本相当大,我们应该在必要时努力避开它。达到此目的的最简单方法是使用持续连接。PHP
被设计为一种非会话状态的语言。这意味着在默认情况下,在请求期间创建的任何信息(或例程化的资源)都会在请求结束时被彻底清除并毁坏。对于 Oracle
客户连接,我们希望避免这种行为。
为了使连接能够从一个请求保留到下一个请求,您可以使用以下两种连接变通方法之一:
OCIPLogin($username, $password [, $tnsname])
或
OCINLogin($username, $password [, $tnsname])
这两个函数都创建持续的服务器连接,尽管 OCINLogin()
将为每个请求创建一个新会话句柄。如果您的应用程序要使用事务,并且您希望将同时发生的事务分散到多个会话中,则可以使用 OCINLogin()。
使用持续连接的一个副作用是您更容易出现进程不足的情况。基于专用 Oracle 数据库运行单个 Apache
Web 服务器(子进程的最大默认数量为 256)时,可能从不会遇到问题。但是如果增加到 4 个 Web 服务器,每个服务器运行 256 个具有持续 Oracle
连接的子进程,现在则要创建 1024 个与 Oracle 数据库的连接,并且很快就会与 Oracle 实例的资源限制发生冲突。
在 Oracle 实例配置文件 (init.ora) 中,有两个可调整的参数:
sessions = NNNN 和 processes =
NNNN。
这两个参数控制着实例可以支持的最大会话数和最大进程数。如果您需要支持 1024 个同时出现的连接,则需要至少
1024 个会话(因为 OCINLogin()
连接和某些递归查询可能在每个连接中需要多个会话),而需要的进程还会更多(因为我们还需要考虑 Oracle
后台进程)。不幸的是,不能任意将这些进程设得很高。Oracle 进程消耗不少的专用内存(在多数系统中每个进程需要 2 到
3MB)。从个体来说,这些进程很小,但当把它们作为一组并与服务器系统全局区 (SGA)
所需要的共享内存相结合时,很快就会让您因为数据库服务器的物理内存限制而感到烦恼。
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页12 3 4 5 下一页
上一篇:使用 PHP 和 Oracle 开发企业应用程序
下一篇:PHP 5 数据对象 (PDO) 抽象层与 Oracle
|