你的位置: 首页>> PHP, 技术天空 >> 《PHP Web 2.0 开发实战》 学习记录 第二章

《PHP Web 2.0 开发实战》 学习记录 第二章

热度:



PHP Web 2.0 开发实战 学习记录

从7月份开始学习这本书,这是一本非常有效的系统学习PHP开发的书,但是因为版本的问题,书中有一些小的bug,可能会导致看这本书学习的人有些迷惑,我只是把我在学习中的迷惑记录下来。

首先说一下,这本书的代码是基于linux的,而我的学习是windowsXP下的,因此会有一些路径的问题,书中已经写了关于两种不同的系统环境的设置,但是有一些没有提到,可能会给初学者带来一些困扰。

另外,本书的代码的Zend framework使用的是 1.02,我是用的是1.8,在版本上会有一些不同,

第一章: 貌似不会有什么问题,因为只是介绍,呵呵。

第二章:

安装应该没有什么问题,linux没用过,没有发言权,windows 我下了一个,appserv,是一个apache2.2,mysql,mysqlAdministrator,,php5 的一个allinone的工具包,没有什么问题。

有点问题的可能是  2.4.2 在windows上创建虚拟主机。其实只要按照他的代码清单来做就可以了,修改完存盘重启。需要说明的是,我的机器上原来的默认80端口被IIS占用了,所以我的apache用81,我当时想连端口号也写配置在虚拟主机里面,,就是在httpd.conf 里面

<VirtualHost phpweb20:81>

ServerName phpweb20

DocumentRoot d:/AppServ/www/phpweb20/htdocs/

<Directory /phpweb20/htdocs/>

AllowOverride All

Order allow,Deny

Deny from all

Satisfy all

</Directory>

php_value include_path .;D:\AppServ\www\phpweb20\include;D:\AppServ\php5\PEAR

php_value magic_quotes_gpc off

php_value register_globals off

</VirtualHost>

但是,即使你这样写了,还是需要在地址栏里面写上 端口号的http://phpweb20:81/

.htaccess里面的配置,这个文件也是对这个服务器的配置,也可以将这个文件的内容放在 httpd.conf文件中,但是放在这里面有局域性配置的好处,而且不需要重启apache。

清单2-8初始应用配置  settings.ini

这里面的问题是,里面的path是基于linux的,在windows下干活的,都要改成自己相应的目录

[development]

database.type       = mysqli

database.hostname   = localhost

database.username   = root

database.password   = root

database.database   = phpweb20

paths.base      = D:\AppServ\www\phpweb20

paths.data      = D:\AppServ\www\phpweb20\data

paths.templates = D:\AppServ\www\phpweb20\templates

logging.file = D:\AppServ\www\phpweb20\data\logs\debug.log

清单2-10中有段测试书库连接的代码,相信看到这里的读者应该跟我一样,都测试了一下吧,如果settings.ini中的database.type       = pdo_mysql的话,需要在php.ini中开启PDO扩展,在php.ini中:

;extension = php_pdo.dll

;extension=php_pdo_mysql.dll

将这两项前面的;去掉,然后,重启apache,最好将那个小齿轮的service服务拖到桌面上来,方便重启,呵呵。

第二章主要实现一个 index.php中的代码,这里面有两个问题

第一个是这个

Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in D:\AppServ\www\phpweb20\htdocs\Zend\Loader.php on line 207

require_once(’Zend/Loader.php’);

Zend_Loader::registerAutoload();现在可以用,但是在2.0版本中会去掉,所以现在最好不要用了,要改成

require(’Zend/Loader/Autoloader.php’);

Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);

这个样子就好了。

另外一个错误

