PHP中 HTTP_HOST 和 SERVER_NAME 的区别
2010.07.02 // 1 Comment
最近在开发站群软件,用到了根据访问域名判断子站点的相关问题。PHP获取当前域名有两个变量 HTTP_HOST 和 SERVER_NAME,我想知道两者的区别以及哪个更加可靠。 首先我想说,百度上那些转来转去的文章都是扯淡! 有说相同的,有说不同的,都没说明原因,没经过验证就互相转来转去的,浪费观众时间。 下面说说本人经过亲自验证 + 查阅官方文档 + 官方BUG列表 + 官方邮件列表 + sitepoint + webmasterworld + google的总结: 相同点: 当满足以下三个条件时,两者会输出相同信息。 1. 服务器为80端口 2. apache的conf中ServerName设置正确 3. HTTP/1.1协议规范 不同点: 1. 通常情况: _SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。 _SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。 2. 当服务器为非80端口时: _SERVER["HTTP_HOST"] 会输出端口号,例如:mimiz.cn:8080 _SERVER["SERVER_NAME"] 会直接输出ServerName值 因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT 3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时: httpd.conf配置如下: <virtualhost *> ServerName mimiz.cn ServerAlias www.mimiz.cn </virtualhost> 客户端访问域名www.mimiz.cn _SERVER["HTTP_HOST"] 输出 www.mimiz.cn _SERVER["SERVER_NAME"] 输出 mimiz.cn 所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。
让 eclipse 支持任意字符的代码提示
2010.06.17 // No Comments
本来zend studio用的挺好的,最近常同时写java和php,eclipse和zend studio之间换来换去的太麻烦了,今早抽出点时间,统统整合到eclipse上面,既可以在一个IDE上面写多种语法,又可以节省zs消耗的不可思议的内存。 具体整合方法会在另一篇文章中记录。 整合成功后,问题出来了,在eclipse中似乎只有按alt+/时才会出现代码提示,而且content assist中的auto activation triggers文本框中只能输入一定数量的字符串,按照php的规则,当按下26个字母、$、> 等符号都需要出现提示才比较完美,经过网友的帮助,终于知道了解决之法,具体方法如下: 1. 点击 Eclipse 的 Window -> Preferences -> PHP -> Editor -> Code Assist-> Auto Activation 打开里面的 Enable auto activation 选项,Auto activation triggers for PHP 输入框中的默认值是 “$:>”,随便改成自己能记住的并且是唯一的,比如我改成了“mimiz.cn”,然后 Apply。 2. 点击 File -> Export,在窗口中展开 General -> Perferences -> Export all 然后点击 next,点击Browse,选择任意的一个路径,保存配置文件,然后点击”Finish”。 3. 用记事本打开保存的*.epf文件,查找刚才修改的字符串。把“mimiz.cn”修改为“$>:.abcdefghijklmnopqrstuvwxyz”。 4. 打开Eclipse的 File -> Import 然后在打开的窗口里展开 General -> Perferences,点next,选择刚才修改过的配置文件,Finish。 5. 重启Eclipse,体验一下吧。
zend framework 框架中自定义父控制器
2010.05.28 // 5 Comments
今天简单的聊聊ZF框架中的控制器。 大家都知道ZF中不可以使用__construct()构造方法,类的初始化操作需要用init()方法完成, 原因大部分朋友都应该了解,在php中,当子类有构造方法时,父类的构造方法不会被调用, 通过阅读zend/controller/Action.php的__construct()可以知道,它通过使用$this->init(),类似注入的方式,避免了这种情况。 那么在一个项目中,若干的controller可能会做一些同样的动作,比如初始化session、实例化一些对象等等, 如果在每个controller的init()中,写一些重复的代码,当controller比较多时,一来比较麻烦,二来不方便后期维护。 怎样解决这个问题呢?可以把这些代码写到一个文件中,然后include(),也可以OOXX,但我不认为这是个好办法,我的方法是,自定义一个父控制器。 例如:在library目录中新建一个Mylib/Controller/Parent.php文件,让这个文件继承zf的Controller,这样写: class Mylib_Controller_Parent extends Zend_Controller_Action { public function init() { parent::init(); // Your custom code } } 以后在每个项目controller中不要继承ZF的默认控制器了,直接继承我们自己的Parent: class DefaultController extends Mylib_Controller_Parent { public function init() { parent::init(); // Your custom code } } 就是这么简单。 第一篇关于Zend Framework的文章,没什么技术含量,以后我会把项目中常用到的、实用的ZF经验技巧写下来,谢谢大家支持。
php pdo 连接 sql server 2005 的方法
2010.04.22 // 2 Comments
注意,本文告诉你如何更好的用pdo连接sql server 2005 而不是 2000。 废话不多说,只说重点,按步骤来: 1. 确保正确安装sql server 2005 , 开启sql server的远程连接访问,检查防火墙,确认在本地可以通过SQL Server Configuration Manager连接到服务器。 2. 修改 php.ini 开启相关扩展(php_pdo.dll ,php_pdo_mssql.dll ,php_mssql.dll),重启apache后,一定要用phpinfo()检查是否成功加载。 3. 修改php.ini中:mssql.secure_connection = Off ,网上很多人说改为On,那是扯淡,改为Off就对啦。 4. (重点) 如果是连接sql server 2000,只需要把php根目录下的ntwdblib.dll文件copy到apache/bin/或者windows/system32/, 但是连接 sql server 2005 必须使用2000.80.194.0以上版本的ntwdblib.dll文件, 在sql server 2005 安装光盘中可以找到。 (下载地址:http://download.pchome.net/dll/n/detail-171972-0.html) 5. PDO连接mssql的字符串服务地址后加“,端口号”,注意是逗号,不是冒号。 例如: $db = new PDO (“mssql:host=192.168.0.1,1433;dbname=testdb”,”sa”,”pw”);
积极遵循国际网站标准(Web Standards)
2009.10.02 // 5 Comments
最近忙着整理WEB标准化相关的教案,无意中搜出来04年刚接触WEB标准化时发表的一篇文章,颇多感慨…… 回想5年前,一本叫做《网站重构》的书,彻底改变了我在WEB前端的思想和观念,让我义无反顾的投入到标准化大军之中。 5年中,有多少个日日夜夜,在调试浏览器兼容性和CSS hack中痛并快乐着,感谢BlueIdea上面可爱又善良的朋友们,在我同浏览器斗争到抓狂的时候给了我雪中送炭的帮助。 通过WEB标准化认识的这帮可爱的朋友,是我最珍贵的友谊,感谢 秀才、单飞、猪猪、禽兽、七二、少龙、宇……以及那些我叫不上名字但却心有灵犀的人。 以下是帖子内容,发到这里作为纪念: 声明:本贴原出处为W3CN,经本人修改发表。 99.9%的网站是过时的”——当我猛然看到这个标题时,真的吃了一惊,但是当我仔细读完《网站重构》这本书后,觉得这句话一点不夸张。 想想自己从2000年开始到现在,做网站也有一段时间了,一直都以DW+FP为主,遇到软件实现不了的就手写一些html,可是不论我用什么方法,什么工具,同HTML规范相比是那么糟糕。 现在大部分网站都大量使用表格来进行定位,这样却实比较容易,但结果却造成代码臃肿不堪,看似华美的界面,背后却是不计其数的亢余代码,诺大的一片互联网真正遵循国际网站标准的寥寥无几 当国内的设计师现在都以为HTML已经没有什么可学,只要会使用Dreamweaver就行的时候,当我们沉醉在网页特效、Flash动画的时候,Web标准的推广已经成为国外一种普遍的现象。目前国内大多数客户都不清楚对网站的具体要求,他们注重的往往只是外观是否漂亮,基本功能是否实现,而不会去查看页面的原代码是否符合标准,也不会去问数据格式是否易于扩展交互。网站是否符合标准,很多时候都取决于设计者、开发者的知识面和认识。但是不能说因为客户不清楚、不要求采用Web标准,我们就可以偷懒和省略。作为网站设计师,有责任和义务去推广和采用Web标准。 那么让我们赶紧跟上新时代的步伐,一起来了解一下网站标准。 一.为什么要建立网站标准 我们大部分人都有深刻体验,每当主流浏览器版本的升级,我们刚建立的网站就可能变得过时,我们就需要升级或者重新建造一遍网站。例如1996-1999年典型的”浏览器大战”,为了兼容Netscape和IE,网站不得不为这两种浏览器写不同的代码。同样的,每当新的网络技术和交互设备的出现,我们也需要制作一个新版本来支持这种新技术或新设备,例如支持手机上网的WAP技术。类似的问题举不胜举:网站代码臃肿、繁杂浪费了我们大量的带宽;针对某种浏览器的DHTML特效,屏蔽了部分潜在的客户;不易用的代码,残障人士无法浏览网站等等。这是一种恶性循环,是一种巨大的浪费。 如何解决这些问题呢?有识之士早已开始思考,需要建立一种普遍认同的标准来结束这种无序和混乱。商业公司(Netscape、Microsoft等)也终于认识到统一标准的好处,因此在W3C(W3C.org)的组织下,网站标准开始被建立(1998年2月10日发布XML1.0为标志),并在网站标准组织(webstandards.org)的督促下推广执行。 简单说,网站标准的目的就是: 提供最多利益给最多的网站用户 确保任何网站文挡都能够长期有效 简化代码、降低建设成本 让网站更容易使用,能适应更多不同用户和更多网路设备 当浏览器版本更新,或者出现新的网络交互设备时,确保所有应用能够继续正确执行。 对于网站设计和开发人员来说,遵循网站标准就是使用标准;对于你的网站用户来说,网站标准就是最佳体验。 访问量排名世界第4,中国第1的新浪网站,也遭遇非标准DHTML的问题。在最新发布的Netscape7和Mozila1.6浏览器中,新浪首页的漂浮广告全部失效,层叠挤在页面左下角。也许那些广告主认为损失这些潜在的用户无所谓 二.什么是网站标准 网站标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由W3C起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。我们来简单了解一下这些标准: 1.结构标准语言 (1)XML XML是The Extensible Markup Language(可扩展标识语言)的简写。目前推荐遵循的是W3C于2000年10月6日发布的XML1.0,参考(www.w3.org/TR/2000/REC-XML-20001006)。和HTML一样,XML同样来源于SGML,但XML是一种能定义其他语言的语。XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。关于XML的好处和技术规范细节这里就不多说了,网上有很多资料,也有很多书籍可以参考。 (2)XHTML XHTML是The Extensible HyperText Markup Language可扩展标识语言的缩写。目前推荐遵循的是W3C于2000年1月26日推荐XML1.0(参考http://www.w3.org/TR/xhtml1)。XML虽然数据转换能力强大,完全可以替代HTML,但面对成千上万已有的站点,直接采用XML还为时过早。因此,我们在HTML4.0的基础上,用XML的规则对其进行扩展,得到了XHTML。简单的说,建立XHTML的目的就是实现HTML向XML的过渡。 2. 表现标准语言 CSS是Cascading Style Sheets层叠样式表的缩写。目前推荐遵循的是W3C于1998年5月12日推荐CSS2(参考http://www.w3.org/TR/CSS2/)。W3C创建CSS标准的目的是以CSS取代HTML表格式布局、帧和其他表现的语言。纯CSS布局与结构式XHTML相结合能帮助设计师分离外观与结构,使站点的访问及维护更加容易。 3.行为标准 (1)DOM DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscaped的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。 (2) ECMAScript ECMAScript是ECMA(European Computer Manufacturers Association)制定的标准脚本语言(JAVAScript)。目前推荐遵循的是ECMAScript 262(http://www.ecma.ch/ecma1/STAND/ECMA-262.HTM)。 三.遵循标准的网站与传统网站的区别 传统网站只是印刷媒体的延伸,设计目标是保证在4-6个主流浏览器版本中看起来一致。通常的特征是: 以表格为基础的布局。 内容与表现方式混杂在一起。典型的例子是<font>标签。 垃圾代码(非标准代码)。 不易用的代码。 语义不正确的代码。比如<b>不解释的话,你根本不明白这是字体加粗的意思。 而采用网站标准建立的网站是一个能够接受各种用户和各种设备的广泛的交流沟通工具。一般特征是: 语义正确的标识。即使用能够表达含义的标签。保证代码可以在文本浏览器、PDAs、搜索引擎中被正确理解。 正确有效的代码。通过W3C代码校验(http://validator.w3.org/)的就是正确代码。 对人、机都易用的代码。能够接受广泛的用户和设备的访问, 用CSS分离表现层和内容。使代码更简洁、下载速度更快,批量修改和定制表现形式更容易。 四.采用网站标准的好处和缺点 1.好处 对网站浏览者的好处: 文件下载与页面显示速度更快; 内容能被更多的用户所访问(包括失明、视弱、色盲等残障人士); 内容能被更广泛的设备所访问(包括屏幕阅读机、手持设备、搜索机器人、打印机、电冰箱等等) 用户能够通过样式选择定制自己的表现界面 所有页面都能提供适于打印的版本 对网站所有者的好处: 更少的代码和组件,容易维护 带宽要求降低(代码更简洁),成本降低。举个例子:当 ESPN.com 使用 CSS改版后,每天节约超过两兆字节(terabytes)的带宽。 更容易被搜寻引擎搜索到 改版方便,不需要变动页面内容 提供打印版本而不需要复制内容 提高网站易用性。在美国,有严格的法律条款(Section 508)来约束政府网站必须达到一定的易用性,其他国家也有类似的要求。 2.缺点 需要花费更多时间来学习标准 依然需要注意浏览器的兼容问题 用 CSS 来实现某些表现反而比表格更为麻烦 五.怎么改善现有网站 我们大部分的设计师依旧在采用传统的表格布局、表现与结构混杂在一起的方式来建立网站。学习使用XHTML+CSS的方法需要一个过程,使现有网站符合网站标准也不可能一步到位。最好的方法是循序渐进,分阶段来逐步达到完全符合网站标准的目标。如果你是新手,或者对代码不是很熟悉,也可以采用遵循标准的编辑工具,例如Dreamweaver MX [...]
phpMyAdmin出现PHP has encountered an Access Violation at XXXXXXXX
2009.09.20 // 2 Comments
昨天在帮朋友配置IIS+PHP环境的时候,安装phpMyAdmin出现了PHP has encountered an Access Violation at XXXXXXXX的错误。 由于第一次碰上这种问题,只好去百度搜索答案,然而每次用百度解决技术问题都令我很失望,同时也越来越感慨国内Copy精神的强大。 翻遍了百度前10页的内容,得出错误可能原因如下: 1. ZendOptimizer和php不兼容 2. session_save_path路径不存在或没有足够的权限 3. 内存不足 4. libmysql.dll版本不兼容 5. php或IIS相关文件权限不够 看来不能指望百度,于是又去google继续搜,翻译结果如下: 1. 这是一个PHP的版本bug,是php典型的bug 2. 据说此bug已经修复近4年,仍未完全解决 3. 老外们在使用IIS时经常碰到同样的错误,不同的内存地址 4. 老外的论坛中有很多人提问相同问题,但没有回帖的,没有很好的解决方法。 5. 可以参考:http://bugs.php.net/bug.php?id=28929 看来这个错误没有固定的解决方法,只能靠自己摸索了。 我尝试了所有搜索到的、可能的方法,但仍然没有解决问题。 最后抱着试试看的态度,下载了一个最新版本的phpMyAdmin,问题解决了。 总结: 1. 造成此错误的随机性太强,不要期望有固定的解决方法 2. 根据硬件、软件环境,具体情况具体分析 3. 重点检查权限问题和兼容性问题 4. 不要仅仅考虑php、Zend等服务环境的兼容,网站代码的兼容性也不能放过 5. 遇事冷静思考,没有解决不了的问题

