为什么PHP做网站要使用框架?

如果用PHP做网站不用框架,下面问题如何解决?

  • 相应代码缺少注释,文档化麻烦
  • 前后台没有框架机制,不利维护和敏捷开发
  • 没有缓存机制,无法快速切换各种缓存模块
  • 没有错误处理机制,无法系统排错,无法准确定位错误点
  • 缺少模板机制,代码HTML混杂,降低安全性

PHP做网站使用框架framework的好处

  • 面向对象,扩展性好
  • 模块化,可重用性高
  • 底层封装,更少的代码量,更快速度开发
  • 代码管理,文档化方便,也利于Unit test

目前流行的PHP框架:

CakePHP 开发框架
如果你仍然需要编写面向PHP4兼容的代码,CakePHP 将是一个非常不错的选择, 在PHP 4 & 5的MVC式框架列表里面,CakePHP都曾经是最流行的。

Zend Framework框架
Zend Framework 是面对一些较有经验的开发者和从底层构建一些企业级应用程序而设计的。

CodeIgniter
CodeIgniter 是一个PHP5.2+ 的MVC框架,它体积小巧切具有丰富的文档资源。通常被称为“初学者框架”。

Symfony
Symfony 是最古老的PHP框架之一,他同样也是转为企业级Web应用程序而设计的。Symfony使用命令行代码生成工具来为项目快速生成所需的代码。
Symfony的网站上手机了大量的教程和范例代码,来帮助你熟悉掌握他们。

Yii Framework
Yii 是一个高度模块化,高性能的PHP5框架,专门为了Web应用程序而开发。Yii是其最主要一大特性,运行起来比Codeigniter和Zend框架要快。

Windows下为PHP53安装memcached

我的环境是XP,apache2.2,php5.3.28。
先下载windows版的mamcached server: http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip

然后下载5.3.27版的php_memcache.dll:http://windows.php.net/downloads/pecl/snaps/memcache/3.0.9/php_memcache-3.0.9-5.3-ts-vc9-x86.zip

把php_memcache.dll解压,放入ext目录。把memcached.exe放在C盘memcached目录下。

以管理员身份运行DOS,安装memcached server: c:windwosmemcached -d install 然后memcached -d start。打开服务列表,能看到mamcached server已启动。

重启apache,即可测试memcached php程序。

Heroku Python提交失败的问题

本以为nodejs搞定,在Heroku上提交python应该易如反掌,哪知又出问题:
提交时出错提示:“Push rejected, no Cedar-supported app detected”。
出现这个错误是heroku无法判断app的类型,通常python需要在app根目录下有requirements.txt这个文件。
后来发现是我的用户目录下的.gitignore里屏蔽了所有text文件,增加一行!requirements.txt后问题解决。

Windows下搭建Heroku的nodejs测试环境

在Heroku上新建App: twittest-njs,下载heroku-toolbelt.exe,安装后在本地dos下heroku login登录。
然后步骤如下:

#add web.js 添加测试代码

本地git init一个目录:twittest-njs,打开dos进入该目录
运行#npm init
运行#npm install express logfmt –save

dos下提示registry.npmjs.org访问出错:
npm ERR! Error: SSL Error: CERT_UNTRUSTED
wayout: npm config set strict-ssl false

npm ERR! error rolling back express@3.4.4 Error: ENOTEMPTY
npm ERR! Unsupported
npm ERR! Not compatible with your version of node/npm: connect@2.11.0
npm ERR! Required: {“node”:”>= 0.8.0”}
npm ERR! Actual: {“npm”:”1.1.12”,”node”:”0.6.14”}

wayout: upgrade http://nodejs.org/download/ http://nodejs.org/dist/npm/ to Program Filesnodejs
解决办法,升级node和npm到最新版。

#add Procfile 创建Procfile文件到当前目录,内容如下:
web: node web.js

在目录 D:Program FilesHerokuruby-1.9.2bin> 下运行#foreman start出错,提示:
foreman start(0.63)
Bad file descriptor

