Zend_Http之Zend_Http_Response

有人就问了这个文章中只是负责发送http://blog.phpfs.com/archives/1628.html,我想知道发送结果和处理内容?于是乎就有了Zend_Http_Response的介绍和使用

对于由Zend_Http_Client – 介绍返回的应答(Response)信息,Zend_Http_Response 可以提供简单的访问方式。 它提供一组友好的方法来获得从请求返回的应答信息:

isError(): 如果收到HTTP出错状态的代码,返回TRUE, 否则返回FALSE.

isSuccessful(): 如果得到HTTP请求成功的状态代码,返回TRUE, 否则返回FALSE.

isRedirect(): 如果得到HTTP重定向的状态代码,返回TRUE, 否则返回FALSE.

getStatus(): 返回HTTP请求的状态代码.

getHeaders(): 以数组的形式返回HTTP请求头部信息的字符串.

getBody(): 返回HTTP正文内容(字符串).

例子:(参考模拟GET和POST操作)
//处理返回结果
$response = $client->request();
if ($response->isSuccessful()) {
echo $response->getBody();
}
/index/get方法中内容如下:
var_dump($_GET);
var_dump($_POST);
输出内容:
array (size=4)
‘host’ => string ‘blog.phpfs.com’ (length=14)
‘first_name’ => string ‘blog’ (length=4)
‘middle_name’ => string ‘phpfs’ (length=5)
‘made_in’ => string ‘com’ (length=3)
array (size=3)
‘language’ => string ‘ch’ (length=2)
‘country’ => string ‘zh’ (length=2)
‘selection’ => string ‘123’ (length=3)

Zend_Http之Zend_Http_Client

$client = new Zend_Http_Client(‘http://192.168.1.180/index/get’, array(
‘maxredirects’ => 0,
‘timeout’ => 30));
// 上述代码和下面的代码是两种不同的写法
$client = new Zend_Http_Client();
$client->setUri(‘http://192.168.1.180/index/get’);
$client->setConfig(array(
‘maxredirects’ => 0,
‘timeout’ => 30));
//参数说明
maxredirects 随后的重定向的最大值 (0 = none) 整数 默认为0
strict 是否执行头部名称的确认,当设置为 False 时,将忽略确认,通常情况下不应改变这个参数的值。 布尔值 默认为 true
strictredirects 重定向时是否严格遵守 RFC 布尔值 默认为 false
useragent 用户代理的识别字符串(含在请求的头部信息内) 字符串 默认’Zend_Http_Client’
timeout 连接超时 (单位是秒) 整数 默认10
httpversion HTTP 协议版本 (通常是 ‘1.1’ 或 ‘1.0’) 字符串 默认1.1
adapter 连接适配器类时使用 多种类型 默认Zend_Http_Client_Adapter_Socket
keepalive 是否允许与服务器之间的 keep-alive 连接。如果在同一台服务器上 执行几个互相关联的请求时,keep-alive 连接是有用的而且有可能提高性能。 布尔值 默认 false
storeresponse 是否保存上次的响应结果,以备今后使用getLastResponse()重新获取。如果设置为 false,getLastResponse() 将返回空 布尔值 true

Continue reading

XML转成Json,数组转成Json,Json转成数组

1、数据交互经常用到XML或者Json,其中Json数据居多(优点不多说)

2、ZendFrameWork中如何将XML转换成Json以及数组和Json转换

直接上例子:
$arr = array(‘status’ => 1, ‘info’ => ‘json测试’, ‘data’ => array(‘name’ => ‘用户名’, ‘password’ => ‘blog.phpfs.com’));
//数组转Json
$json = Zend_Json::encode($arr);//$json = json_encode($arr);
echo $json;
//json转数组
$arr = Zend_Json::decode($json);//$json = json_decode($json);
var_dump($arr);
//xml数据转json
$xmlStr = file_get_contents(‘test.xml’);
$jsonContents = Zend_Json::fromXml($xmlStr, true);
echo $jsonContents;
注意:(ZendFrameWork官方提示)
Zend_Json::fromXml() 函数执行 XML 格式的字符串输入和返回等同的 JSON 格式字符串的输出的转换,
如果有任何 XML 输入格式错误或者转换逻辑错误,它将抛出一个异常。转换逻辑也使用递归技术来遍历 XML 树,
它支持 25 级递归,如果递归超过这个深度,它将抛出一个 Zend_Json_Exception

附:test.xml



    
        Xml转Json
        JoyousPHPer
        blog.phpfs.com
    
    
        安卓应用开发
        androidgoogle
        Joyous
    

 

相关推荐:PHP操作XMLhttp://blog.phpfs.com/archives/888.html

PHP开发微信公共平台(验证token)ZendFramework

      
        define('TOKEN', '3FC50DEAED1083F162BB3D36FF053709');
        //这个是TOKEN,我用的是一个字符串的MD5
        $signature = $this->_request->getParam('signature', '');
        //微信加密签名,可以用$_GET['signature']
    	$timestamp = $this->_request->getParam('timestamp', '');//时间戳
    	$nonce = $this->_request->getParam('nonce', '');//随机数
    	$echostr = $this->_request->getParam('echostr', '');//随机字符串
    	/*
    	 * 加密/校验流程:
         *  1. 将token、timestamp、nonce三个参数进行字典序排序
	 *  2. 将三个参数字符串拼接成一个字符串进行sha1加密
         *  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    	 */
    	 $arr = array(TOKEN, $timestamp, $nonce);//组装参数
    	 sort($arr);//字典排序
    	 $str = implode($arr);//组装字符串
    	 $sha1 = sha1($str);//sha1加密
    	 if ($sha1 == $signature) {
    	 	echo  $echostr;
    	 }

官方接口例子:http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97#.E6.B3.A8.E6.84.8F.E4.BA.8B.E9.A1.B9

Zend Framework自动加载、简单路由配置(Bootstrap.php)

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/*
* 自动加载
*/
protected function _initAutoloader()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
‘namespace’ => ‘Application’,
‘basePath’ => APPLICATION_PATH,
));

