<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IT妖怪 &#187; Php</title>
	<atom:link href="http://blog.ityao.com/archives/category/backend/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.ityao.com</link>
	<description>热爱生活，热爱程序</description>
	<lastBuildDate>Wed, 03 Aug 2011 02:56:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Zend AMF使用总结-服务端</title>
		<link>http://blog.ityao.com/archives/430</link>
		<comments>http://blog.ityao.com/archives/430#comments</comments>
		<pubDate>Mon, 28 Sep 2009 14:35:23 +0000</pubDate>
		<dc:creator>Daniel Yang</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[amf]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.ityao.com/?p=430</guid>
		<description><![CDATA[Zend Framework是php框架中的战斗机。各种功能应有尽有，没有的网上也能找到插件，helper, filter&#8230;.而对于这样庞大的框架，最重要的就是配置了。 最近我作了一些尝试，在Zend Framework下使用AMF。现在把一些主要点共享给大家。 Tip 1，项目结构 这是刚接触ZF的同学们最头疼的。网上众说纷纭，其实很简单。 ZF发布的时候，bin目录下带有几个可运行的命令文件（包含各种系统了）。直接运行就可以了。 在这里，我是这样使用的(Mac Osx): 运行后，就会得到一个类似于这样的目录结构。 这里有个提示，尽管你可以把Zend文件夹（ZF的主要库文件）copy到刚才生成项目目录下的library里，我还是建议，一个服务器上维持一个ZF lib，这样升级起来容易。 现在可以把web服务器的服务地址只想我们生成目录bravo的public&#8212;这样，用户只能访问这个piblic目录中的文件，而程序文件是在application目录的，主要是安全。 好，打开浏览器，按照你配置的url来访问，应该能看到一个ZF生成的简单页面了。 Tip 2 index.php配置 ZF生成的public目录中，有一个index.php文件。这个文件是ZF应用的入口。这里的配置，主要是一些常量和ZF lib的位置。 比如我就是这样配置的： Tip 3 配置文件 ZF生成的application.ini文件位于/application/configs/下, 这个目录也经常会放其他配置文件，如route，i18n等。 配置文件一定不能乱了。我们按照dev, prod两种环境来配置。 Tip 4 AMF 服务的编写 这个很简单。 不需要继承任何类。 顺便说说gateway的提供。ZF中，gateway是一个controller。里面的内容比较常规： Tip 5 Bootstrap 最主要的是初始化name space和数据库连接 Tip 6 Value Object的传输 最让我头疼的。我现在的做法是，不使用ZF的Model, 直接用DbAdapter. 所以，我在Model里定义的其实是VO. 定义一个Base: 那么， User的Model就是： 在从数据库中取得数据后： 下一篇我们说客户端-应该是很简单了。]]></description>
			<content:encoded><![CDATA[<p><a href="http://framework.zend.com/" target="_blank">Zend Framework</a>是php框架中的战斗机。各种功能应有尽有，没有的网上也能找到插件，helper, filter&#8230;.而对于这样庞大的框架，最重要的就是配置了。</p>
<p>最近我作了一些尝试，在Zend Framework下使用AMF。现在把一些主要点共享给大家。</p>
<p><span id="more-430"></span></p>
<p>Tip 1，项目结构<br />
这是刚接触ZF的同学们最头疼的。网上众说纷纭，其实很简单。<br />
ZF发布的时候，bin目录下带有几个可运行的命令文件（包含各种系统了）。直接运行就可以了。<br />
在这里，我是这样使用的(Mac Osx):</p>
<pre class="brush: bash; title: ; notranslate">
Yang:~ daniel$ ./zf.sh create project website
</pre>
<p>运行后，就会得到一个类似于这样的目录结构。<br />
<a href="http://blog.ityao.com/wp-content/uploads/2009/09/Screen-shot-2009-09-28-at-5.43.30-PM.png"><img src="http://blog.ityao.com/wp-content/uploads/2009/09/Screen-shot-2009-09-28-at-5.43.30-PM.png" alt="Screen shot 2009-09-28 at 5.43.30 PM" title="Screen shot 2009-09-28 at 5.43.30 PM" width="221" height="505" class="alignnone size-full wp-image-432" /></a></p>
<p>这里有个提示，尽管你可以把Zend文件夹（ZF的主要库文件）copy到刚才生成项目目录下的library里，我还是建议，一个服务器上维持一个ZF lib，这样升级起来容易。</p>
<p>现在可以把web服务器的服务地址只想我们生成目录bravo的public&#8212;这样，用户只能访问这个piblic目录中的文件，而程序文件是在application目录的，主要是安全。<br />
好，打开浏览器，按照你配置的url来访问，应该能看到一个ZF生成的简单页面了。</p>
<p>Tip 2 index.php配置<br />
ZF生成的public目录中，有一个index.php文件。这个文件是ZF应用的入口。这里的配置，主要是一些常量和ZF lib的位置。<br />
比如我就是这样配置的：</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

//这个是amf service的目录
define('SERVICES_PATH', APPLICATION_PATH . '/services');

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once '../../library/Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application-&gt;bootstrap()
            -&gt;run();
</pre>
<p>Tip 3 配置文件<br />
ZF生成的application.ini文件位于/application/configs/下, 这个目录也经常会放其他配置文件，如route，i18n等。<br />
配置文件一定不能乱了。我们按照dev, prod两种环境来配置。</p>
<pre class="brush: plain; title: ; notranslate">
[general]
;includePaths.library = APPLICATION_PATH &quot;/../../library&quot;
bootstrap.path = APPLICATION_PATH &quot;/Bootstrap.php&quot;
bootstrap.class = &quot;Bootstrap&quot;
resources.frontController.controllerDirectory = APPLICATION_PATH &quot;/controllers&quot;

;database
resources.db.adapter = &quot;PDO_MYSQL&quot;
resources.db.isdefaulttableadapter = true
resources.db.params.driver_options.1002 = &quot;SET NAMES UTF8;&quot;

[development : general]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

resources.db.params.host = localhost
resources.db.params.username = bravo
resources.db.params.password = Z4wL6h8pA4KS5yDZ
resources.db.params.dbname = bravo

[production : general]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0

resources.db.params.host = 127.0.0.1
resources.db.params.username = test
resources.db.params.password = test
resources.db.params.dbname = test
</pre>
<p>Tip 4 AMF 服务的编写<br />
这个很简单。<br />
不需要继承任何类。</p>
<p>顺便说说gateway的提供。ZF中，gateway是一个controller。里面的内容比较常规：</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php

	class GatewayController extends Zend_Controller_Action{

		public function init(){
			$this-&gt;getHelper('ViewRenderer')-&gt;setNoRender();
		}

		public function indexAction(){
			$server = new Zend_Amf_Server();
			$server-&gt;setSession('Bravo');
			Zend_Session::start(); //让amf服务支持session

			$server-&gt;addDirectory(SERVICES_PATH);//index.php中声明的，服务所在的目录
			//类的映射。
			$server-&gt;setClassMap('com.bravo.model.User', 'Brava_Model_User');

			echo($server-&gt;handle());
		}

	}

?&gt;
</pre>
<p>Tip 5 Bootstrap<br />
最主要的是初始化name space和数据库连接</p>
<pre class="brush: php; title: ; notranslate">
	protected function _initAutoload(){
		$autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' =&gt; 'Bravo',
            'basePath'  =&gt; dirname(__FILE__),
        ));
        return $autoloader;
	}

	protected function _initExtraConfig(){
		$resource = $this-&gt;getPluginResource('db');
		$db = $resource-&gt;getDbAdapter();
		Zend_Registry::set('db',$db);

		Zend_Registry::set('configSection',APPLICATION_ENV);

	}
</pre>
<p>Tip 6 Value Object的传输<br />
最让我头疼的。我现在的做法是，不使用ZF的Model, 直接用DbAdapter.<br />
所以，我在Model里定义的其实是VO.</p>
<p>定义一个Base:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

	class Bravo_Model_Base{

		public function setData($place){

			foreach($this as $key=&gt;$value){
				if( array_key_exists($key, $place)){
					$this-&gt;$key = $place[$key];
				}
			}
		}

	}

?&gt;
</pre>
<p>那么， User的Model就是：</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	class Bravo_Model_User extends Bravo_Model_Base{
		public $_explicitType = 'com.bravo.model.User';

		public $id;
		public $email;
		public $nickname;
		public $passwd;
		public $avatar;

	}
?&gt;
</pre>
<p>在从数据库中取得数据后：</p>
<pre class="brush: php; title: ; notranslate">
		public function getPlace($i){
			$db = Zend_Registry::get('db');

			$select = $db-&gt;select();

			$select-&gt;from('place')
			-&gt;where('place.id='. $i);

			$p = $db-&gt;fetchRow($select);

			$pvo = new Bravo_Model_Place();
                        //就可以这样了
			$pvo-&gt;setData($p);
			return $pvo;
		}
</pre>
<p>下一篇我们说客户端-应该是很简单了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ityao.com/archives/430/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>“先进的互联互通技术”&#8211;使用ice联通php和java [part 1 server]</title>
		<link>http://blog.ityao.com/archives/426</link>
		<comments>http://blog.ityao.com/archives/426#comments</comments>
		<pubDate>Fri, 25 Sep 2009 03:34:10 +0000</pubDate>
		<dc:creator>零蛋</dc:creator>
				<category><![CDATA[JAVA EE]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[web服务器]]></category>
		<category><![CDATA[五四陈科学院]]></category>

		<guid isPermaLink="false">http://blog.ityao.com/?p=426</guid>
		<description><![CDATA[PHP没有中间件，导致了对很多麻烦。比如，对数据库的操作必须要链接数据库，然后做SQL操作。WEB程序直接操作数据库的方法，这样会带来很多人为因素的事故隐患，以及管理上的麻烦，尤其是对大型的网站应用来说。规范的模式应该是，WEB程序传递参数到一个服务程序上，由该服务程序进行判断并最终操作数据库或者其它数据文件，这样做到了明确权限控制，和业务类型集中管理。去年伴随着ICE的推出，PHP终于有了可以使用的中间件。在PHP的发展史上，应该是一个里程碑。 ICE入门 ICE（Internet Communications Engine 网络通讯引擎），是由Corba原核心成员开发的一个开源中间件，据称其各种性能完全优于Corba。除此之外，我们第一次见到了直接支持PHP的中间件。 ICE的安装，去http://www.zeroc.com/download.html 下载一个Ice针对PHP的安装包，按照说明安装上。 ICE的使用：使用Slice（ICE的一种简单语法脚本），编写一个xx.ice文件。可以使用slice2cpp或slice2java等生成一个cpp或java的ICE框架程序，然后在这个框架程序中进行代码编写。ICE在PHP的应用继承了PHP的一贯传统——简单，只需要在php.ini中加载该xx.ice，在PHP中就可以使用了。 ICE在PHP应用中的缺点，无法使用PHP编写Server端，其实这也是PHP的一个缺陷——没有完善的多进程和多线程管理机制。因此，Server端可以采用ICE所支持的其它语言进行编写，比如JAVA/C++/VB/PYTHON等。 开始传说中的“互联互通” 本例以 Ice 3.2.1为例 下载的位置和参考的文档都在下面 http://www.zeroc.com/download_3_2_1.html http://www.zeroc.com/doc/Ice-3.2.1/manual/Slice.5.10.html#50592 ICE其实是一个网络框架，入门说明中说了，PHP不能用来做服务端，在这里我们使用java来做服务端，用php来连java，达到传说中的“互联互通”。 我们的服务端用Linux，客户端也用Linux（纯废话）。JAVA环境的搭建不在表述了。 在下载可以看出来，服务器支持yum或者是rpm是多么幸福的一件事情，或者搞一份tar.gz的包下来configure make make install，大概也就是这样。好了这样子就表示安装结束了。。。 安装之后的Ice相关路径: slice2cpp,slice2java在/usr/bin/下 Ice.jar 存储于 /usr/share/java/下 相关的Ice的库存储于/usr/lib下. 第1步，建立服务器端的demo.ice的文件（注意代码里的半全角，如果是全角自行转成半角）： module Demo{ interface test{ string   execute(string mth,string cmd); }; }; 第2步，执行: slice2java demo.ice 生成一堆文件。。。 第3步，动手干活 上一步执行完会在当前目录产生一个Demo目录,目录下自动生成: -rw-r&#8211;r&#8211;  1 root root 2316  4月 15 17:01 _testDelD.java [...]]]></description>
			<content:encoded><![CDATA[<p>PHP没有中间件，导致了对很多麻烦。比如，对数据库的操作必须要链接数据库，然后做SQL操作。WEB程序直接操作数据库的方法，这样会带来很多人为因素的事故隐患，以及管理上的麻烦，尤其是对大型的网站应用来说。规范的模式应该是，WEB程序传递参数到一个服务程序上，由该服务程序进行判断并最终操作数据库或者其它数据文件，这样做到了明确权限控制，和业务类型集中管理。去年伴随着ICE的推出，<a href="http://www.54chen.com/611-%e5%8e%9f%e5%88%9bdiscuz-bbs%e7%bc%93%e5%ad%98%e6%95%b4%e4%bd%93%e6%96%b9%e6%a1%88/">PHP</a>终于有了可以使用的中间件。在PHP的发展史上，应该是一个里程碑。</p>
<p><span id="more-426"></span></p>
<p><strong>ICE入门</strong></p>
<p>ICE（Internet Communications Engine 网络通讯引擎），是由Corba原核心成员开发的一个开源中间件，据称其各种性能完全优于Corba。除此之外，我们第一次见到了直接支持PHP的中间件。</p>
<p>ICE的安装，去http://www.zeroc.com/download.html 下载一个Ice针对PHP的安装包，按照说明安装上。</p>
<p>ICE的使用：使用Slice（ICE的一种简单语法脚本），编写一个xx.ice文件。可以使用slice2cpp或slice2java等生成一个cpp或java的ICE框架程序，然后在这个框架程序中进行代码编写。ICE在PHP的应用继承了PHP的一贯传统——简单，只需要在php.ini中加载该xx.ice，在PHP中就可以使用了。</p>
<blockquote><p>ICE在PHP应用中的缺点，无法使用PHP编写Server端，其实这也是PHP的一个缺陷——没有完善的多进程和多线程管理机制。因此，Server端可以采用ICE所支持的其它语言进行编写，比如JAVA/C++/VB/PYTHON等。</p></blockquote>
<p><strong>开始传说中的“互联互通”</strong></p>
<blockquote><p><strong><span style="color: #ff0000">本例以 Ice 3.2.1为例 下载的位置和参考的文档都在下面</span></strong></p>
<p><a href="http://www.zeroc.com/download_3_2_1.html">http://www.zeroc.com/download_3_2_1.html</a></p>
<p><a href="http://www.zeroc.com/doc/Ice-3.2.1/manual/Slice.5.10.html#50592">http://www.zeroc.com/doc/Ice-3.2.1/manual/Slice.5.10.html#50592</a></p></blockquote>
<p>ICE其实是一个网络框架，入门说明中说了，PHP不能用来做服务端，在这里我们使用java来做服务端，用php来连java，达到传说中的“互联互通”。</p>
<p>我们的服务端用Linux，客户端也用Linux（纯废话）。JAVA环境的搭建不在表述了。</p>
<p>在下载可以看出来，服务器支持yum或者是rpm是多么幸福的一件事情，或者搞一份tar.gz的包下来configure make make install，大概也就是这样。好了这样子就表示安装结束了。。。</p>
<blockquote><p>安装之后的Ice相关路径:</p>
<p>slice2cpp,slice2java在/usr/bin/下</p>
<p>Ice.jar 存储于 /usr/share/java/下</p>
<p>相关的Ice的库存储于/usr/lib下.</p></blockquote>
<p>第1步，建立<a href="http://www.54chen.com/736-dynamo-based-systems-designed-linkin-voldemort-voldemort-design-chinese-documents-i-am-a-chan-academy-of-sciences-translation-finalized/">服务器</a>端的demo.<span>ice</span>的文件（注意代码里的半全角，如果是全角自行转成半角）：</p>
<blockquote><p>module Demo{</p>
<p>interface test{</p>
<p>string   execute(string mth,string cmd);</p>
<p>};</p>
<p>};</p></blockquote>
<p>第2步，执行: <span>slice2java</span> demo.<span>ice</span> 生成一堆文件。。。</p>
<p>第3步，动手干活</p>
<p>上一步执行完会在当前目录产生一个Demo目录,目录下自动生成:<br />
-rw-r&#8211;r&#8211;  1 root root 2316  4月 15 17:01 _testDelD.java<br />
-rw-r&#8211;r&#8211;  1 root root  560  4月 15 17:01 _testDel.java<br />
-rw-r&#8211;r&#8211;  1 root root 1929  4月 15 17:01 _testDelM.java<br />
-rw-r&#8211;r&#8211;  1 root root 4177  4月 15 17:01 _testDisp.java<br />
-rw-r&#8211;r&#8211;  1 root root 1070  4月 15 17:01 testHolder.java<br />
-rw-r&#8211;r&#8211;  1 root root  488  4月 15 17:01 test.java<br />
-rw-r&#8211;r&#8211;  1 root root  481  4月 15 17:01 _testOperations.java<br />
-rw-r&#8211;r&#8211;  1 root root  460  4月 15 17:01 _testOperationsNC.java<br />
-rw-r&#8211;r&#8211;  1 root root 5418  4月 15 17:01 testPrxHelper.java<br />
-rw-r&#8211;r&#8211;  1 root root  569  4月 15 17:01 testPrxHolder.java<br />
-rw-r&#8211;r&#8211;  1 root root  567  4月 15 17:01 testPrx.java<br />
到目前为止,demo.<span>ice</span>所以<span>Ice</span>接口部分的定义以及相关依赖都已经自动生成.</p>
<p>我们要实现自己的execute方法,覆盖testPrx.java的同名<a href="http://www.54chen.com/272-%e5%a6%82%e4%bd%95%e5%af%b9%e4%bb%98%e6%97%a0%e8%89%af%e6%87%92%e6%83%b0ops%e7%9a%84%e5%8f%af%e8%80%bb%e7%9a%84%e9%99%90%e6%b5%81%e6%8e%aa%e6%96%bd/">方法</a>:</p>
<blockquote><p>//TestImp.java</p>
<p>package Demo;</p>
<p>import Ice.Current;</p>
<p>public class TestImp extends _testDisp{</p>
<p>public String execute(String mth, String cmd, Current __current) {</p>
<p>// TODO Auto-generated method stub</p>
<p>return mth+cmd;</p>
<p>}</p>
<p>}</p></blockquote>
<p>第4步，建立一个Server服务在10000<a href="http://www.54chen.com/264-%e7%94%a8iptables%e5%81%9a%e4%b8%a4%e6%9c%ba%e4%b9%8b%e9%97%b4%e7%9a%84%e7%ab%af%e5%8f%a3%e8%bd%ac%e5%8f%91/">端口</a>进行侦听</p>
<blockquote><p>//Server.java</p>
<p>package Demo;</p>
<p>public class Server {</p>
<p>public static void main(String[] args) {</p>
<p>int status = 0;</p>
<p>Ice.Communicator ic = null;</p>
<p>try {</p>
<p>ic = Ice.Util.initialize(args);</p>
<p>Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(</p>
<p>&#8220;TestAdapter&#8221;, &#8220;default -p 10000&#8243;);</p>
<p>Ice.Object object = new TestImp();</p>
<p>adapter.add(object, ic.stringToIdentity(&#8220;TestAdapter&#8221;));</p>
<p>adapter.activate();</p>
<p>ic.waitForShutdown();</p>
<p>} catch (Ice.LocalException e) {</p>
<p>e.printStackTrace();</p>
<p>status = 1;</p>
<p>} catch (Exception e) {</p>
<p>System.err.println(e.getMessage());</p>
<p>status = 1;</p>
<p>}</p>
<p>if (ic != null) {</p>
<p>// Clean up</p>
<p>//</p>
<p>try {</p>
<p>ic.destroy();</p>
<p>} catch (Exception e) {</p>
<p>System.err.println(e.getMessage());</p>
<p>status = 1;</p>
<p>}</p>
<p>}</p>
<p>System.exit(status);</p>
<p>}</p>
<p>}</p></blockquote>
<p>以上大部分代码都是框架生成，你只需要在里面填写TODO。把这个代码拖回来用eclipse打成jar包，注意，需要依赖ice.jar这个包，这个包可以在<a href="http://www.54chen.com">官方</a>网站下载到。<a href="http://www.zeroc.com/download_3_2_1.html">http://www.zeroc.com/download_3_2_1.html</a></p>
<p>生成DemoServer.ajr后传到服务器，运行java -cp ./:Ice.jar:DemoServer.jar Demo.Server</p>
<p>运行成功的条件是Ice.jar和DemoServer.jar都在一个目录里。（Ice.jar从下载地址下载）</p>
<p>Server运行之后监听于10000端口，需要修改iptables，允许其他机器可以连接。<br />
编辑 iptables<br />
vi /etc/sysconfig/iptables</p>
<blockquote><p><span>-A RH-Firewall-</span><span>1</span><span>-INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport </span><span>10000</span><span> -j ACCEPT</span></p></blockquote>
<p><strong>继续深入互联互通</strong></p>
<p>这一节完成了Server，一个10000端口的Server在等待着我们用PHP来联通中。下一节，我们将讲述：IcePHP环境的搭建，PHP调用Ice如何与JAVA互联互通，以及一个完整的Demo，保存好本节的代码，后面还有用处。[未完待续]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ityao.com/archives/426/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