wayout: gem uninstall foreman;gem install foreman -v 0.61
原因是0.63版本的foreman有问题,换到0.61即可。

复制 copy foreman和foreman.bat 从D:Program FilesHerokuruby-1.9.2bin> 到 to herokutwittest-njs
编辑foreman.bat edit: ruby.exe前增加路径:”D:/Program Files/Heroku/ruby-1.9.2/bin/“
当前目录herokutwittest-njs下运行:#foreman start

结果显示如下:
19:08:07 web.1 | started with pid 5880
19:08:09 web.1 | Listening on 5000

打开浏览器访问:http://localhost:5000/,网页显示:Hello JS World!

至此,Windows下搭建Heroku的nodejs测试环境成功。

补充:如果部署到Heroku出现如下错误:
Fatal: Could not read from remote repository.
或者:
PuTTY Fatal Error: Disconnected: No supported authentication methods available

强烈建议重新安装git,安装时选择openssh,而不是putty。

天路之旅-川藏线走尼泊尔

没想到自己这么快回又走川藏线进藏,也没想到我会以这么快的形式走完到尼泊尔的三千多公里。前五天,我坚持徒步翻过了折多山,来到了新都桥。但是随着大雪的来临,我不得不以坐班车的形式继续川藏线的朝圣之旅。一路上的山山水水,都将铭记于心,川藏线的风景绝对都在路上,而不是在拉萨和加德满都。IMG_20131226_124234

Godaday主机之间快速迁移的办法

Godaddy主机好用,但是常常有些IP的主机会被Block(你懂得),所以换不同IP的主机是常有的事,如果主机下的域名太多,就是一件很烦人的事。我总结这段时间迁移的经验,主要步骤如下:

1、激活新旧主机的SSH,将旧文件和数据库文件打包迁移到新主机。

2、在新主机添加新的mysql帐号,导入数据库文件。

3、修改域名指向到新的主机

4、在hosted domains里面,先删除旧主机的域名,再到新主机里面增加迁移的域名。

整个过程五分钟可以搞定。算是蛮快捷啦~

初次徒步川藏线

八天时间,从雅安到泸定,海拔从600多米到2200多米,以减肥、立志为目的,没想到自己能够在川藏线完成一段140公里的纯徒步的长途旅行。虽然相对整个川藏线来说,这段路程几乎可以忽略不计,但是对于我这个初次尝试户外徒步旅行的新手来说,意义重大。

这次徒步能够顺利完成,一靠徒步装备准备的好,二靠自己坚定不移的意志,克服重重困难,终于有所回报。主要装备有防暴雨帐篷、羽绒睡袋、自动充气垫、防潮垫、登山杖、65+10升的专业背包、气炉、碗筷,和一些基本的保暖透气衣物、护膝等。但是也带来了,长途徒步的最大问题,就是背包对于自己的体质来说,太重了。估计40斤上下。虽然一路意志坚定,但是也造成自己膝盖韧带拉伤的沉痛教训。

从整个徒步过程看来,我经历了前三天的适应期,和后三天的兴奋期,以及最后两天的疲劳期。

在适应期,我逐渐适应了沉重的背包,以及长途走路造成的脚底水泡问题。在兴奋期明白了徒步带给人的愉快和惬意,以及每天步行20公里左右,带给人在身体上的健康和舒适感,在疲劳期,由于有些心急,急于到达目的地,也加剧了身体和双脚的疲劳损伤。

另外,由于自己在徒步登山、上下坡方面安全知识的不足,导致忽略了对腿部和脚步保养,以及安全认知。这也促成了自己腿部的拉伤。

这段徒步,主要的挑战是翻越二郎山,上山20多公里,到山顶穿越4公里的隧道,然后再经历29公里的下坡直到泸定县。个人感觉,背包沉重,上下坡倒是比平路轻松。自己膝盖的拉伤就是在29公里的下坡途中造成,以为下坡很轻松,提高了速度,持续时间超过11个小时。不知不觉,膝盖的酸痛越来越明显,最后三公里,强忍疼痛到达泸定。

