Thursday, August 12, 2010

PHP 5.3 无法连接 MySQL localhost 服务器问题

最近在 Windows 7 上搭建 WEB 开发环境,下载了各组建最新的版本:
  • Apache httpd 2.2.16
  • MySQL 5.1.49
  • PHP 5.3.3
  • phpMyAdmin 3.3.5

照常安装好以后,phpinfo() 运行一切正常但是在 phpMyAdmin 中却无法连接本机的 MySQL。点击“登录”按钮后,页面等待很长时间,然后出现白页。

经过多番搜寻,终于找到了问题的原因。PHP 升级到 5.3 版本后开始使用 native 的 MySQL 驱动,该驱动连接 MySQL 服务时的行为和之前的 libmysql.dll 有所区别,新驱动对 localhost 的解析,似乎是基于 Windows 自己的 hosts 文件的。而在 Windows Vista / Windows 7 以及 Windows Server 2008 上,hosts 文件里 localhost 解析为 ::1,而非传统的 127.0.0.1。开一个 CMD 的窗口执行 ping localhost 即可验证。从而导致函数 mysql_connect() 无法解析和链接到 localhost。

不仅 phpMyAdmin,用 PHP 5.3.x 在任何时候连接 MySQL 的 localhost 服务器都会出现类似问题,例如:
$db = new PDO('mysql:host=localhost;dbname=windia', DB_USER, DB_PASS);

解决的办法有两个:
  • 在代码中避免使用 localhost 而使用 127.0.0.1
  • 将 Windows 的 hosts 文件中
    ::1          localhost
    改为
    127.0.0.1    localhost

Thursday, March 04, 2010

Blogger FTP 迁移工具发布

今天下午 2 点左右,Blogger 专门发布 FTP 功能关闭及转移相关信息的 Blog “Blogger FTP Info”发布消息说 Blogger FTP 的迁移工具上线了Twitter 上的 Blogger 官方帐号也同步发布了这条消息。

目前这个迁移工具还在试用和观察阶段,因此仅在“Blogger in draft”有效。如果你的 Blogger 是基于 FTP 发布且开启了 Blogger in draft,那么现在登录你的 Dashboard,就会发现如下图的一块提示信息,告诉你 FTP 发布功能将会关闭,建议迁移到 BlogSpot 或者用 Custom Domain 功能代替。

Blogger FTP 移植工具提示框

消息以及以上提示框中都提到,FTP 发布功能停止的期限是 2010 年 5 月 1 日,比起先前通知的 2010 年 3 月 25 日,期限又宽限了一个多月。

这则消息还提供了一个视频,用来指导用户如何使用迁移工具对 FTP 发布的 Blog 进行迁移。主要包括以下步骤:
  • 用户选定一个 BlogSpot 二级域名或者 Custom Domain 的域名
  • 如果是 Custom Domain,则需要把自己选定的域名的 CNAME 记录指向 ghs.google.com
  • Blogger 根据用户选定的方案和域名创建新的站点
  • Blogger 向原 FTP 服务器重新发布所有的页面,给所有 HTML 页面添加两条标签:rel-canonicial,用来指示页面的新 URL;meta-refresh,当读者访问旧页面时自动跳转到新的 URL。如果文章数量很多的话,该操作会花费很长时间。工具提供了一个选项,可以让该操作完成时发送邮件通知你。
  • Blogger 向原 FTP 服务器发送一篇新文章,告知所有的读者该 Blog 发生了迁移,同时也通知所有的订阅读者更新订阅地址
  • Blogger 随机请求一些原 FTP 服务器上的页面,确保迁移跳转的内容添加成功
  • 迁移完成,读者用新的地址访问 Blog

总的来讲迁移过程还算简便,对原 Blog 的影响应该说也降到了最低。但其中涉及到重新发布所有页面的环节,对于文章数量很多的博主来说,这个过程及有可能会中断或者失败。至少最近几个月以来,我发布文章时,FTP 上传操作几乎没办法一次成功,更何况是重新发布整个 Blog。

