您的位置:首页 > 编程语言 > PHP开发

在php中使用ice注意事项

2010-10-02 09:33 651 查看
因为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);
}

...
?>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: