Java堂  


两个PHP的Warning及解决方法

Filed under: DynamicLanguage — Jet @ 5:56 下午
Tags:
原文出处: 两个PHP的Warning及解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

1. Cannot modify header information

PHP Warning: Cannot modify header information – headers already sent by (output started at yourfiles)

这是因为设置的头文件信息溢出造成的。解决方法:将output_buffering 设为 on 就可以了

2. output handler ‘ob_gzhandler’ conflicts with ‘zlib output compression’

PHP Warning: ob_start() [ref.outcontrol]: output handler ‘ob_gzhandler’ conflicts with ‘zlib output compression’ in yourfiles

这是因为PHP中Zlib模块设置错误造成的,将zlib.output_compression这一行注释掉就可以了。这里需要指出的是PHP5自带GZIP模块的,不需要另外加载。

参考资料:
解决Warning: Cannot modify header information – headers already sent by ……
启用页面 Gzip 压缩后发生错误,请指点

Apache中显示PHP源代码的原因

Filed under: DynamicLanguage,Tools,Web&Server — Jet @ 10:53 上午
Tags: ,
原文出处: Apache中显示PHP源代码的原因
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

通常来说如果Apache显示PHP源代码的主要原因是因为没有正确配置好PHP加载模块,最多的错误就是加载的php5_module文件位置错误,通常这种错误会导致Apache无法正常启动;另外最容易犯的就是没有增加php的文件头类型:

  1. AddType application/x-httpd-php .php .php3

但是今天我确遇到一件非常奇怪的事情,上面说的两种情况都不存在但是依然显示php源代码。后来经过长时间的排查终于发现误将放置在 VirtualHost 标签内的

  1. php_flag engine off

放到了外面,这种情况下使得针对某个站点不执行php解析的配置被设置为了全局配置了,估计这种失误比较少见,故写出来共享。

phpMyAdmin初次安装拒绝登录的问题及解决方法

Filed under: Database,DynamicLanguage,Tools,Web&Server — Jet @ 10:45 下午
原文出处: phpMyAdmin初次安装拒绝登录的问题及解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天安装phpMyAdmin 2.10的时候修改认证方式为cookie之后进入程序首页登录的时候一直提示访问被拒绝,真的是奇怪了。后来从网上查了一下原来是需要清空一下浏览器缓存。

参考资料:hpMyAdmin 2.10.2 配置

PHP中出现“Unable to load dynamic library”问题的解决方法

Filed under: DynamicLanguage — Jet @ 3:15 上午
Tags: ,
原文出处: PHP中出现“Unable to load dynamic library”问题的解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天把一个客户的服务器上面的PHP4升级到PHP5,根据前几天写的从PHP4升级到PHP5的步骤进行升级之后,总是在错误的日志文件中出现如下提示:

startup: Unable to load dynamic library : PHP5\ext\php_mysql.dll

可是明明将extension_dir设置正确了还是提示无法找到dll文件。后来在CSDN上面找到一篇相关的文章,大体意思是php扩展目录中的模块需要依赖于一些基础的dll文件,如果系统没有找到这些基础的dll文件的话也会是扩展模块产生错误。解决的方法有两种,一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去。PHP5的话只要设置其安装目录就可以了。

但是问题是我按照上面的设置还是出现上面的提示,真的是很奇怪。后来我尝试将libmysql.dll文件拷贝到system32目录下面的时候出现是否覆盖文件的提示,这个时候我才恍然大悟,原来php4中的dll目录下面的文件都被拷贝到system32目录下面而没有被删除,所以php5误将这些文件当作基础文件了。于是使用如下的批处理命令将php4留在系统中的文件一一删除即解决了问题:

  1. @echo off
  2. echo remove php4
  3.  
  4. echo remove php.ini and php4ts.dll
  5. del %SystemRoot%\php.ini
  6. del %SystemRoot%\system32\php4ts.dll
  7.  
  8. echo remove dlls from system32...
  9. del %SystemRoot%\system32\expat.dll
  10. del %SystemRoot%\system32\FDFTK.DLL
  11. del %SystemRoot%\system32\fribidi.dll
  12. del %SystemRoot%\system32\gds32.dll
  13. del %SystemRoot%\system32\iconv.dll
  14. del %SystemRoot%\system32\libeay32.dll
  15. del %SystemRoot%\system32\libmhash.dll
  16. del %SystemRoot%\system32\libmysql.dll
  17. del %SystemRoot%\system32\mSQL.dll
  18. del %SystemRoot%\system32\ntwdblib.dll
  19. del %SystemRoot%\system32\sablot.dll
  20. del %SystemRoot%\system32\ssleay32.dll
  21. del %SystemRoot%\system32\Yaz.dll
  22.  
  23. echo done!