我之前有篇文章提到 Blogger FTP 发布功能关闭的应对措施,因为 BlogSpot 和 Custom Domain 功能在国内都因被墙而无法使用,另外 Blogger 提供的 Layout 模版管理对于我来讲仍然不够灵活,没有对整个网站所有文件的完全控制权,因此我无法,也不会将目前 FTP 发布的 Blog 迁移到 BlogSpot 或者 Custom Domain。解决方案是利用 Blogger 提供的 Feed 接口将所有文章数据同步到本地数据库,然后自己写一些 PHP 脚本利用这些数据直接在服务器上生成静态 HTML 文件。这样,既可以继续使用 Blogger 网站来编辑文章,保存文章;读者访问时直接访问静态页面或使用本地数据库,页面打开速度仍然有保证;我也可以按照自己的方式随心所欲编辑模版,开发各种功能,可谓一举数得。目前这个工作已经开始了,加上 Blogger 又宽限些时间,因此一定可以赶在 FTP 发布功能失效前完成。

Tuesday, March 02, 2010

NOKIA 手机安装 MIDlet 时出现“Conflicting application”错误及解决

最近发现在某些诺基亚(NOKIA)手机上安装带有 Push Registry 功能的 MIDlet 时,会发生安装失败的情况。错误信息有可能是“Push registry failure”(S60v3),或者“Conflicting application”(S40v6),出现这个错误的直接原因,应该是安装程序在执行 Push Registry 注册时失败,认为要注册的目标端口已经被其它应用程序占用。

实际的情况是之前安装过同样的 MIDlet 的旧版本并已经删除。然而,无论是软格机、硬格机,用 Nokia Software Updater 重装/升级 Firmware,都无法解决。

最后发现一个简单但有效的解决办法:
  • 将 JAD Property 的 MIDlet-Push-1 中 Push Registry 的端口改成别的端口
  • 这时 MIDlet 应该能够正常安装。如果你的应用并不在乎使用哪个具体的端口,那么到这里问题就已经解决了
  • 如果应用必须使用之前的那个固定端口,那么将安装好的 MIDlet 删除(卸载)掉,将 JAD 中的端口再改回去,然后就可以正常安装了

Wednesday, February 10, 2010

Windows x64 下 Cisco VPN Client 的替换方案

买了新机器,为了解决硬盘问题重装了系统,顺便装了 Windows 7 x64,绝大多数情况下都没有软件兼容的问题,唯独碰到 Cisco VPN Client 不兼容 Windows x64 且没有提供 64 位的版本。

Google 了一番,发现 Cisco 为 Windows x64 的操作系统提供了一个名为 Cisco AnyConnect VPN Client,但官网上需要特殊的认证用户才能下载,而几经搜索也没找到其它的下载网站。

最后,发现有个国外的论坛有人回复说用 Shrew VPN Client 可以正常的在 Windows x64 下运行。下载下来试用,发现真的不错。安装运行都很简单,关键是还能够直接导入 Cisco VPN Client 的 pcf 配置文件,不用花精力去研究参数配置。所以如果你也需要在 x64 的 Windows 下运行 VPN 客户端又无法安装 Cisco VPN Client,不妨试试这个 Shrew VPN Client。

Friday, February 05, 2010

西数 EARS 绿盘使用心得

这周新配了台电脑,主板:微星 P55-CD53 / CPU:Intel i5 750 / 内存:金士顿 DDR3-1333 2G / 显卡:影驰 GTS250 黑将版 / 硬盘:西数 1TB/64M 绿盘(WD10EARS)。

买回来整体感觉非常好,除了这块西数的新技术 EARS 绿盘。从装 Windows 7 系统开始,到更新系统、安装驱动,系统反应都让人难以忍受。在我 06 年买的笔记本上装 Win7,仅花了不到半个小时,而在这台机器上花了一个多小时。另外用迅雷下载一个几十兆的驱动压缩包,点“开始下载”后,要过 2-3s 界面才会有反应。在使用过程中,硬盘灯大部分时候都长亮,开关机时间也很长,远比我的笔记本开关机慢,系统整体毫无性能可言。这完全不像一台 i 平台的电脑该有的情况。

经过多番搜索查找,到论坛上询问与讨论,做了如下改进和设置,现在虽然硬盘性能仍不尽如人意,但也算可以忍受。打电话到卖电脑的商家,说硬盘本身没问题不给换,要换也是同样型号的硬盘,因此也只能忍了。

这里分享一下我做的改进和设置,希望对同样使用西数 EARS 硬盘忍受暴差性能的朋友能有所帮助。

