最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很重要,这里就结合网上的一些资料,总结下php程序效率优化的一些策略:1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;(对这于这一点kimi不敢苟同,详细请查阅http://www.ccvita.com/index.php/163.html)2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);6.多维数组尽量不要循环嵌套赋值;7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;8.foreach效率更高,尽量用foreach代替while和for循环;9.用单引号替代双引号引用字符串;10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;11.对global变量,应该用完就unset()掉
class FtpGet { private $config; private $retry = 15; private $errors = array(); function __construct($config = array()) { if (empty ( $config )) { $this->config = array ( ‘path_local’ => ‘/local/path’, ‘path_remote’ => ‘/remote/path’, ’server’ => ‘ftp.server.com’, [...]
文件的大小函数为:filesize()
文件是否存在的函数为:file_exits();
但是这两个函数只针对本地
那么:远程文件是否存在,远程文件大小 如何得知呢?
搜索了一下,有人居然说,把远程文件下载过来再判断这个远程文件的大小,这是什么歪理。
庆幸大部分人还是清醒的,一般应该使用判断header反馈的信息进行判断。
php中如何获得header信息呢? php的函数真多,这个也不例外
1.最简单的获取远程文件大小办法
$a_array = get_headers(url,true);
url就是网址了,至于第二个参数
就可以得到类似下面的这个数组
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => “3f80f-1b6-3e1cb03b”
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html
)
所以,你可以很舒服的拿到远程文件的大小
$file_sizeofurl = a_array['Content-Length'];
2.用curl获取远程文件大小
如果服务器禁止get_headers 怎么办?
换一种办法,用curl
我总觉得curl就像一个虚拟的用户,什么都能模仿
下面直接给出一个老外的函数
请注意
echo ‘
head–>’.$head.’<—-end
‘;
这句是我加的,为了知道header里面到底包含了什么东西
function remote_filesize($uri,$user=”,$pw=”)
{
// start output buffering
ob_start();
// initialize curl with given uri
$ch = curl_init($uri);
// make sure [...]
网上找到的一篇文章讲的很清楚,就直接Copy过来了,在此感谢原作者。
xdebug是一个开源的php调试器,以php模块的形式加载并被使用。
windows 平台下:
一、安装xdebug模块
1、去www.xdebug.org下载相应版本php的模块文件,保存下载后的文件到php的ext目录,可以自己修改文件的名称,现在最新的版本是 2.0.1。
2、修改php.ini,增加如下信息
[Xdebug]
zend_extension_ts=”d:/php/ext/xdebug-xxx.dll”
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.trace_output_dir=”d:\Temp\xdebug”
xdebug.profiler_enable=on
xdebug.profiler_output_dir=”d:\Temp\xdebug”
参数解释:
zend_extension_ts=”d:/php/ext/xdebug-xxx.dll”
加载xdebug模块。这里不能用extension=xdebug-xxx.dll的方式加载,必须要以zend的方式加载,否则安装上后,
phpinfo打印出来的里的xdebug段的会有XDEBUG NOT LOADED AS ZEND EXTENSION的警告信息。
xdebug.auto_trace=on
自动打开“监测函数调用过程”的功模。该功能可以在你指定的目录中将函数调用的监测信息以文件的形式输出。此配置项的默认值为off。
xdebug.collect_params=on
打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。此配置项的默认值为off。
xdebug.collect_return=on
打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。此配置项的默认值为off。
xdebug.trace_output_dir=”d:\Temp\xdebug”
设定函数调用监测信息的输出文件的路径。
xdebug.profiler_enable=on
打开效能监测器。
xdebug.profiler_output_dir=”d:\Temp\xdebug”
设定效能监测信息输出文件的路径。
另外,xdebug 不能和 Zend Optimizer 以及其他 Zend 扩展 (DBG, APC, APD etc) 同时工作,目前这个问题正在修复中。
还有一些更为具体的参数设定,详见:http://www.xdebug.org/docs-settings.php
3、重启apache
这样,在本地运行php的时候,会在所设定的目录里产生一些调试信息的文件:
* 函数调用过程监测信息文件的文件名格式:trace.××××××.xt。这个文件可以直接查看,里面包含了函数运行的时间,函数调用的参数值,返回值,所在的文件和位置等信息。内容格式还是相对直观的。
* 效能监测文件的文件名格式:cachegrind.out.××××××××。
这个文件也可以直接查看,不过信息格式不易被人类所理解,
所以我们需要接下来的一个软件。
二、安装wincachegrind
由于效能监测文件:cachegrind.out.××××××××文件的内容不易被人类所理解,所以我们需要一个工具来读取它。windows下就有一款这样的软件:wincachegrind。
1、到http://sourceforge.net/projects/wincachegrind/下载安装wincachegrind
2、安装运行后,点击Tools->options,设定你的working folder(php.ini里xdebug.profiler_output_dir的值)
这样就可以比较直观的查看效能监测文件的信息了。
控制输出CacheGrind文件名的控制
http://xdebug.org/docs/all_settings#trace_output_name
ubuntu 下安装
一、安装xdebug
1. 先到xdebug.org下载最新的源码包。
2. 编译安装
tar -zxvf xdebug-xxx.tgz
cd xdebug-xxx
phpize
./configure –enable-xdebug
make
sudo make install
3. 修改配置文件php.ini,添加下面一行
zend_extension_ts=”/wherever/you/put/it/xdebug.so”
这里的/wherever/you/put/it/是 xdebug.so 所在的目录
第一行将装入 Xdebug 扩展;第二行将启用 Xdebug 的分析器功能,而第三行将启用扩展的调试功能。
一些推荐的配置
xdebug.default_enable = On
xdebug.profiler_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = [...]
在传统的OOP(面向对象编程:Object-Oriented Programming)思想里,一般把应用程序分解成若干个的对象,强调高内聚,弱耦合,从而提高应用程序的模块化程度,但是在处理某些问题的时 候,OOP会显得不够灵活,比如说,应用程序里很多业务逻辑都要在操作之初进行“权限检查”,在操作之后进行“日志记录”,如果直接把处理这些操作的代码 加入到每个模块中,那么无疑破坏了OOP的“单一职责”原则,模块的可重用性会大大降低,这时候传统的OOP设计往往采取的策略是加入相应的代理 (Proxy)层来完成系统的功能要求,但这样的处理明显使系统整体增加了一个层次的划分,复杂性也随之增加,从而给人过于厚重的感觉。正是为了处理这样 的问题,AOP(面向方面编程:Aspect-Oriented Programming)思想应运而生了,假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文 章模块等等),而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志记录等等)。由此可见,AOP是OOP的一个有效 补充。
就目前的PHP来说,还没有一个完整的AOP内置实现,虽然出现了RunKit, 但一直都以BETA的状态呆在PECL项目里,估计很长时间内不太可能成为PHP的缺省设置。那是不是AOP在PHP里就破灭了呢?当然不是,因为我们有 __get(),__set(),__call()等魔术方法,合理使用这些方法可以为我们实现某种程度的“准AOP”能力,之所以说是准AOP,是因为 单单从实现上来看,称其为AOP有些牵强,但是从效果上来看,又部分实现了AOP的作用,虽然其实现方式并不完美,但对于一般的使用已经足够了。特别是从 PHP4.3.0开始,这些魔术方法已经成为了PHP的缺省内置实现,扫除了PHP4/5兼容的顾虑,那么就更加没有理由不使用它们。这里要说明的是 PHP4/5对这些魔术方法的实现有些许的不同,下面将分别举例说明:
先来看看PHP4的相应代码(下面代码只能运行在PHP4环境下):
<?php
//应用程序中某个业务逻辑类
class BIZ
{
function foobar()
{
echo ‘业务逻辑<br />’;
}
}
//业务逻辑类的包装类
class AOP
{
var $instance;
function AOP($instance)
{
$this->instance = $instance;
}
function __call($method, $argument, $return)
{
if(! method_exists($this->instance, $method))
{
return false;
}
echo ‘权限检查<br />’;
$callBack = array($this->instance, $method);
$return = call_user_func_array($callBack, $argument);
echo ‘日志记录<br />’;
return true;
}
}
//工厂方法
class Factory
{
function getBizInstance()
{
//PHP4必须这样声明一下才可以使用overload相关方法
overload(‘AOP’);
return new AOP(new BIZ());
}
}
//客户端调用演示
header(“Content-Type: text/html; charset=gbk”);
$obj = Factory::getBizInstance();
$obj->foobar();
?>
屏幕显示:
权限检查
业务逻辑
日志记录
再来看看PHP5的相应代码(下面代码只能运行在PHP5的环境下):
<?php
//应用程序中某个业务逻辑类
class BIZ
{
public function foobar()
{
echo ‘业务逻辑<br />’;
}
}
//业务逻辑类的包装类
class AOP
{
private $instance;
public function __construct($instance)
{
$this->instance = $instance;
}
public function __call($method, [...]
(1)初识魔术方法
Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统。今天我们就来认识下php5.0给我们提供的魔术方法。
1,__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。
class Test
{
function __construct()
{
echo “before”;
}
}
$t = new Test();
输出是:
start
我们知道php5对象模型 和类名相同的函数是类的构造函数,那么如果我们同时定义构造函数和__construct()方法的话,php5会默认调用构造函数而不会调用__construct()函数,所以__construct()作为类的默认的构造函数
2,__destruct() 当删除一个对象或对象操作终止的时候,调用该方法。
class Test
{
function __destruct()
{
echo “end”;
}
}
$t = new Test();
将会输出
end
我们就可以在对象操作结束的时候进行释放资源之类的操作
3,__get() 当试图读取一个并不存在的属性的时候被调用。
如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作。
class Test
{
public function __get($key)
{
echo $key . ” 不存在”;
}
}
$t = new Test();
echo $t->name;
就会输出:
name 不存在
4,__set() 当试图向一个并不存在的属性写入值的时候被调用。
class Test
{
public function __set($key,$value)
{
echo ‘对’.$key . “附值”.$value;
}
}
$t = new Test();
$t->name = “aninggo”;
就会输出:
对 name 附值 aninggo
5,__call() 当试图调用一个对象并不存在的方法时,调用该方法。
class Test
{
public function __call($Key, $Args)
{
echo “您要调用的 {$Key} 方法不存在。你传入的参数是:” . print_r($Args, true);
}
}
$t [...]
相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实 现的功 能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己是做前端开发的,在性 能方面,根据yahoo的调查,后台只占5%,而前端高达95%之多,其中有88%的东西是可以优化的。
以上是一张web2.0页面的生命周期图。工程师很形象地讲它分成了“怀孕,出生,毕业,结婚”四个阶段。如果在我们点击网页链接的时候能够意识到 这个过程而不是简单的请求-响应的话,我们便可以挖掘出很多细节上可以提升性能的东西。今天听了淘宝小马哥的一个对yahoo开发团队对web性能研究的 一个讲座,感觉收获很大,想在blog上做个分享。
相信很多人都听过优化网站性能的14条规则。更多的信息可见developer.yahoo.com
1. 尽可能的减少 HTTP 的请求数
[content]
2. 使用 CDN(Content Delivery Network)
[server]
3. 添加 Expires 头(或者 Cache-control )
[server]
4. Gzip 组件
[server]
5. 将 CSS 样式放在页面的上方
[css]
6. 将脚本移动到底部(包括内联的)
[javascript]
7. 避免使用 CSS 中的 Expressions
[css]
8. 将 JavaScript 和 CSS 独立成外部文件
[javascript] [css]
9. 减少 DNS 查询
[content]
10. 压缩 JavaScript 和 CSS (包括内联的)
[javascript] [css]
11. 避免重定向
[server]
12. 移除重复的脚本
[javascript]
13. 配置实体标签(ETags)
[css]
14. 使 AJAX 缓存
在firefox下有一个插件yslow,集成在firebug中,你可以用它很方便地来看看自己的网站在这几个方面的表现。
这是对用yslow对我的网站西风坊测评的结果,很遗憾,只有51分。呵呵。中国各大网站的分值都不高,刚测了一下,新浪和网易都是31分。然后yahoo(美国)的分值确实97分!可见yahoo在这方面作出的努力。从他们总结的这14条规则,已经现在又新增加的20个点来看,有很多细节我们真得是怎么都不会去想,有些做法甚至是有些“变态”了。
第一条、尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests [...]
2008 年 5 月 26 日
流行的开源软件 Zend Framework 刚刚实现了一些出色的增强。本文介绍 V1.5 中的新特性以及如何升级对 GData Web 服务的增强支持,包括 Zend_Form、Zend_Layout 和 Zend_View,并且,改进的 Ajax 支持可以帮助 PHP 开发人员轻松地构建先进的 Web 应用程序。
软件框架指一组代码库集合,旨在以一种标准化方式处理应用程序中的所有基本需求,以便使开发人员集中精力进行开发,而不是进行重复劳动。目前有多个开源的 PHP 开发框架可供选择,在所有这些框架中,Zend Framework 也许是最受欢迎的。
Zend 收到欢迎的原因是它非常重视最佳实践,这一特性对于那些重视可持续性的开发人员来说十分有吸引力。Zend 以一种高度模块化的方式构造框架:大多数 Zend Framework 组件可以完全分离并单独使用,这一点非常吸引只需要用到可用库的其中一部分的开发人员。Zend 的灵活性以及重视最佳实践而产生的良好标准化,使它成为具有广泛用途的实用框架。
已经很强大的 Zend Framework 在 V1.5 中又增加了几个全新的组件和组件增强。这些升级使开发复杂的 PHP 应用程序更加简单、更加可维护,这是因为对诸如表单验证例程甚至是前端布局创建等内容实现了标准化。让我们首先看一下Zend_Form 组件以及它提供的全部功能。
Zend_Form
Zend Framework 的一个令人兴奋的新增特性就是 Zend_Form 组件。Web 应用程序如果不能接收输入数据并对其进行处理,那么就会变得毫无意义,获得用户数据的最简单方式就是使用表单。当然,在开发与维护一个 Web 应用程序时,表单是最单调乏味的工作:您必须验证收到的全部内容,确保它是您需要的内容,并需要对每个到来的数据片段进行单独处理。所有上述操作都假设您 [...]
什么是节点(Node):
节点是构建Drupal的一个核心模块,“节点(Node)”并不是告诉你它是某个网络的一部分,相反地,你应该将一个节点想成是你网站一个具有魔
力的一部分,它可以由你网站的用户创建,当然你自己也可以创建,它可以是一个博客或者一份手册,通过Drupal内容管理工具箱(Content
Construction
Kit),你甚至可以创建无限多种你可以想像的类型的节点。你要牢记的是,任何一个节点都有它的类型,这种类型指向节点的内容类型,每一个节点都有自己唯
一的节点ID号、一个标题、主内容区、创作的内容、一位作者以及一些其它的属性,一个节点与其它所有节点一起被存在在数据库中的一份数据表之中。
Drupal拥有很多数据表,核心数据表在50份左右,或许你q希望将它们中的某些数据显示在你的网站上来实现某种功能。
用户模块也拥有自己的数据表,用户之中有很多又是某节点的作者,在这两者之间就产生了一种联系,要找到与某位用户相关联的节点的唯一途径就是搜索整个数据表想发现相匹配的项目,这是一个很大的工程,当然,感谢数据库服务器是很快速的。
任何一个节点都可以拥有无限数量的评论,评论又被存放在另一份数据表中,要找到某个节点所拥有的所有评论,我们需要搜索评论数据表中的所有记录。
节点是怎样工作的:
看一下正在访问Drupal站点的浏览器的地址栏,你或许可以看到这样的一个地址:“http:
//yourdomain.com/node/1”,这正是浏览器使用Drupal方式来向Drupal站点请求一次数据库查询,其内容包括:“从数据库
中查询ID为1的节点的所有查询允许的信息(如作者、评论等)并展示在页面中”,这叫数据查询请求。
大多数查询都是由相关模块来完成的,/tracker 会搜索所有节点并且按时间将结果存在在一份数据表中,只要你开启了Tracker 模块,那么它将一直运行。
当你将鼠标移到一个链接上面之后,察看浏览器的状态栏,你或许就可以更深的了解这个链接的文字所表达的意思,因为Drupal可以模仿文件夹路径一样的链接来表示内容的类型。
Drupal的模块(Modules)可以对数据进行很多操作,打个比方,当你打开一个你自己创建的文章节点后,你会在页面的最底部看到一个标签
栏,里面有查看/编辑(View/Edit)两个链接,但是这两个链接在不是你自己创建的页面却看不到,这就是通过用户权限设置后所拥有的功能。
节点类型:
Drupal将所有内容存储为节点,系统默认的节点类型有以下几种:
博客文章:由网站用户发表在他开设于Drupal站点上的博客上的文章。
网站文章:与博客文章类似,只不过它不是发表在用户的个人博客上,而是有相关权限的用户直接发表于网站上。
手册页面:手册页面是为联合协作文档编辑而准备的,一份手册可以由很多人共同完成。
评论:评论是每一个节点都有的,它是有评论权限的用户对某一个节点内容的看法,由用户提交。
论坛:论坛是内建于Drupal系统之中的默认模块,通过它网站拥有者可以建立根据不同的话题建立不同的论坛,用户可以在不的同论坛中发起相关的讨论。
页面:页面是一种简单的节点,它只是一个静态的页面并且可以生成一个在主导航栏的链接
投票:一种特殊的 节点,可以发起对某个话题的投票与调查活动
其它类型节点:由不同的模块生成的相关的节点
这个系列是我的学习笔记。主要内容来自 Zend Framework 的[程序员参考手册],结合了自己的学习和开发过程。
1. 安装
从 Zend Framework 的网页上下载最新版本。解压后,把整个目录拷贝到一个理想的地方,比如:/php/library/Zend。
打开 php.ini 文件,确认包含 Zend 目录的路径在 include_path 里定义了。以上面的配置为例,php.ini 中应有类似下面的条目:
include_path = “.:/php/library”
注意:Windows 下的写法略有不同,应该类似于 include_path = “.;C:\php\library”
初始的安装就这么简单。Zend Framework 的一些组件会用到 php 的一些附加模块。具体的要求请参考这里。
2. 项目的目录结构
如果你的项目不包含多个模块,可以用下面的目录结构:
<span style=”color: rgb(0, 0, 0);”>application/<br /> controllers/<br /> IndexController.php<br /> models/<br /> views/<br /> [...]
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
|---|---|---|---|---|---|---|
| « 4 | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | |||