问题由来: 我买了美国的虚拟主机,机器性能很好,空间巨大(150G) ,唯一的也是最大的问题,就是访问速度慢。 其实服务器本身至少能保证3M的带宽,我用其他服务器,单线程wget美国主机的文件,都可以稳定地保持在300K/s以上。 但用浏览器访问,由于需要发起多次tcp连接,而每次连接只传很小的几k文件就立即断掉,所以很慢。 最让我抓狂的就是,我上传一个软件包,总大小也就4、5M,但文件数量特别多,至少有几百甚至上千,传这么一个文件夹,没有2小时根本完不了。 我就想,如果虚拟主机有命令行,可以执行压缩或解压命令就好了。 传单个文件,再慢,也能保证每秒50K,像这样几M的文件,几分钟就可以搞定。 但如何解压呢? 答案就是:web版的命令行工具。 最简单的,就是system或exec函数,可以像SSH客户端一样,执行我们想要的命令。 注意,有些虚拟主机限制执行system和exec这两个函数,但我做了测试,证明是有其他方法的,一会儿再说这个方法是什么。 请您看到这个方法后,不要大肆宣传,或利用这个方法做一些危害主机安全的操作。如果这个方法也被禁用了,那以后就再也没有类似的方法了。 有了web的ssh,我们该怎么用呢? 1、首先要有清晰的unix文件的路径知识,知道什么是绝对路径,什么是相对路径,如何引用一个路径,等等。因为web版ssh只能方便地在当前一个目录下操作,稍有不慎,就可能造成无法挽回的后果。 […]
PHP
PHP 函数调用的开销
处理大量数据,每个关键词有5000条数据,一共有50万个关键词。 要对每个关键词的每条数据进行加权处理。 写了一个加权函数,作为一个类的静态方法。 遍历这50万个关键词的数据,结果非常慢。 考虑问题原因,尝试把加权函数的逻辑拆出来,放到大循环中。 写了测试代码,结果性能提升非常明显。 调用类的静态方法,程序性能是 156 次/秒,而拆出逻辑,直接运行,性能是 625 次/秒! 速度是原来的 4 倍多!
addslashes() Versus mysql_real_escape_string()
关于 addslashes() 和 mysql_real_escape_string() 两个函数,已经有过很多争论了。 在 PHP 过滤 SQL 注入时,通常都会使用 addslashes() 函数,但这并不保险,尤其是数据库编码是 GBK 时,类似于 %5c(\) […]
PHP 性能优化 二进制转换 pack()
今天搞一个数据存储程序,需要把数据转换成二进制存储。 在转换过程中,发现效率很低,不能满足需要。 经过反复测试和修改,总结了一些经验。 写在我的 Wiki 里了,Wiki 里贴代码比较方便,也顺便在这里推广一下我的Wiki。 <<Leakon’s Wiki>> 性能优化的Wiki地址:http://wiki.leakon.com/PerformancePack
编码检查 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 […]
PHP require 绝对路径 autoload
在写PHP程序时,如果文件比较多,目录也比较多,有很多require_once的情况。 如果程序的入口不唯一,并且分布在不同的目录,必须require绝对路径,如果是相对路径,PHP会把入口文件的路径作为基本路径,require里的相对路径都是相对于入口文件的。 这样带来最大的问题就是自己部署的程序,给别人提供接口时,别人根本无法使用! 所以要用绝对路径。 做法就是选一个require的入口文件,大家都要包含这个文件,这个文件的开头加上这么一句:
PHP 性能 安全 缺点
推荐资源一:a howto on optimizing php http://phplens.com/lens/php-book/optimizing-debugging-php.php 总揽全局方能运筹帷幄决胜千里之外。这是一篇非常全面的php性能优化指南,高屋建瓴,教你全面均衡的优化你的应用。系统的介绍了LAMP架构下系统优化的各个层次。虽然两年半没有更新了,仍不失为经典的php优化扛鼎之作。 推荐资源二:php benckmark tests http://www.php.lt/benchmark/phpbench.php 细节决定成败。这个简洁却不失细致的基准测试结果在“代码行”级别上教你如何编写高性能的php程序。尤其值得注意的是,和“同样的任务,面向过程的实现方式比面向对象快数倍”这个论调一样,php社区长期流传单引号速度远远快于双引号的言论,如今,时过境迁,这些经验是否还有效呢?我的建议是,相信你自己的判断,而不是道听途说。作决定之前,对你不了解的技术和架构做个垂直切片,而不是等到业务逻辑全部实现了才发现严重的性能问题。avoid surprises. 推荐资源三:PHP有什么缺点 http://www.nirvanastudio.org/php/php-in-contrast-to-perl.html […]
PHP Perl 关联数组 哈希表 Hash Table
关联数组,又称为哈希表(hash table),是一种非常好用的数据结构。 在程序中,我们可能会遇到需要消重的问题,举一个最简单的模型: 有一份用户名列表,存储了 10000 个用户名,没有重复项; 还有一份黑名单列表,存储了 2000 个用户名,格式与用户名列表相同; 现在需要从用户名列表中删除处在黑名单里的用户名,要求用尽量快的时间处理。 这个问题是一个小规模的处理量,如果实际一点,2 个表都可能很大,比如有 2 亿条记录。 我最开始想到的方法,就是做一个嵌套的循环,设用户名表有 […]