因为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. } } ?>
因为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中用Ice_getProperties这一个函数,可以得到属性配置信息,如果Ice_getProperties()不添加任何参数,那就返回默认的属性。
如果你添加了一个名字,那就返回与名字相同的属性,如Ice_getProperties("Production")属性;
如果每次请求都实例化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); } ... ?>