@liyuj
2017-04-12T14:16:16.000000Z
字数 4834
阅读 3520
Apache-Ignite-1.9.0-中文开发手册
PHP提供了一个轻量级、一致的接口来访问数据库,叫做PHP数据对象-PDO,这个扩展依赖于若干特定数据库的PDO驱动,其中之一是PDO_ODBC,它可以接入任何实现了自己的ODBC驱动的数据库。
通过使用Ignite的ODBC驱动,从PHP应用中就可以接入Ignite集群,然后访问和修改数据,本文就会介绍如何达到该目的。
Ignite遵守ODBC协议,并且实现了自己的ODBC驱动,这个驱动会用于PHP的PDO框架接入Ignite集群。
查看本系列文档的ODBC部分,可以知道如何在目标系统上安装和配置这个驱动,安装完毕后,就可以进入下一个章节。
只能使用Ignite的1.8.0及以后的版本中的ODBC驱动,之前的版本不支持PHP的PDO框架。
要安装PHP,PDO以及PDO_ODBC驱动,可以看PHP的相关资源。
extension=php_pdo_odbc.dll的注释去掉,并且确保extension_dir指向php_pdo_odbc.dll所在的目录,另外,这个目录还需要加入PATH环境变量;php5-odbc;PHP PDO准备就绪之后,就可以通过一个常规的配置启动Ignite集群,然后在PHP应用中接入集群并且查询和修改集群的数据。
首先,集群端已经起用了ODBC处理器,如何做呢,在每个集群节点的IgniteConfiguration中加入odbcConfiguration就可以了。
下一步,列出IgniteConfiguration中与特定数据模型有关的所有缓存的配置,因为之后要在PHP PDO端执行SQL查询,所有每个缓存的配置都需要包含一个QueryEntity的定义,可以查看有关SQL查询的文档,来了解有关QueryEntity和SQL查询的更多信息。
可以使用下面的配置模板启动一个Ignite集群:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"><!-- Enabling ODBC. --><property name="odbcConfiguration"><bean class="org.apache.ignite.configuration.OdbcConfiguration"></bean></property><!-- Configuring cache. --><property name="cacheConfiguration"><list><bean class="org.apache.ignite.configuration.CacheConfiguration"><property name="name" value="Person"/><property name="cacheMode" value="PARTITIONED"/><property name="atomicityMode" value="TRANSACTIONAL"/><property name="writeSynchronizationMode" value="FULL_SYNC"/><property name="queryEntities"><list><bean class="org.apache.ignite.cache.QueryEntity"><property name="keyType" value="java.lang.Long"/><property name="valueType" value="Person"/><property name="fields"><map><entry key="firstName" value="java.lang.String"/><entry key="lastName" value="java.lang.String"/><entry key="resume" value="java.lang.String"/><entry key="salary" value="java.lang.Integer"/></map></property><property name="indexes"><list><bean class="org.apache.ignite.cache.QueryIndex"><constructor-arg value="salary"/></bean></list></property></bean></list></property></bean></list></property></bean></beans>
要从PHP PDO端接入Ignite,需要正确地配置DSN,在下面的示例中,假定DSN名为LocalApacheIgniteDSN。
注意,PHP PDO端必须配置使用DSN。
最后,都配置好之后,就可以在Ignite和PHP PDO应用之间相互连接了,可以像下面这样执行一些查询:
Insert:
<?phptry {// Connecting to Ignite using pre-configured DSN.$dbh = new PDO('odbc:LocalApacheIgniteDSN');// Changing PDO error mode.$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// Preparing query.$dbs = $dbh->prepare('INSERT INTO Person (_key, firstName, lastName, resume, salary)VALUES (?, ?, ?, ?, ?)');// Declaring parameters.$key = 777;$firstName = "James";$lastName = "Bond";$resume = "Secret Service agent";$salary = 65000;// Binding parameters.$dbs->bindParam(1, $key);$dbs->bindParam(2, $firstName);$dbs->bindParam(3, $lastName);$dbs->bindParam(4, $resume);$dbs->bindParam(5, $salary);// Executing the query.$dbs->execute();} catch (PDOException $e) {print "Error!: " . $e->getMessage() . "\n";die();}?>
Update:
<?phptry {// Connecting to Ignite using pre-configured DSN.$dbh = new PDO('odbc:LocalApacheIgniteDSN');// Changing PDO error mode.$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// Executing the query. The salary field is an indexed field.$dbh->query('UPDATE Person SET salary = 42000 WHERE salary > 50000');} catch (PDOException $e) {print "Error!: " . $e->getMessage() . "\n";die();}?>
Select:
<?phptry {// Connecting to Ignite using pre-configured DSN.$dbh = new PDO('odbc:LocalApacheIgniteDSN');// Changing PDO error mode.$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// Executing the query and getting a result set. The salary field is an indexed field.$res = $dbh->query('SELECT firstName, lastName, resume, salary from PersonWHERE salary > 12000');if ($res == FALSE)print_r("Exception");// Printing results.foreach($res as $row) {print_r($row);}} catch (PDOException $e) {print "Error!: " . $e->getMessage() . "\n";die();}?>
Delete:
<?phptry {// Connecting to Ignite using pre-configured DSN.$dbh = new PDO('odbc:LocalApacheIgniteDSN');// Changing PDO error mode.$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// Performing query. Both firstName and lastName are non indexed fields.$dbh->query('DELETE FROM Person WHERE firstName = \'James\' and lastName = \'Bond\'');} catch (PDOException $e) {print "Error!: " . $e->getMessage() . "\n";die();}?>