Fatal error: Uncaught exception ‘Zend_Session_Exception’ with message ‘Session must be started before any output has been sent to the browser; output started in D:\AppServ\www\phpweb20\htdocs\Zend\Loader.php/207′ in D:\AppServ\www\phpweb20\htdocs\Zend\Session.php:419 Stack trace: #0 D:\AppServ\www\phpweb20\htdocs\Zend\Session\Namespace.php(124): Zend_Session::start(true) #1 D:\AppServ\www\phpweb20\htdocs\Zend\Auth\Storage\Session.php(87): Zend_Session_Namespace->__construct(’Zend_Auth’) #2 D:\AppServ\www\phpweb20\htdocs\Zend\Auth.php(91): Zend_Auth_Storage_Session->__construct() #3 D:\AppServ\www\phpweb20\htdocs\Zend\Auth.php(133): Zend_Auth->getStorage() #4 D:\AppServ\www\phpweb20\include\CustomControllerAction.php(14): Zend_Auth->hasIdentity() #5 D:\AppServ\www\phpweb20\htdocs\Zend\Controller\Action.php(501): CustomControllerAction->preDispatch() #6 D:\AppServ\www\phpweb20\htdocs\Zend\Controller\Dispatcher\Standard.php(288): Zend_Controller_Action->dispatch(’errorAction’) #7 D:\AppServ\www\phpweb20\htdocs\Zend\Controlle in D:\AppServ\www\phpweb20\htdocs\Zend\Session.php on line 419

(显示的行号可能不一样),我也看不太懂这是什么意思,说的应该是两个事,第一个应该是,session启动之前就有输出了,所以开启不正确,报错了,session不能用,第二个事情就是,他要用一个内置的error的控制器和模版来处理这个错误,但是现在没有这个控制器,当时我把session的问题解决了,不需要报错了,第二个事情也就没有了,但是在后面又出来了这个错误,让我好一个困惑,现在我们来解决。

第一个问题很好解决,在index的最上面,加上ob_start();就可以了。他会开启一个缓存,将要输出的东西缓存下来,在最后集中输出,我是这么理解的。可以解决session的问题。

如果先不解决上面的那个notice的问题的话,先加上一个ob_start(),在运行你会发现fatal error不见了,只有一个notice了。所以在开启session前面有输出的输出说的就是这个notice的报错,呵呵,这样说能明白么?

下面是第二个问题,我们应该先解决第二个在解决第一个,因为第一个解决之后第二个问题也就没了

第二个问题更简单,因为书中在第二章没有提到这个问题,有些尽信书的读者就不明白了,其实控制器和模版在本书源代码的第十四章里面就有了(这个我也很无语啊),至于作者为什么不说,估计是为了开发读者的主观能动性吧。将对应的模版和控制器拷到相应位置(强烈建议自己敲一边而不是文件拷贝),在运行,没有了。如果不解决session问题,加上error控制器和模版,错误会变成这样

Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in D:\AppServ\www\phpweb20\htdocs\Zend\Loader.php on line 207

Fatal error: Uncaught exception ‘Zend_Session_Exception’ with message ‘Session must be started before any output has been sent to the browser; output started in D:\AppServ\www\phpweb20\htdocs\Zend\Loader.php/207′ in D:\AppServ\www\phpweb20\htdocs\Zend\Session.php:419 Stack trace: #0 D:\AppServ\www\phpweb20\htdocs\Zend\Session\Namespace.php(124): Zend_Session::start(true) #1 D:\AppServ\www\phpweb20\htdocs\Zend\Auth\Storage\Session.php(87): Zend_Session_Namespace->__construct(’Zend_Auth’) #2 D:\AppServ\www\phpweb20\htdocs\index.php(28): Zend_Auth_Storage_Session->__construct() #3 {main} thrown in D:\AppServ\www\phpweb20\htdocs\Zend\Session.php on line 419

你会发现比上面的少了一部分,呵呵,就是找不到error控制器的错误。

说这么多,无非是想让大家在看书的时候尽量自己多调一下错误,理解一下原理。

言归正传,写日志的时候我没有遇到什么问题,如果有问题的话,可以留言来问我,呵呵。

或者没有源代码或者,关于这本书的问题和zend得问题都可以留言,我不一定会,如果我不会,那我就又学到了,呵呵。

Tags: ,

留个脚印

Copyright © 2010 高度PHP All rights reserved.
Designed by Modified by ifanqie. Powered by WordPress.