在php中使用ice注意事项

因为php是作为一脚本解释执行的,所以在ice中,只能用来作客户端,因为php不支持多线程。因为php脚本固有的一些性质,所以在使用

php的时候要注意一些地方,这些地方是影响php与ice使用性能的地方。

常规写法

在php去使用ice一般会有如下的代码

<?php require 'Ice.php'; require 'Hello.php';  $communicator = null;  try { $data = new Ice_InitializationData; $data->properties = Ice_createProperties(); $data->properties->load("props.cfg"); $communicator = Ice_initialize($data); $proxy = $communicator->stringToProxy("..."); $hello = Demo_HelloPrxHelper::checkedCast($proxy); $hello->sayHello(); } catch(Ice_LocalException $ex) { // Deal with exception... }  if($communicator) { try { $communicator->destroy(); } catch(Ice_LocalException $ex) { // Ignore. } } ?>

 

自动释放Communicator对象 

因为php脚本有一个特点就是当请求结束时,php脚本解释器会释放所有的与刚才请求相关的资源和对像,所以我们没有必要人为的去释放

php中通信器($communicator),可以把代码写成如下的方式

<?php require 'Ice.php'; require 'Hello.php';  try { $data = new Ice_InitializationData; $data->properties = Ice_createProperties(); $data->properties->load("props.cfg"); $communicator = Ice_initialize($data); $proxy = $communicator->stringToProxy("..."); $hello = Demo_HelloPrxHelper::checkedCast($proxy); $hello->sayHello(); } catch(Ice_LocalException $ex) { // Deal with exception... } ?> 

这样也提高的了php的执行效率,也节省了代码。

 

属性配置文件

如果每次请求都去读取ice的配置文件,php在读取文件时的效率不是很高,因为任何与系统调用都会有不小的开销,

可以在php.ini中配置一下ice的属性,所以在web 服务器启动的时候就加载,每一次请求的时候就没有必要在重新加载配置文件了。

 

; Snippet from php.ini on Linux extension=IcePHP.so ice.config=/opt/MyApp/default.cfg ice.options="--Ice.Override.Timeout=2000" 

但是现有也有一个问题,可能在web服务器中有多个应用程序,每一个应用程序都有一同的配置属性,那就在php.ini中的配置就得作如下改动。

 

; Snippet from php.ini on Linux

ice.profiles=/opt/MyApp/profiles

在profiles文件中可以这样写,也就是每一个应用的名字用中括号,如[Production],[Debug]:

[Production]

config=/opt/MyApp/prod.cfg

options="..."

[Debug]

config=/opt/MyApp/debug.cfg

options="--Ice.Trace.Network=3 ..."

 

 

每一个应用程序都可以配置不同的属性,只根加名字区别就可以了

在php中使用属性

在php中用Ice_getProperties这一个函数,可以得到属性配置信息,如果Ice_getProperties()不添加任何参数,那就返回默认的属性。

如果你添加了一个名字,那就返回与名字相同的属性,如Ice_getProperties("Production")属性;

 

在session中保存通信器(Communicators)

如果每次请求都实例化Communicators,那么此开销是相当的大,ice为了提升性能,特别用几个有用的函数来解决此问题

Ice_register($communicator, $name, $expires=0)

此函数就是把一个Communicators放到session中,第一个参数$communicator是一个Communicator的实例,第一个参数是名字,

第三个参数是此$communicators的有交期,默认是一直有效.

Ice_unregister($name)

这一个函数和刚才Ice_register正好相反,他是释放名字为$name的Communicator对象。

Ice_find($name)

此函数是取出名字为$name且已经用Ice_register放进session中的Communicator对象。

 

我们现在的代码可以写成这样。

<?php require 'Ice.php';  $communicator = Ice_find('MyCommunicator'); $expires = ...; if($communicator == null) { $communicator = Ice_initialize(...); Ice_register($communicator, 'MyCommunicator', $expires); }  ... ?> 

 

 

你可能感兴趣的:(多线程,PHP,session,服务器,脚本,web服务)