我可以使用PHP7改善oci8性能吗?

时间:2017-09-21 21:17:17

标签: oracle codeigniter ubuntu php-7 oci8

我的工具如下

  • Ubuntu服务器16
  • PHP7
  • OCI8
  • Oracle DB

我通过安装oracle网站上的基本和开发.rpm文件,成功运行了oci8的php7。

我能够成功连接到我的oracle数据库并通过我的网页返回数据。

我遇到的问题是执行查询的时间大约是在我的PRD服务器上使用ODBC连接和OS X(Mac)上来自实际oracle的驱动程序的两倍。我不确定为什么性能会慢两倍。特别是考虑到这个服务器的硬件功能要强大得多。

非常感谢任何帮助。

由于

编辑:在实际测量执行时间后,看起来它们在新服务器上确实更快。由于codeigniter的oci8驱动程序,页面加载似乎更慢,我不得不猜测。

1 个答案:

答案 0 :(得分:1)

DRCP连接池

来自5.3的PHP(PECL OCI8 1.3)支持Oracle数据库驻留连接池(DRCP)。 DRCP允许更有效地使用数据库机器内存并提供高可伸缩性。使用DRCP需要更改或最小的应用程序更改。

DRCP适用于使用少量数据库模式进行连接并在短时间内保持数据库连接打开的应用程序。其他应用程序应使用Oracle的默认专用数据库服务器进程,或使用共享服务器。

DRCP使所有三种连接功能受益,但在使用oci_pconnect()创建连接时具有最高的可扩展性。

要使DRCP在OCI8中可用,PHP使用的Oracle客户端库和Oracle数据库的版本必须都是11g或更高。

有关DRCP的文档可在几本Oracle手册中找到。例如,请参阅Oracle文档中的»配置数据库驻留连接池以获取用法信息。 »DRCP白皮书包含DRCP的背景信息。

要使用DRCP,请使用OCI8 1.3(或更高版本)扩展和Oracle 11g(或更高版本)库构建PHP,然后按照以下步骤操作:

As a privileged database administrator, use a program like SQL*Plus to start the connection pool in the database:

    SQL> execute dbms_connection_pool.start_pool;

Optionally use dbms_connection_pool.alter_param() to configure DRCP settings. The current pool settings can be queried from the DBA_CPOOL_INFO view.

Update the connection strings used. For PHP applications that currently connect using a Network Connect Name like MYDB:

    $c = oci_pconnect("myuser", "mypassword", "MYDB");

modify the tnsnames.ora file and add a (SERVER=POOLED) clause, for example:

    MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
           (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
           (SERVER=POOLED)))

Alternatively, modify the Easy Connect syntax in PHP and add :POOLED after the service name:

    $c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");

Edit php.ini and choose a connection class name. This name indicates a logical division of the connection pool and can be used to isolate pooling for separate applications. Any PHP applications with the same user name and connection class value will be able to share connections in the pool, giving greater scalability.

    oci8.connection_class = "MY_APPLICATION_NAME"

Run the application, connecting to the 11g (or later) database.