这是本次徒步最大的教训。如果不是认为伤痛,我想距离也许就远远不止140公里啦。期望下次能够继续川藏线的徒步!

测试PHP on GAE

考虑到未来对PHP代码的保存和测试、开发的方便,我决定使用Mac版。

安装指导看这里:https://developers.google.com/appengine/docs/php/gettingstarted/installing

Mac版的安装,需要先安装macports。 我用的是lion版的pkg文件。

最后启动PHP SDK:
./dev_appserver.py –php_executable_path=/opt/local/bin/php-cgi54 helloworld/

浏览localhost:8080成功。

在申请到PHP的High Replication应用后,

提交到GAE:appcfg.py update helloworld/

测试成功!

Twitter REST API升级到1.1

好久没看Twitter,发现API无法返回内容,原来是升级啦,v1已经停止使用。
The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.

解决办法,把旧的API地址换成

var $twt_url=’https://api.twitter.com/1.1/‘;

即可。

另外search的调整,从/search.json?到/search/tweets.json?,返回的results也变成了statuses。这不是折腾吗?

网页制作带给我的那份宁静

好久没有手写HTML制作网页了,可以说我已经从IT转行到了另外的行业一段时间。如今,又可以再次练练手,久违的熟悉,轻松和平静,这份感觉很好,想到不我尽然还能快速进入状态,总以为三十岁过后写网页大脑无法负荷是真的。现在,我可以气定神闲地说,我会写网页到老,慢慢享受这份平静与作品的雕凿。

很高兴,我己经几乎可以把网页设计与制作当作一个兴趣,而不是赚钱工作。这让我有更多的时间和缓冲去慢慢雕凿网页作品,就像一个根雕师傅所做的。不为钱,不为赶时间,只为满足自身的那份满足感和成就感。

原来这才是真正的做网页,年轻时的磨练和卖命,仅仅是一个基础训练,而不是在做设计。很庆幸,我可以体会到这一点。很享受~

初学ios遇到的问题

ios学习一直断断续续,学了忘,然后又学。这里记录些我遇到的问题,备忘。

项目没有Resources?
右键蓝色项目图标,新建Group,改名为Resources。然后添加自己的资源文件进项目即可。

Xcode黄色感叹提示: property access result unused getters should not be used for side effects
Xcode推荐用[self prop]来代替点号获取属性。

UnitTest错误:Unit tests are not implemented yet
在setUp里面添加[self testExample]即可

Accelerometer测试无法用模拟器,需要真机测试。

delegate类似于PHP的interface。

面向对象编程的SOLID原则

SOLID原则(单一职责,开放封闭,里氏替换,接口隔离和依赖反转)是面向对象编程和设计的五项基本原则。目标是创建一个系统,很容易维护和扩展。

S代表SRP:
Single responsibility principle 单一职责原则
a class should have only a single responsibility. 一个类应该只有一个单一的职则

O代表OCP
Open/closed principle 开放封闭原则
“software entities … should be open for extension, but closed for modification”. 软件个体应该对扩展开放,而禁止对内部的修改

L代表LSP
Liskov substitution principle 里氏替换原则
“objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program”. 程序对象应该可以被它的子类实例替换,而不失正确性

I代表ISP
Interface segregation principle 接口隔离原则
“many client-specific interfaces are better than one general-purpose interface.” 多个专门的接口优于多合一的接口

D代表DIP
Dependency inversion principle 依赖反转原则
one should “Depend upon Abstractions. Do not depend upon concretions.” 不同级别的模块之间的依赖应该在于抽象,而不是具体

Link: http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29

为什么我对Flash的前途保持谨慎乐观

这段时间在微博和推特上看到对Flash前途的种种褒贬,深感Flash正在丧失它的Web平台优势。对三维性能的提升有限,而又主动放弃某些自身的优势,将是自掘坟墓的开始。