“高级格式化”技术和 WD Align 软件
从最近推出的 EARS 系列(有 1.0T/1.5T/2.0T 三个型号)硬盘开始,西数推出了一项称为“高级格式化”的技术,简单的理解,就是将传统硬盘每扇区 512 字节改为每扇区 4K 字节。由于 Vista / Win7 系统都能很好的管理 4K 的扇区,因此如果是在 Vista / Win7 下安装格式化,则不需要做任何特别的设置和操作即可发挥硬盘性能,而在 Windows XP 系统下,则需要用西数提供的专门的软件 WD Align。

西数官方网站 WD Align 下载页面详细给出了哪些情况需要使用 WD Align 软件的情况。我的这块硬盘当时装机时是装机师傅用 Ghost 分区然后克隆的操作系统,因此理论上并未发挥硬盘性能。所以特地在 Win7 下安装并执行 WD Align 软件。

安装和执行过程比较简单,根据提示操作即可。安装完开始执行,程序会自动检测系统中的 EARS 硬盘,确认执行 Alignment 操作后系统重启并进入 WD Align 软件界面。执行转换的过程不需要人工干预。我 1TB 的硬盘,只有 C 盘有大约 5GB 的数据,转换过程耗时约 30 分钟。转换完成后会自动重启,进入 Win7 系统,WD Align 软件自动启动,检查转换是否顺利完成,然后退出。

执行完 WD Align 的转换操作后,感觉系统性能有明显的提升。桌面窗口、菜单操作明显不像之前有那么多卡顿的感觉。

开启主板 AHCI 模式及 NCQ 功能
AHCI(Serial ATA Advanced Host Controller Interface / 串行ATA高级主控接口),是在Intel的指导下,由多家公司联合研发的接口标准。使用该技术可让 SATA 储存设备启用高级 SATA 功能,例如原生指令队列(NCQ, Native Command Queuing)及热插拔。

据 Wikipedia 资料:使用 NCQ 功能,通过硬盘固件、硬盘控制器以及操作系统三者的互相配合,改善硬盘内部磁区的读取顺序,可以提高硬盘效能约30%,亦能够轻微减轻硬盘损耗的速率。

从主板 P55-CD53 的说明书上可以看到该主板已经支持 AHCI 模式,而这块新出的硬盘以及 Windows 7 操作系统也理所当然的支持。于是我重启系统到 BIOS 中将 ATA 控制器模式由 IDE 改为 AHCI,重新引导系统,结果 Windows 7 蓝屏,并立即重启了。

纳闷之余搜索了一番,了解到 AHCI 必须在安装操作系统之前就开启,否则安装后 Windows 7 会认为没有使用 AHCI 模式而屏蔽相关的驱动。不过也搜到一篇文章,讲解通过修改注册表,再开启 BIOS 的 AHCI 模式,然后进入 Windows 7 后,系统就会自动开始安装驱动,从而开启 AHCI 模式。具体的注册表路径为:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msahci
将值由原来的 3 改为 0 即可。

照此修改后确实可行,但 AHCI 开启后,HD-Tune、Everest 等软件均无法获取硬盘信息。想起在一篇论坛的帖子中有人提到,安装系统后再开启 AHCI,看起来好像是启用了,但实际对性能并无实际提升。想到目前反正系统也是刚装的,因此索性就在 BIOS 开启 AHCI 的状态下把 Windows 7 重装了一遍,顺便换上了 x64 的版本。

重装后 HD-Tune 和 Everest 都能顺利查出硬盘信息了,另外安装主板驱动提供的 Intel Matrix Storage Manager 软件后,可以查询到硬盘的 NCQ 功能已经开启。

至此,整个系统使用起来感觉比刚开始性能有不小的提升。窗口、菜单操作没有明显的卡顿,开关机速度也有非常明显的改观,至少比我笔记本上同样的 Win7 旗舰版要快。尽管从 HD-Tune 的读取测试,FastCopy 软件的文件拷贝测试来看,性能和速度比起网上给出的西数黑盘有较大差距,但这“较差的性能”已经到了一个可以忍受的范围内,毕竟绿盘的卖点是节能、低噪而不是性能和速度。

最后对于这块西数的新技术 EARS 绿盘,感觉买的比较后悔。或许作为仓库盘来用是不错的选择,但如果是系统盘,完全不值得推荐,价格相差仅几十元的 WD1001FALS 黑盘应该是更好的选择。

Monday, January 25, 2010

Blogger 将关闭 FTP 发布功能及应对措施