return $autoloader;
}
/*
*模块配置
*/
protected function _initDefaultModuleAutoloader()
{
$this->_resourceLoader = new Zend_Application_Module_Autoloader(array (‘namespace’ => ‘Default’, ‘basePath’ => APPLICATION_PATH . ‘/modules/default’));
$this->_resourceLoader = new Zend_Application_Module_Autoloader(array (‘namespace’ => ‘Admin’, ‘basePath’ => APPLICATION_PATH . ‘/modules/admin’));
}
/*
* 路由配置
*/
protected function _initRequest()
{
$router = new Zend_Controller_Router_Rewrite();
$frontController = Zend_Controller_Front::getInstance();
$front = Zend_Controller_Front::getInstance();
$front->setRouter($router);

/*
* 路由配置
*/
$router->addRoute(“index_i”, new Zend_Controller_Router_Route(‘/i/:i’,array(“module” => “default”, “controller” => “index”, “action”=>”index”)));
$router->addRoute(“index_l”, new Zend_Controller_Router_Route(‘/l’,array(“module” => “default”, “controller” => “index”, “action”=>”list”)));
$router->addRoute(“index_s”, new Zend_Controller_Router_Route(‘/s’,array(“module” => “default”, “controller” => “index”, “action”=>”search”)));
$router->addRoute(“index_n”, new Zend_Controller_Router_Route(‘/news/:id’,array(“module” => “default”, “controller” => “index”, “action”=>”news”)));

}

}

 

Zend FrameWork 配置文件(初级版)

