Symfony 限制

发现Symfony的2个限制,其实这个是Propel的限制,Propel是PHP的一个ORM的数据库代码生成器,通过XML或YML文件配置,自动创建针对每个数据库和表的CRUD模型,并有良好的继承关系,真正地以面向对象的方式操纵数据库的每一行每一列。 目前发现2点限制: 不能适应分表(动态选择表名) 整型字段不能设置unsigned类型 在设计数据库的时候,采用分表存储,是一个优化性能的好方法, 比如,保存用户的文章,按用户ID,散列到8个表上。这8个表的结构都完全一样,只是表名不一样:tbl_post_0, tbl_post_1, …, tbl_post7。 当前版本的Propel,生成的代码,是和表名紧紧耦合在一起的,也就是说这8个表,会生成8套几乎一摸一样的代码,同样需要写8份schema.xml。 这样很不合理。 应该再抽象出一个机制,考虑结构相同表的统一处理。 Propel的另一个问题就是整数字段不能设置unsigned类型,查了官方的说明,说是PHP的整数类型就是-2的31次方到2的31次方减一。我还没来得及证实,不过这也不是很大的问题。因为,Symfony就是为了从零开始快速开发。一个新项目,数据量从零增加到20多亿条记录,还是需要一些时间的,应该避免项目初期的过度设计。 等你的数据规模达到10亿的时候,考虑找风投给你1000万美元,招人帮你重构吧。

新书上架 2007年出版

今天下了几本电子书,主要是网站开发方面的,看书名就知道是好书了。 给大家分享一下,都是英文版的,既能学知识,又能练英语阅读! 只要抽出时间认真看看,一定会有很多收获。 其实很多牛人,并没有多聪明,只是多看了几本书而已…… OReilly High Performance Web Sites Sep 2007 Pragmatic Design Accessible Web […]

卡巴斯基6 授权文件 激活 证书

前一阵我的卡巴6过期了,到网上到处寻找可用的激活码,后来找到几个授权文件,导入到卡巴就可以了,现在我的卡巴到期时间是2010年3月。 我把收集到的几个文件一起打包了,大家不用再到处寻找了,记住这个地址就可以啦。 http://down.leakon.com/software/2007/12/Kaba_Key.zip

编码检查 UTF-8 浏览器编码

编码问题一直是做网站开发的工程师们很头疼的事,如果你希望自己的网站能够被更多不同语言环境的人浏览和使用,那就一定要解决好编码的问题。 我的经验是,从HTML页面的编码,到PHP程序文件的编码,到数据库的设计以及与PHP之间连接的编码,全部使用UTF-8,这样就能保证你的页面不会出现乱码。 不要总是觉得,你的网站是给中国人用的,不给其他国家的人使用。如果你的中国用户希望保存一些日文、韩文等亚洲文字, 你也没有理由拒绝吧? 还是在一开始就解决好编码的问题为好,做网站,免不了这一步,今天不做,以后迟早要还的。 如果你认为我说的毫无道理,那我给大家引用一篇W3C组织的官方说明吧: http://www.w3.org/International/questions/qa-forms-utf-8.en.php 注意回答部分的第一句:The best way to deal with encoding issues […]

PHP 文件锁 flock 负载均衡