从我个人的最近使用经历来看,Flash对CPU温度的影响确实很大,以至于我用MAC看Flash时不得不随时监测CPU的温度,一旦超过90度,就不得不暂停。是MAC培养了我控制CPU温度的习惯。Windows下虽然没有温度的担心,却又让我不得不考虑,是该控制CPU的温度在合理范围。如果Flash不能解决MAC下CPU温度的问题,Flash很难成为真正的跨平台Web利器。

最近,Unity3D也宣布将会停止对Flash的支持,它的理由包括对Flash的game平台的失望,Flash提出后又取消和开发者的分成模式,Flash开发人员逐渐撤离Flash平台。

64位iis6运行PHP的问题

配置好PHP+iis6环境出现如下错误:%1 is not a valid Win32 application
解决办法是运行:cscript %SYSTEMDRIVE%inetpubadminscriptsadsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
目的让iis6支持32位运行。

如果需要支持mcrypt, mbstring组件,需要把类似libmcrypt.dll, php_mcrypt.dll的文件复制到SysWOW64文件夹下。

搞笑的是复制后,重启iis6,居然还是找不到php_mcrypt.dll。重启系统后,问题解决。

关于合租Linode VPS空间

很快我的Linode博客空间就快使用一年,这一年基本没重启过服务器,速度也还满意。VPS环境使用nginx、PHP5.2.4和Mysql5.5.3搭建博客。由于VPS快到期,而且目前空间闲置资源较多,所以可能会放弃这个VPS。但是如果有人愿意和我一起租用这个linode VPS,我可以考虑继续支持和维护。你只需要一年200元钱,就可以得到1G的PHP+mysql空间,目前设定需要五个用户。你不需要懂得服务器维护,如果你需要安装nignix版的wordpress,我也可以为你提供帮助。

如果有谁有兴趣,可以直接与我联系。合租的最后期限为2013年三月24日,只有用户名额达到五人,本VPS才会继续维持。

24日更新:很抱歉,各位:VPS合租取消了。@庆阳莫墨小强 @能兴在上海 @阿爽 @daijia

关于UnicodeDecodeError: 'ascii' codec can't decode的错误

由于GAE博客使用的是Master/Slave datastore,被要求更换为High Replication Datastore Migration,考虑到暂时不想重写程序,所以试着把GAE博客迁移到Openshift。可是没想到在迁移的过程中被UnicodeDecodeError这个错误拖延了一个多月,看来Python 2.7的unicode encode/decode是挺折腾人的。

GAE datastore 的备份数据是sqlite3格式,转换到mongoDB都还顺利,可是在用jinjia2显示的时候总是出现UnicodeDecodeError或者UnicodeEncodeError。开始以为错误在于数据库存储过程中的转码错误,sqlite3出来的数据是latin_1,存入mongodb要encode成utf-8,提取出来用decode,然后encode latin_1就行。可是依然出现类似这样的错误:“UnicodeDecodeError: ‘ascii’ codec can’t decode”。

我尝试了is_ascii(blog), isinstance(blog, unicode), from django.utils.encoding import smart_str, unicode(blog_nr.strip(codecs.BOM_UTF8), ‘utf-8’)等等,最后repr测试发现mongodb数据的存储/获取是没有问题的,问题出在jinjia2的模板采用unicode编码,

Jinja2 is using Unicode internally which means that you have to pass Unicode objects to the render function or bytestrings that only consist of ASCII characters.
答案很简单,mongoDB出来的数据再加上unicode(blog, “utf8”)就完美了。

悲催的Web Coder转行开个小店都这么难

本人99年入行,没什么成就。如今回到老家,开个小小饮品店。想办个营业执照都这么悲催!

要办营业执照先要搞定卫生证,要办卫生证先要经过现场检查。这些我都可以理解。

可是,被要求必须提供给当地食品药品监督管理局详细的进货渠道记录,和要求三张诺大的食品卫生牌必须挂在小店墙壁上。让我很是纳闷。

进货渠道是商业密迷,能这么容易给吗?就算不是,我去批发市场买个糖都要给你记录?