[production]
;命名空间配置以及自动命名空间注册
autoloadernamespaces[] = “Zend_”
autoloadernamespaces[] = “Paper_”
appnamespace = “Application”
;运行时设置
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.DATE.timezone =”Asia/Shanghai”
;zend类库目录设置
includePaths.library = APPLICATION_PATH “/../library”
;引导文件配置,其中第二句可以省略
bootstrap.path = APPLICATION_PATH “/Bootstrap.php
bootstrap.class = “Bootstrap”
;前端控制器、默认模块、模块分组配置
resources.frontcontroller.moduledirectory = APPLICATION_PATH “/modules”
resources.frontController.controllerDirectory = APPLICATION_PATH “/controllers”
resources.frontcontroller.defaultModule = “default”
;为了统一模块类名,这里需要设置默认模块前缀需要带上
resources.frontcontroller.params.prefixDefaultModule = true
;程序运行异常配置
resources.frontcontroller.throwexceptions = true
resources.frontController.params.displayExceptions = 1
;配置layout布局文件
resources.layout.layoutPath = APPLICATION_PATH “/layouts”
;数据库连接设置
resources.db.adapter = “PDO_MYSQL”
resources.db.isdefaulttableadapter = true
resources.db.params.dbname = “Joyous
resources.db.params.username = “Joyous
resources.db.params.password = “123456”
resources.db.params.host = “localhost”
resources.db.params.charset = “UTF8”

zend framework项目分组(初级版)

Zend_Controller_Front 控制了Zend_Controller系统的整个工作流。它是前端控制器(FrontController)模型的解释。Zend_Controller_Front处理所有由服务器接收的请求并负责把请求派发给动作控制器

Zend_Controller_Request_Abstract (often referred to as the Request Object)描述请求环境和提供设置和读取控制器和动作名字以及任何请求参数的方法。另外它跟踪它所包含的动作是否被Zend_Controller_Dispatcher派遣。抽象请求对象的扩展可被用来封装整个请求环境,为了设置控制器和动作的名字,它允许路由器从请求环境中读出信息。
缺省地,Zend_Controller_Request_Http被用来访问整个HTTP请求环境。

Zend_Controller_Router_Interface用来定义路由器。路由是个过程,在这个过程中它通过检查请求环境来决定哪个个控制器和哪个控制器中的动作应该接受请求。控制器、动作和可选的参数就通过Zend_Controller_Dispatcher_Standard处理来设置在请求对象中。路由只发生一次:在最初收到请求并在第一个控制器被派遣之前。 缺省路由器,Zend_Controller_Router_Rewrite,从Zend_Controller_Request_Http取出URI的终点作为参数并基于在url中的路径信息分解成控制器、动作和参数。作为一个例子,URL http://localhost/foo/bar/key/value将被解析为foo控制器、bar 动作和带有一个值value的参数key。
Zend_Controller_Router_Rewrite也可以用来匹配任意的路径

Zend_Controller_Dispatcher_Interface被用来定义派遣器。派遣是个过程,在这个过程中它从请求对象中取出控制器和动作并映射它们到控制器文件/类和在控制器中的动作方法。如果控制器和动作不存在,它派遣缺省的控制器和动作。

实际的派遣过程包括初始化控制器类和在这个类中调用动作方法。不像路由,只发生一次,派遣是循环发生的。如果请求对象的派遣状态在任何点上重置,循环将被重复,调用不论哪个当前在请求对象中的动作。第一次循环随请求对象的派遣状态设置(布尔 true)完成,它将完成处理。
缺省的派遣器是Zend_Controller_Dispatcher_Standard。它定义控制器为以Controller结尾的 MixedCasedClasses,并且动作为以Action结尾的camelCasedMethods:FooController::barAction()。在这个例子中,控制器是foo,动作是bar

Zend_Controller的工作流相当简单。请求被Zend_Controller_Front接收,然后它调用Zend_Controller_Router_Rewrite来决定哪个控制器(和控制器中的动作)被派遣。为了在请求中设置控制器和动作名字Zend_Controller_Router_Rewrite分解URI。Zend_Controller_Front接着进入一个派遣循环。它调用Zend_Controller_Dispatcher_Standard,传递给它请求,派遣在请求(或使用缺省的)中指定的控制器和动作。在控制器完成之后,控制返回到Zend_Controller_Front。如果控制器通过重置请求派遣状态指示其它的控制器应该被派遣,循环将继续并且其它派遣被执行。否则,处理结束。

