| 热度: |
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得问题都可以留言,我不一定会,如果我不会,那我就又学到了,呵呵。