卫生牌挂墙上实在是煞风景,难以接受。

万能的 @中国药监,你何苦要这样为难我们?在中国生存已经十分不易,还拖家带口。能否不要这么教条和严格?

悲催的小店,你还能继续下去?悲催的web coder,你还能跳槽么?你还能在这悲催的社会中做点别的,活下去么?

Mongodb 错误:Connection refused

今天调试webapp2,Mongodb出现如下错误:
AutoReconnect: could not connect to x.x.x.x:27017: [Errno 111] Connection refused

根据网上的解释:需要删除mongod.lock,通常在/var/lib/mongodb下。然后重启sudo service mongodb start。

我用的是openshift,所以可以通过puttygen生成一个新的key,保存好私匙,并在账户管理里面添加Public Keys。然后在putty输入host name: 231..93cde98d@zhaiduo.rhcloud.com,在putty connection->ssh->auth下指定刚才生成的ppk私匙。点击Open即可连接,别忘了输入自己指定的Passprhase哦~

最后在提示行输入:killall -9 mongod;ctl_all restart重启即可。

rhc命令行工具可以用这个命令 : rhc app cartridge restart -a {appName} -t mongo

VBox扩容出错

直接用VboxMange给vdi文件扩容会出现如下错误:

Resize hard disk operation for this format is not implemented yet!

解决办法是clonehd复制一个新的vdi文件,再扩容:modifyhd target.vdi –resize 10000 MB。

补充:固定大小的vdi无法扩容,clonehd始终生成8G左右大小。

 

职业迷失

最近很少更新博客,缘于自己涉足其它行业进行创业。经过几个月的调整和磨合,总算趋于稳定。可是回头看看自己,看看自己曾经最爱做的事情,似乎已经有所远离,有种前不着村、后不着店的感觉。可以说这是我的职业生涯中的第二次迷失,在迷茫中找不到目标,这种感觉有些让人窒息和痛苦。

虽然现在还不清楚前面的路该如何走,但是觉得自己应该:找回安宁、找回次序和淡定。只有这样静下来,让迷雾消散,才可以看清前方的道路。

网站视频在移动设备上的播放表现

由于苹果和安卓移动设备对flash视频播放的缺失,最近比较关注网站视频在这些移动设备上的嵌入网页的播放表现。

根据这个电影游戏视频网址的测试,可以做如下总结:

国内主流视频网站的视频在iPhone和ipod touch下使用safari基本上可以正常浏览。
国内主流视频网站的视频在iPad下使用safari部分无法观看,原因在于视频尺寸规格不符合iPad要求。
国内主流视频网站的视频在Android移动终端下使用firefox无法正常浏览,但是可以保存到本地浏览。原因因该和视频尺寸规格有关,因为同样的播放代码,chrome完全没问题。
国内主流视频网站的视频在Android移动终端下使用chrome可以正常浏览。

git gui初始化仓库的错误

git gui初始化本地仓库进行本地合并的时候出现这个错误: fatal: bad revision ‘^’。commit肯定也是不行的。
解决办法:新建一个branch比如:me,把remote/master本地合并到me,然后删除旧的本地master分支,将me分支改名为master,重新扫描、缓存、commit、上传即可。

Macbook Air的磁盘太脆弱

有天晚上用MBA看了视频就合上睡觉去了,一大早起床准备开机,按了电源键后,屏幕还是黑的,奇怪的是右上角有个鼠标,并不能移动。这才意识到似乎是死机了,于是我长按电源键关机,又开机一试还是这样。发现键盘F1-F5间的前面部分很烫。尝试重启两次后发现,系统可以进入到看见苹果的Logo,可是下面的等待图标不停的转啊转,没有终点。

于是用Option键开机进入修复盘模式,进入后检测磁盘发现有些.log文件出错和磁盘索引有问题,尝试修复但是失败,提示抹掉磁盘,重新安装系统。真是哭笑不得!

