PHP 的一些高效写法

  用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 $row[‘id’] 的速度是$row[id]的7倍。 echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。 注销那些不用的变量尤其是大数组,以便释放内存。 尽量避免使用__get,__set,__autoload。 require_once()代价昂贵。 include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。 函数代替正则表达式完成相同功能。 str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。 使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。 用@屏蔽错误消息的做法非常低效,极其低效。 打开apache的mod_deflate模块,可以提高网页的浏览速度。 数据库连接当使用完毕时应关掉,不要用长连接。 错误消息代价昂贵。 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。 递增一个全局变量要比递增一个局部变量慢2倍。 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

iPhone大小的盒子服务器Cubieboard

在淘宝上350多元,买了个基于ARM平台的超小电脑 cubieboard,配置如下: 1G ARM cortex-A8 processor, NEON, VFPv3, 256KB L2 cache Mali400, OpenGL ES GPU 512M/1GB DDR3 @480MHz HDMI 1080p Output 10/100M Ethernet 4GB Nand Flash 2 USB Host, 1 micro SD slot, 1 SATA, 1 ir 96 extend pin including I2C, SPI, RGB/LVDS, CSI/TS, FM-IN, ADC, CVBS, VGA, SPDIF-OUT, R-TP.. Running Android, Ubuntu and […]

linux下php实现C/C++扩展编程

某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是Fedora Core 6。 首先做一个简单的so文件: /** * hello.c * To compile, use following commands: *   gcc -O -c -fPIC -o hello.o hello.c *   gcc -shared -o libhello.so hello.o */ int hello_add(int a, int b) { return a + b; } 然后将它编译成.so文件并放到系统中: gcc -c test.c gcc -o test test.o

Linux网络编程入门 (转载)

(一)Linux网络编程–网络知识介绍 Linux网络编程–网络知识介绍 客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的–客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一 个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序。 服务端 和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。 比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。 互为客户和服务端 实际生活中有些程序是互为服务和客户端。在这种情况项目, 一个程序既为客户端也是服务端。 常用的命令 由于网络程序是有两个部分组成,所以在调试的时候比较麻烦,为此我们有必要知道一些常用的网络命令 netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项. 我们常用的选项是-na 用来显示详细的网络状态.至于其它的选项我们可以使用帮助手册获得详细的情况. telnet telnet是一个用来登录远程的程序,但是我们完全可以用这个程序来调试我们的服务端程序的. 比如我们的服务器程序在监听8888端口,我们可以用 telnet localhost 8888 来查看服务端的状况. pingping 程序用来判断网络的状态是否正常,最经常的一个用法是 ping 192.168.0.1 表示我们想查看到192.168.0.1的硬件连接是否正常 TCP/UDP介绍 TCP(Transfer Control Protocol)传输控制协议是一种面向连接的协议, 当我们的网络程序使用这个协议的时候, 网络可以保证我们的客户端和服务端的连接是可靠的,安全的. UDP(User Datagram Protocol)用户数据报协议是一种非面向连接的协议, 这种协议并不能保证我们的网络程序的连接是可靠的,所以我们现在编写的程序一般是采用TCP协议的.

HTTP性能测试,与Apache对比

话说nginx在大压力的环境中比apache的表现要好,于是下载了一个来折腾一下。 下载并编译安装,我的编译过程有点特别: 1。去除调试信息,修改$nginx_setup_path/auto/cc/gcc这个文件,将 CFLAGS=”$CFLAGS -g”  这一行注释掉。 2。由于仅测试WEB服务器的性能,所以不安装FastCGI。 ? 1 2 3 4 5 6 7 ./configure –prefix=/opt/nginx –user=www –group=www –with-http_stub_status_module –with-http_ssl_module –without-http_fastcgi_module 安装完成之后,将一堆生产环境中静态化了的HTML页面copy 到 nginx 的服务器上,我的 nginx.conf 的配置如下:

关于Apache与Nginx的优势比较

不断有人跟我说Nginx比Apache好、比Apache快之类。Nginx更主要是作为反向代理,而非Web服务器使用。我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对Nginx和Apache的工作原理都略有了解,粗谈一下看法。 不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内 核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切 换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO 操作,自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。 所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁 盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。我随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价 值。 再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图 形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想 想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。这个时候多进程或线程就体现出优势,每个进程各干各的事,互 不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与 事件机制相辅相成,长期存在。 总结之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。再盲目的言之Nginx可以取代Apache的,该好好反思了。

posix和perl标准的正则表达式区别

POSIX 是 UNIX 遵循的标准, UNIX 的命令如 grep、sed 能用的正则是 POSIX。 PERL 正则在 POSIX 上做了扩展,实现了很多方便的功能。 举个匹配数字的例子,Perl 用 d,POSIX 用 [0-9](POSIX 老版本,现在也有 d 了)。 POSIX 里面还有“类”的概念,比如 [:digit:] 用来匹配数字, Perl 原先没有,后来支持 POSIX,也能用了。 再举个例子,Perl 里面的正则 a.*b 和 a.*?b,匹配的对象是不一样的。 a.*b 实现最长匹配,a.*?b 实现最短匹配,用这两个表达式匹配字符串”a 1b 2b”,第一个的匹配结果是 “a 1b 2b”,第二个的匹配结果是 “a 1b”。 具体的不同,应该还有很多,如果一一列举那就是长篇大论了,也没必要全都了解,用到的时候查查就知道了。 兼容 Perl 的正则,叫 PCRE,比较 POSIX 和 PCRE 可能更靠谱一些。

PHP正则表达式的快速学习方法

1、入门简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例 如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的 局限,成为人们广为接受的概念和功能。 正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。 举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所 填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则 表达式在WEB应用的逻辑判断中具有举足轻重的作用。

PHP魔术函数(收录)

魔术函数 1。__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。 2。__destruct() 当删除一个对象或对象操作终止时被调用。 3。__call() 对象调用某个方法, 若方法存在,则直接调用; 若不存在,则会去调用__call函数。 4。__get() 读取一个对象的属性时, 若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。

Linux Top 命令解析

TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定. top – 12:38:33 up 50 days, 23:15,  7 users,  load average: 60.58, 61.14, 61.22 Tasks: 203 total,  60 running, 139 sleeping,   4 stopped,   0 zombie Cpu(s)  : 27.0%us, 73.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   1939780k total,  1375280k used,   564500k free,   109680k buffers Swap:  4401800k total,   497456k used,  3904344k free,   848712k cached PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 4338 oracle    25   0  627m 209m 207m R    0 11.0 297:14.76 oracle 4267 oracle    25   0  626m 144m 143m R    6  7.6  89:16.62 oracle 3458 oracle    25   0  672m […]