这样说的话php5对于查找这些基础dll文件的顺序应该跟查找php.ini文件的顺序(详细见从PHP4升级到PHP5文章中的常见问题3)相反,或者是无论如何首先查看system32目录下面是否含有这些dll文件,如果存在的话就不在查找了。

增加内容(2007.9.20):
今天将PHP5.2.3升级为5.2.4之后依然出现上述的问题(系统:win2k server),但是5.2.3版本使用的很好。后来根据参考资料所说的两种方法(一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去)中的后者将php5的安装目录添加到环境变量%PATH%中之后重新启动下就OK了。但是同样的版本我在本机(系统: winxp sp2)只要在Apache设置PHPIniDir为php5安装目录就可以了,并没有设置环境变量,不知道什么原因。

参考资料:
如何解决PHP startup: Unable to load dynamic library的错误

加速你的PHP程序

Filed under: DynamicLanguage — Jet @ 10:26 下午
原文出处: 加速你的PHP程序
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

以前一直在用MMCache来做PHP的缓存,到今天才知道原MMCache的作者已经就职于Zend公司,现在重新开发了一个名为eAccelerator的项目,可以说是MMCache的“最新升级版本”了,呵呵

下面说一下安装的过程:

1. 在官方下载最新的版本,因为官方提供的都是源文件,所以必须使用VC++进行编译。如果你没有安装VS也没关系,可以到SiteBuddy下载编译好的dll文件,一定要看好对应的PHP版本。

2. 将dll文件拷贝到php的ext目录下面。

3. 最后修改一下php.ini文件,增加对eAccelerator的配置:

  1. ; 增加对eAccelerator的引用
  2. extension=eAccelerator.dll
  3.  
  4. [Eaccelerator]
  5. eaccelerator.shm_size="0"
  6. ; 保存Cache的文件目录,需要手动创建
  7. eaccelerator.cache_dir = "c:\temp\eaccelerator"
  8. ; 是否启用
  9. eaccelerator.enable="1"
  10. ;是否优化
  11. eaccelerator.optimizer="1"
  12. eaccelerator.check_mtime="1"
  13. eaccelerator.debug="0"
  14. eaccelerator.filter=""
  15. eaccelerator.shm_max="0"
  16. eaccelerator.shm_ttl="0"
  17. eaccelerator.shm_prune_period="0"
  18. eaccelerator.shm_only="0"
  19. ; 是否压缩
  20. eaccelerator.compress="1"
  21. ; 压缩的级别
  22. eaccelerator.compress_level="9"

这样重启下Apache就可以了。至于Linux下的安装可以参见下面的参考资料。

参考资料:
eAccelerator安装

windows版本的php5.2.3的一个bug

Filed under: DynamicLanguage — Jet @ 10:47 下午
Tags: , ,
原文出处: windows版本的php5.2.3的一个bug
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

PHP5.2.3-win32这个版本有个非常严重的bug,那就是最大内存设置成1024M,但是PHP实际返回的只有2M,经常返回下面的错误:

PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 786432) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1310720) (tried to allocate 393216 bytes)

这是官方的bug报告,该bug只出现于windows版本,linux版本没有这个bug。看来只能等下一次升级的时候修复了。

Zend Framework极好的起步教程

Filed under: DynamicLanguage — Jet @ 10:53 下午
Tags: ,
原文出处: Zend Framework极好的起步教程
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

以前介绍PHP框架的时候曾经提到过Zend Framework,最后提到学习参考的一些资料。其中IBM developerworks 上面的系列文章虽然不错,但是基于0.4版本的,同现在最新的1.0版本有很大的出入,变化太多了。

今天偶然间在网上发现了两篇Rob Allen写的入门文章:Getting Started with the Zend FrameworkGetting Started with Zend_Auth。前者是Zend入门教程,后者是介绍Zend_Auth,文章是基于Zend 0.9x版本的而且写的非常的棒。