搞了半天,终于分组成功了
resources.frontcontroller.moduledirectory = APPLICATION_PATH “/modules”
resources.frontcontroller.defaultModule = “default”
resources.frontController.controllerDirectory = APPLICATION_PATH “/controllers”

然后默认的模块是default而文件夹布局是:


这样在admin控制器需要这样写:

class Admin_IndexController extends Zend_Controller_Action
{
public function indexAction()
{
echo ‘这里是admin模块下的index控制器下的index方法’;
exit();
}
}

这样访问:localhost就会默认访问default下的index控制器
而访问localhost/admin就会访问admin文件夹下控制器
PS:我以前看过tp的分组,还没有完全掌握zf的分组。今天先写这么多吧!

Zend_Config使用笔记

1.zend_Config被设计在应用程序中简化访问和使用配置数据。它为在应用程序代码中访问这样的配置数据提供了一个基于用户接口的嵌入式对象属性。配置数据可能来自于各种支持等级结构数据存储的媒体

// 给出一个配置数据的数组
$configArray = array(
‘webhost’ => ‘localhost’,
‘database’ => array(
‘adapter’ => ‘pdo_mysql’,
‘params’ => array(
‘host’ => ‘localhost,
‘username’ => ‘dbuser’,
‘password’ => ‘secret’,
‘dbname’ => ‘mydatabase’
)
)
);

// 基于配置数据创建面向对象
$config = new Zend_Config($configArray);

// 输出配置数据 (结果为’localhost’中)
echo $config->webhost;

// 使用配置数据来连接数据库
$db = Zend_Db::factory($config->database->adapter,
$config->database->params->toArray());

// 另外的用法:简单地传递 Zend_Config 对象。
// Zend_Db factory 知道如何翻译它。
$db = Zend_Db::factory($config->database);

PS:还可这样使用
// config.php
return array(
‘webhost’ => ‘localhost’,
‘database’ => array(
‘adapter’ => ‘pdo_mysql’,
‘params’ => array(
‘host’ => ‘localhost’,
‘username’ => ‘dbuser’,
‘password’ => ‘secret’,
‘dbname’ => ‘mydatabase’
)
)
);
然后$config = new Zend_Config(require ‘config.php’);

Continue reading

Zend_Db_Adapter使用详情

Zend_Db_Adapter是zendfrmaeword的数据库抽象层api. 基于pdo, 你可以使用 Zend_Db_Adapter 连接和处理多种 数据库,包括:microsoft SQL Server,MySql,SQLite等等.
1.连接数据库

<?php
require_once ‘Zend/Db.php’;
$params = array (‘host’ => ‘127.0.0.1’,
‘username’ => ‘root’,
‘password’ => ‘root’,
‘dbname’ => ‘zendstudy’,
charset’ => ‘utf8’)
$db = Zend_Db::factory(‘PDO_MYSQL’, $params);
?>

2.SQL语句添加引号防止攻击

第一种是quote() 方法. 该方法会根据数据库adapter为标量加上 合适的引号;假如你试图对一个数组做quote操作, 它将为数组中 每个元素加上引号,并用”,”分隔返回.
$value = $db->quote(‘St John”s Wort’);
//$value 现在变成了 ‘St John\”s Wort’
$value = $db->quote(array(‘a’, ‘b’, ‘c’));
//$value现在变成了 ‘a’, ‘b’, ‘c'(“,”分隔的字符串)
第二种是 quoteInto() 方法. 你提供一个包含问号占位符的基础字符串 , 然后在该位置加入带引号的标量或者数组. 该 方法对于随需构建查询sql语句和条件语句是很有帮助的. 使用 quoteInto处理过的标量和数组返回结果与quote() 方法相同.
$where = $db->quoteInto(‘id = ?’, 1);//id = 1
$where = $db->quoteInto(‘id IN(?)’, array(1, 2, 3));//id IN(1, 2, 3)

Continue reading