由于我没有做time machine,只是dropbox备份了一些常用文件。所以,重装是唯一一条路。只有忍痛可爱。练习了N久的object-c项目全部丢失,很是可惜。

重装系统,需要联网下载,花了大概14个小时。貌似还比较顺利,可是xcode一直慢的似蜗牛,修改DNS速度可以达到20-300K/s。如果不修改hosts,Google和Dropbox都无法访问。由于害怕系统再次死机,装了个系统监测APP,检测CPU温度(常温注意稳定在50-60摄氏度)、网络流量和磁盘空间。

这次系统死过翻身给我的最大感觉是苹果电脑还是比较脆弱的,最好备份,最好在云端!

 

关于租车中车胎的猫腻

总结一下最近一次租车时,发现的轮胎上的猫腻。我去拿车的时候,第一辆车发现后尾箱的备胎没气,于是换第二辆。拿到第二辆又发现右后胎是有些没气变形,想着可以充充气就好,可是恰巧看到轮胎面上紧钉着一枚钉子,连叹好险,赶紧要求再换一辆。第三辆,貌似轮胎气足,应该没有问题,急着上路。可是上路才发现车摇晃的厉害,所幸一路高速400公里没有太大问题,也就以为只是单纯的胎压问题。

由于有事耽误,胎压的问题也一直没处理,到了第三天,准备还车。还有时间,这就去验车。这才发现大祸,还好没出大事。左前胎发现一枚很小的钢针插入导致漏气,更想不到的是右前胎居然有三处包块,类似于被蚊子咬后的肿块,不仔细看和用手按还真不知道。换胎的工作人员解释这些包块是由于轮胎被撞导致的内伤,胎内钢线已经断裂,随时有爆胎的危险。真是惊出一身冷汗。最后,更换了轮胎,好在说明事情经过后,租车公司也愿意承担这笔费用(虽然一开始电话客服小姐拒不承认他们租的车有任何问题,但是我把换下的旧胎拿给他们看,也就自知理亏。不过那个小妮子的口气让我好生难忘:“先生,我们既然把车租给您了,是不可能有任何问题的。”她的这种自信来源于何处?况且这种狡辩和态度也不是愿意去解决问题所应该有的。)。

租车的时候,轮胎一定要仔细看看,随时注意胎压的变化。不过犯愁的是如何能够每次都那么好运可以发现隐藏在轮胎沟壑中的钉子杀手。

 

网站打不开:谷歌提示检测到网络异常流量

今天发现两个用Google云空间的的网站突然打不开,显示的是谷歌的安全提示:

Our systems have detected unusual traffic from your computer network. Please try your request again later. Why did this happen?

突然想到,自己有用一个工具每20分钟会自动通过浏览器访问其中一个Google云空间网站。赶紧把工具停掉,然后清除网站缓存,重新拨号ADSL一看,貌似恢复正常。

Google的服务虽然贴心、安全,不过回头一想,觉得似乎有些过了。它对我们的照顾似乎已经超越了我们自身的自由,这种照顾让我觉得很不舒服和自在。这种照顾的无处不在,这种照顾的想躲也躲不掉,让我的一种厌恶感油然而生。

虽然它给的理由很充分,也没有什么不对:

当 Google 检测到您网络上的计算机可能正在自动向 Google 发送流量,我们可能会显示以下消息:“我们的系统从您的计算机网络检测到异常流量”。自动发送查询请求违反我们的服务条款。向 Google 自动发送任何类型的查询都会违反我们的服务条款。这包括但不限于以下活动:

使用能向 Google 发送查询请求的软件,以便针对各种查询弄清网站或网页在 Google 中的排名

对 Google 进行“元搜索”

对 Google 进行“离线”搜索

但是,我只想说:“我的电脑发送数据到我自己的网站,关你谷歌什么事?” 我一不为网站排名,二不为搜索,只为自己消息更加灵通。20分钟一次的自动流量,怎么就让你不爽,要用条条款款来关闭我的网站?我想象不出谷歌背后的意图是什么,我非滥用,而你谷歌的确很霸道。