值得一提的是前面的教程被Jason Qi翻译成了简体中文,而且翻译的还是非常不错的。目前Jason负责翻译Zend Framework 官方文档中的Zend_Acl,Zend_Auth,Zend_Validate 三部分的工作。大家可以到他的博客上去下载

从PHP4升级到PHP5

Filed under: DynamicLanguage — Jet @ 9:33 上午
Tags: ,
原文出处: 从PHP4升级到PHP5
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

因为有些项目需要使用Zend Framework,需要将原来使用的PHP4升级到PHP5,下面对这次升级总结一下。

安装过程

我的安装环境是:windows 2000 server,Apache2,PHP5.2.3(php-5.2.3-Win32.zip)。
1) 解压缩zip包,将其中的php.ini-recommended改名为php.ini;对php.ini文件进行一些修改

  1. ; 打开这个项使得一些使用tag模板的程序如discuz、dedecms等正常运行
  2. short_open_tag = On
  3. ; 修改php扩展组件的路径
  4. extension_dir = "php安装目录\ext"
  5. ; 增加对mysql的支持,将下面这行文字前面的分号删除即可
  6. extension=php_mysql.dll
  7. ; 设置session保存的目录,这项默认是被注释掉的
  8. session.save_path = "C:/temp"

2) 在Apache中进行设置,打开httpd.conf,在文件中添加如下设置:

  1. # 加载php5的apache模块
  2. LoadModule php5_module "php5的安装目录\php5apache2.dll"
  3. # 增加头文件
  4. AddType application/x-httpd-php .php .php3
  5. # 设置php.ini所在的文件目录
  6. PHPIniDir "php安装目录"

然后重启apache就可以了。

最后说明一句:如果在Apache配置文件中没有通过PHPIniDir “php安装目录”设置了PHP5的根目录的话需要将PHP5的安装目录添加到%PATH%的环境变量中。

一些常见的问题

1) 运行网站提示不能连接mysql数据库
这是因为默认情况下php5不像php4那样至此MySQL的,所以需要手动将 extension=php_mysql.dll 打开使其支持MySQL。

2) 运行某些包含session操作的程序时出现下面的错误提示:

Warning: session_start() [function.session-start]: SAFE MODE Restriction in effect. The script whose uid is 2023 is not allowed to access /var/tmp/ owned by uid 0 in /configs/config.inc.php on line 9

Fatal error: session_start() [function.session-start]: Failed to initialize storage module: files (path: ) in /configs/config.inc.php on line 9

这是php5一个安全模式的bug,默认session的save_path是系统的临时目录,这样会要校验权限。在php.ini文件里,显式指定session的save_path(比如 c:/temp)然后重启web服务就解决了。

3) Apache 设置的时候 PHPIniDir 有什么作用?
与php4搜索php.ini是在%SystemRoot%下不同的是,PHP5按照以下顺序依次查找PHP.ini:

* PHPIniDir (Apache 2 module only)
* 注册表键值:HKEY_LOCAL_MACHINE—SOFTWARE—PHPIniFilePath
* 环境变量:%PHPRC%
* PHP5的目录 (for CLI), 或者web服务器目录(for SAPI modules)
* Windows目录(C:\windows or C:\winnt)

所以如果是Apache + PHP5的话可以使用 PHPIniDir 指定php5的配置文件php.ini的路径。

4) 安装 PHP5 之后打开 Discuz!或DedeCMS 的时候图片和论坛的信息都无法正常显示
解决的方法是打开php.ini,查找short_open_tag,将其设置为short_open_tag= on。对于Discuz!论坛如果还是显示有问题的话可以将forumdata/cache和forumdata/templates下面的文件删除然程序重新创建下缓存即可。

5) 使用网上发布的“汉字验证码”程序的时候只显示背景不显示文字或显示类似“Invalid font filename in xxx.php on line 57”的错误信息
与PHP4不同的是PHP5在安全模式下不能访问系统路径,而网上发布的验证码程序中的字体只有一个文件名而不包含路径,如果指定完整路径(比如:C:\Winodws\Fonts\simhei.ttf)的话则会提示没有访问的权限。估计这个应该是php默认配置权限所造成的,我目前解决的方法就是将字体文件从系统目录直接拷贝到程序目录下面。我估计应该通过设置一下php.ini文件可以实现之前php4的效果,但是目前我还没有找到设置的方法。