Blogger Buzz 上周末发布消息称 Blogger 将于 2010 年 3 月 26 日停止 FTP 发布功能,原因是目前所有的活跃 Blogger 用户中,仅有 0.5% 的用户使用 FTP 发布,而 Blogger 用于支持这一功能的资源则远超过这个比率。

我的 Blog 从 2005 年开始就一直使用 Blogger 的 FTP 功能发布,已经有四年多的时间,也因为这样所以一直可以相对正常的访问。说“相对”是因为 blogger.com 域名被封,时不时的也会引起页面的外部 CSS / JavaScript 资源无法访问,Feed 内容无法访问引起评论失败等问题。现在 Blogger 官方宣布将彻底停止 FTP 功能的支持,将会对我这两个 Blog 带来四年来最大的一次冲击。

不过可以肯定的是,我不会关闭这两个 Blog,也不回搬家到别家 BSP。其实最近一两年,随着文章数量的增加,利用 FTP 发布已经变得越来越困难,平均十次发布,至少要失败五次。而按现在 Blogger 的机制,无论是发布文章还是有网友发表评论,首页、文章页面以及相关的标签页面都会重建,如果修改模版,则所有的页面都需要重建,这样高的失败率,让人很难觉得这是一个好用的产品。

由于页面代码优化的需要以及应对 blogger.com 域名从国内无法访问的问题,我已经建立起一套机制实现从 Blogger Feed 下载文章的数据保存到本地数据库,用 PHP 扫描页面进行 XHTML 修改以及用 AJAX 获取相关文章 / 热门文章的功能,现在其实要保持 Blog 继续正常运行,只需要:
  • 在数据同步时将正文部分也下载
  • 利用下载的数据在本地用 PHP 重写 Blog 内容,或生成静态页面

这样不但免去了等待漫长的 FTP 发布以及高失败率的问题,也让我维护 Blog 变得更加灵活。

离 Blogger 停止 FTP 功能还有大约两个月的时间,我想已经足够我做这些改进了。

Monday, September 21, 2009

用 Feed 实现 Blogger 分页

使用 Blogger 建博客,一个很不爽的问题是在首页下方没有分页功能,这会直接导致有兴趣的读者没有办法方便的翻阅以前的旧帖子;而 Blogger 提供的模板,无论是老的 Template,还是新的 Layout,都没有相关的标签来实现这个功能,因此要加上这个功能,就只能继续 hack 了。

这两天利用 Blogger 的完整帖子的 Feed,配合 PHP 实现了这个功能。思路为:
  • 读取原始的 index.html,把帖子的部分去掉,也就是 <Blogger>...</Blogger> 这段内容
  • 读取以下 Feed 地址,解析出文章的日期、时间、标题、正文、标签等,按照原来模板的格式,用 PHP 输出到原来 index.html 放文章的地方
    http://www.blogger.com/feeds/[blogId]/posts/full?max-results=[step]&start-index=[startIndex]&orderby=published
  • 根据当前页码以及总帖数计算分页,在页面底部添加分页链接
  • 如果有条件,可以利用 .htaccess 文件,将分页的 URL 由原来的
    xxx.php?page=x
    形式替换成对搜索引擎更友好的
    /index/x
    形式

如此一来,就可以在自己不存储任何文章数据的情况下,实现分页功能。当然,直到目前,以上的 Feed 地址仍然是被墙的,需要翻墙或者使用 HTTP 代理才能成功地获取内容。

Sunday, August 16, 2009

phpMyAdmin 使用时 Apache 崩溃问题

最近笔记本的硬盘时常怪响,因此换了一块硬盘以防万一,系统重装了,因此开发环境 PHP + MySQL + Apache 也需要重搭。因为已经做过很多次,做起来轻车熟路,然而装好 phpMyAdmin 以后,在登入界面输入用户名密码点登入,居然弹出一个 Windows 应用程序进程崩溃的 report 对话框:Apache 崩溃了……

重新试了几次,仍然如此,换以前硬盘上的 PHP 目录(保证 PHP 的配置和以前一致),无效;换 Apache 版本,无效;换 phpMyAdmin 较早的可以正常使用的版本,无效;用 MySQL 官方的 GUI 客户端登录,可以读写数据,因此不是 MySQL 的问题,于是我就没辙了……