最近有个项目,采用单台前端服务器提供Web服务,程序需要实时访问后端服务器。后端一共有几十台服务器,但有压力限制,单台负载不能过高,必须做负载均衡。 最简单的方式是用随机数,前端来请求的时候,随机挑选一台后端服务器,但这并不能保证压力平均分布,很有可能在某一段时间内请求都落到同一台服务器上,很容易导致这台服务器停止服务。 后来想到用文件锁的方式,来标记访问计数,顺序访问后端的每一台服务器,让每一台服务器一个周期只被访问一次。 在进行了多次功能测试和压力测试后,验证了这种想法的可行性,然后写了一个IDService类,封装了整个过程。 我在Google提供的SVN服务器上保存了源码,大家可以在 http://leakon.googlecode.com/svn/trunk/leakon/php/flock/flock.php 这个地址看到源码,或者用SVN工具CheckOut到本地。 核心过程,就是初始化的时候给一个ID范围,默认是从0开始,如果你的server_count是32,那么调用getId()方法的时候,我会顺序给你31至0这32个ID,采用文件锁就是考虑到并发请求之间彼此独立,一个进程读数据文件的时候要加独占锁,解锁前,其他进程无法读取数据文件。 ID分配给你了,每个ID对应哪个服务器,就是你自己做映射的事了,保证了这个模块的无关性和独立性,和其他所有模块保持无耦合。 这是在PHP5的环境下写的,const 定义了3个类常量: LINE_FEED 是换行符,Windows 下是 \r\n,Linux […]

终于解决favicon.ico无法显示的问题

很久以前就做好了favicon.ico,在浏览器的地址栏前面也显示正常.但是收藏在Firefox的书签工具栏里的时候,这个图标无法显示,所以显示的是空白页: . 我以为是Firefox2.0的问题,因为我用Firefox3.0beta的时候图标显示的非常好,只要在书签工具栏里收藏了这个网站,马上就会显示图标.所以我认为是Firefox2.0的bug. 今天sofish做了一个博客圈的RSS聚合.我再次发现favicon的问题,我的图标没有显示.我开始想,也许不是Firefox的问题.因为Firefox2.0显示别人网站的favicon都没问题,但是我的独独出错.可能是我的某些地方没有写标准. 我先把注意力放在了代码的书写上. <link rel=”Shortcut Icon” href=”地址” type=”image/x-icon” /> <link rel=”shortcut” href=”/favicon.ico” /> […]

Web在线任务管理

今天终于找到一个好用的在线任务管理网站: http://www.rememberthemilk.com/ 中文名怎么翻译呢?别忘了喝奶? 挺有意思的,小奶牛的图标很可爱,一下就吸引了我,让我决心好好研究一番。 是我自己要寻找这样的网站,最近好忙,每天都有好多工作要做,还有好多事想做。事情总是这样,有时候突然想做点什么,但工作很忙,没有时间;等周末休息的时候,有时间了,却突然不知道该做点什么。 工作的时候,会有很多很多任务,如何安排这些事,每件事应该在什么时候完成,都应该有预先的安排。新的工作环境,对我有很大影响。这里做事都必须有安排。 每周的开始,都要列出本周要完成的任务,以及每个任务的时间点。而且要明确任务结果,必须设置预期结果。 比如,今天是周一,制定本周计划: 某项目的升级详细设计,周三完成文档,周五完成评审; 某项目的升级模块,周二完成开发,周三完成测试,周四完成上线; 注意“完成”两个字,每件事,都要早明确的时间点,取得明确的结果。 这里不能使用应该、差不多、也许、大概和基本等等模糊的词汇。 现在我的工作状态越来越好,我觉得这背后的原因,就是做事有安排,合理分配,按时完成。 不过,我还缺少一个工具,来帮我规划个人任务。 以前我是写便签纸,就是黄色的小方块,上面有一条不干胶,记录我今天要做什么。 […]

澄清Java 接口与继承

计算机学院研二的兄弟与我讨论Java,一见面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该使用接口?很庆幸他们不是问我Java如何连接SQL Server,或者是如何开发J2EE应用,这类问题有杀伤力,避之则吉。今年计算机学院本科有个毕业设计课题是做J2ME,选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包,这个这个……唉。 大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c 那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c 、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。 设计模式中最基础的是工厂模式(Factory),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。 假设我有很多个类,分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分别连接不同的数据库,统一返回一个Connection对象,并且都有一个close方法,用于关闭连接。只需要针对你的DBMS,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口: package org.bromon.test; public interface DB { […]