6) 文件无法上传?
上传文件的时候出现下面的提示:

File upload error – unable to create a temporary file in Unknown on line 0

这是因为默认的php.ini中没有设置上传的临时文件,默认为系统的临时文件地址。如果没有权限去读系统的临时文件目录的话就会产生上述错误。解决的方法就是去掉 upload_tmp_dir 前面的分号然后设置临时文件目录。

参考资料:
安装使用PHP5和MySQL5的一点心得
apache2和php5整合并支持mysql5
PHP 5.2.2 安全模式session_start权限问题的解决办法
Discuz!团队倾力整理–常见问题合集合

PHP常见问题及解答

Filed under: DynamicLanguage — Jet @ 5:55 上午
Tags:
原文出处: PHP常见问题及解答
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

最近正在做一个PHP的项目,不过PHP算是刚接触,可以说是边学边做了。期间整理了一些常见的问题及解答,相信对其他朋友也有一些用处。

1. PHP中@有什么作用?比如@mysql_query 与 mysql_query 有什么区别呢?
@是PHP提供的错误信息屏蔽的专用符号,所以@mysql_query 与 mysql_query 的区别就是前者运行过程中不显示出现的错误,而后者显示错误。

2. require和include的区别是什么?
二者都是包含一个文件,其中最大的区别在于require()无论如何都会包含文件,而 include() 可以有选择地包含。比如下面的例子:

  1. <?php
  2. if(FALSE){
  3. require('a.php');
  4. }
  5. if(FALSE){
  6. include('b.php');
  7. }
  8. ?>

虽然前面的条件不成立,但是a.php 一定会被包含,而 b.php 一定不会被包含。

3.PHP中的extract是什么作用?一般用于什么场合?
PHP手册中是这样解释的

int extract ( array var_array [, int extract_type [, string prefix]] )

本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。

主要应用如下:

  1. // addslashes -- 使用反斜线引用字符串
  2. // 处理POST表单,把客户端 <form method="post">表单中的变量名取出来。
  3. extract(addslashes($_POST)); </form><form method="post">// 处理GET表单,把客户端<form METHOD="GET"></form>表单中的变量名取出来。
  4. extract(addslashes($_GET));

参考资料:
php 中 @mysql_query 与 mysql_query 有什么区别
require和include基本的区别是什么?
php中include和require有什么区别
PHP中的extract是什么作用??

PHP框架大展台

Filed under: DynamicLanguage — Jet @ 11:05 上午
Tags: , ,
原文出处: PHP框架大展台
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

虽然有些PHP框架出现的时间很早,但是坦白说PHP框架是借着Ruby on Rails的东风开始生机勃勃起来,仿佛一夜之间出现了如此多的框架:CakePHPSymfonyZend FrameworkCode Igniter以及国内的FCSFleaPHP

框架之所以流行就是因为其开发的效率非常的高,非常适合Web开发。综合看了一下比较关注的是下面这两个框架:
1. Zend Framework
zend_framework_logo.png
在PHP界提起Zend,我想没有几个人不知道的。由Zend公司开发的基于PHP5的这个框架非常的强大,它大量应用了PHP5中面向对象的新特征:接口、异常、抽象类、SPL等等。这些东西的应用让Zend Framework具有高度的模块化和灵活性。

Zend Framework 官方地址为:http://framework.zend.com/,并且在官方提供了非常详尽的英文版中文版(未完全翻译完整)指南文档。除此之外,IBM上面名为 PHP Zend 框架 的系列文章也非常值得一读。

2. 国内的FleaPHP
fleaphp_logo.gif

值得欣喜的是国内的PHP框架也发展的很不错,其中FleaPHP就是国人自己开发的。FleaPHP框架的核心非常小,但通过灵活的配置,可以组合出各种类型的基础架构。对于简单的脚本页面,FleaPHP不需要载入MVC模式,只需 要为应用程序提供业务逻辑和数据库服务。而对于复杂的应用程序,FleaPHP可以完成从MVC模式调用、访问控制、数据验证到文件上传、图片处理等各种 各样的任务。

FleaPHP的官方网站为 http://www.fleaphp.org/,并且官方提供了非常通俗易懂的开发指南

参考资料:
年度点评:PHP开发框架的现状和展望
值得研究的PHP主流FrameWork框架

下一页 »