上 Google,发现很多人都有类似的问题,最早的帖子甚至可以追溯到 2003 年,然而没有看到一个有用的解释或者回答,但终究找到一个网页提到架设 PHP + MySQL + Apache 的时候,要保持 MySQL 的客户端连接库 libmysql.dll 版本一致,最好使用 PHP 自带的 dll。

想到这次设置 PHP 时,没有像以前把所有的 dll 都拷贝到 %windows_root%\system32 下,而只是直接的把 D:\PHP 加入到了 PATH 环境变量中。于是马上照以前的办法,把 PHP 包中的相关 dll 都拷贝到了 system32 下,再启动 Apache,进 phpMyAdmin,问题解决了。

用了一会儿,问题有时候仍然存在,于是又把 %Apache%\bin\libmysql.dll 删除(或改名),则问题解决了。但是在 phpMyAdmin 登入后,首页下方会提示说当前使用的 MySQL 客户端版本和服务器版本不相符,可能导致不可预料的结果。

如果各位对此问题有没有更透彻的解释以及彻底的解决办法,望不吝赐教。

Update 2010-02-10:

这个问题似乎和 MySQL 的版本有关。之前出现此问题的 MySQL 版本是 5.4 beta。最近在新机器上同样的架构和设置,只是 MySQL 版本为 5.1,没有出现该问题。

Wednesday, July 08, 2009

Google 宣布涉足操作系统:Chrome

Google Chrome
Google 官方博客今天早些时候发布文章,Introducing Google Chrome OS,Google 黑板报随后在下午也发布了此文的中文翻译:谷歌 Chrome 操作系统

Google 自九十年进入人们的视线,到现在将近二十年时间,从名不见经传的小公司,已经成为世人瞩目的具有极大影响力的互联网巨舰。坊间曾一度传闻 Google 终将涉足操作系统领域,而前两年推出 Android 手机系统也被认为是对涉足操作系统的投石问路。而现在,终于为我们揭开了这层面纱,比想象中要来的早的多,快的多。

如果说 Chrome 浏览器足以让微软不安的话,那么 Chrome 操作系统对于微软可以说是一枚重磅炸弹。Google 在行业一项有着较好的声誉,其产品也从来不缺乏用户、支持者乃至狂热者。有人说 Google 越来越巨大,并不容乐观,因为极有可能发展成为第二个微软,最终变成另一个邪恶的垄断帝国。但就目前的形式来看,在微软的 Vista 叫好不叫座,强行推行仍无人问津,仓促推出 Windows 7;IE 系列一代不如一代,市场占有率持续下滑的今天,如果有另外一家公司为我们提供更有竞争力的产品、更新的理念、甚至一场革命,未尝不是一件好事。

当然,以上的担忧也未必就是杞人忧天。这就像一位骁勇善战的将军,为广大民众打败入侵的外敌,带来和平与繁荣,集权利、荣誉与威望于一身,最后到底是成为独裁的暴君,还是继续服务于人民的福祉?期待 Google 能够给我们一个正面的范例。

Gmail 结束 Beta

Gmail Out of Beta
Google 官方博客及 Twitter 上的 @google 昨晚都发布消息,称 GmailGoogle DocsGoogle Calendar 以及 Google Talk 结束 Beta。“Beta” 标记将从这些产品的 LOGO 中去除,但无论是否 “Beta”,Google 都将继续对这些 WEB 应用程序进行创新和改进。

记得自己在 Gmail 刚推出的时候,就收到邀请注册了,并一度做为自己的主要私人邮箱使用,已经有很多年了。(据 Solidot 文章,Gmail 于 2004 年 3 月 31 日推出,所以到现在已经有 5 年多了。)

一项以及多项相关产品有如此长的 BETA 期,这是很少见的。加上我所在公司的其它部门曾经做过 Android 平台 API 的单元测试工作,据说该平台自推出后的很长一段时间,该 API 中 bug 非常多且 API 文档混乱。另外据我多年使用 Blogger 作为博客平台的经验,其 bug 之多也是在公众运营的产品中遥遥领先的。

尽管 Google 的创新能力和“不作恶”是另世人和广大互联网用户称道的,但以上事实也让我非常怀疑 Google 内部的代码质量控制。现在此四项产品的最终结束 Beta,应该可以说对 Google 的形象起到了长远的积极作用,也希望 Google 能为我们提供更多更稳定更惊艳的互联网产品。