PHP性能优化
1.使用静态方法
2避免函数调用
3.使用include代替include_once,include_once内部会做一次hash查找
4.避免使用@屏蔽错误
@func()等效于:
$old = ini_set(“error_reporting”, 0);
func();
ini_set(“error_reporting”, $old);
5.避免使用临时变量
6.避免是哟PCRE系列函数,用strpos, str_replace, strstr, strrchr等函数代替
Oracle建表最好带的默认字段
字段名 |
注释 |
默认值 |
怎样获取 |
ADD_DATE |
创建时间 |
SYSDATE |
新增的时候系统自动获取不用写可以精确到2012-08-03 16:28:12 |
ADD_USER_ID |
创建人ID |
|
|
LAST_DATE |
最后修改时间 |
SYSDATE |
Sql语句中直接写LAST_DATE = SYSDATE只会精确到2012-08-03 16:28:12 |
LAST_USER_ID |
修改人 |
|
|
LATEST_TIME |
|
Systimestamp (分数秒精度6) |
新增的时候系统自动获取不用写,编辑的时候sql语句直接写LATEST_TIME = systimestamp可以精确到2012-08-16 11:27:49:550780
|
=======
PHP替换字符串指定位数为特定字符*
$a=123456789012;
$a=substr_replace($a,"******",2).substr($a,8);
echo $a;
===========
empty 认为0为空
判断含0的值不为空要用
if($a!="") {
保留2位小数
number_format($goods_price, 2, '.', '')
==================
smarty foreach 技巧
=================
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。echo uniqid();
本例产生 32 个字符的独一无二字符串。
<?php
$token = md5(uniqid(rand()));
echo $token;
?>
自动加载
dc.php
=================================
dc.php
<?php
class dc
{
public static function delivery_status($key=NULL)
{
$arr = array(0=>'待发货',1=>'已发货');
if($key!=NULL)
{
return $arr[$key];
}
return $arr;
}
}
?>
=============require_once====================
test.php
<?php
//require 'dc.php';
require_once 'dc.php';
$obj = new dc();
print_r($obj::delivery_status());
?>
=============autoload====================
<?php
function __autoload($classname) {
require_once ("class/$classname.php");
}
$obj = new dc();
print_r($obj::delivery_status());
?>
=============spl_autoload_register====================
<?php
function loader($class)
{
$file = 'class/'.$class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$obj = new dc();
print_r($obj::delivery_status());
?>
=================================
PHP版本
echo phpversion();
$_REQUEST
HTTP请求有POST和GET。在写表单form时可以指定action为post或get。数组$_POST中保存POST方法传递的变量, $_GET保存GET方法传递的变量。$_REQUEST中包含二者。例如 <form action="t.php" action="get"><input type="text" name="aaa"></form>在t.php中,可以使用$_GET['aaa']获得网页表单中填写的数据.当form中的action为get时使用$_GET;action为post时用$_POST。二者都可用 $_REQUEST
array_push()
<?php$a=array("a"=>"Dog","b"=>"Cat");array_push($a,"Horse","Bird");print_r($a);?>
Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird )
注释:即使数组中有字符串键名,您添加的元素也始终是数字键
保留小数
$a=112222123;
echo number_format($a,2);
echo ("</br>");
echo(round($a, 2));
echo ("</br>");
echo sprintf("%.2f", $a);
$a=112222123;
echo number_format($a,2);
echo ("</br>");
echo(round($a, 2));
echo ("</br>");
echo sprintf("%.2f", $a);$a=112222123;
echo number_format($a,2);
echo ("</br>");
echo(round($a, 2));
echo ("</br>");
echo sprintf("%.2f", $a);
empty 如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,”"、0、”0″、NULL、FALSE、array()、var $var、未定义;以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。 isset 如果 变量 存在(非NULL)则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。 is_null 检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】
“<td>”.$a."</td>" = “<td>{$a}</td>"
配置
display_errors
//ini_set("display_errors","On"); //显示所有错误信息*/
ini_set("display_errors","Off"); //屏蔽所有错误信息
通常服务器配置文件中,是屏蔽notice错误,只显示error错误,如果是这样的话,你打开错误显示,也不会显示notice错误
利用ini_set可以快速的修改php.ini配置设置哦,无需打开php.ini就可以了,特别是虚拟主机时你没有修改php.ini的权限时就会发现这个函数的作用了,下面看几个实例吧。
*/
//ini_set具有更改php.ini设置的功能。此函数接收两个参数:需要调整的配置变量名,以及变量的新值。
error_reporting()
设置 PHP 的报错级别并返回当前级别。
//禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL);
output_buffering
默认是4096
;output_buffering = 4096
output_buffering = Off
这样出现echo在header之前就会报错“Warning: Cannot modify header information - headers already sent by (output started at xxx.php”
所以php开启缓冲2种方法:
1.页面ob_start()
2.或者php.ini修改配置
--------------------------------------
output缓存--->程序缓存(不能控制)->输出->IE缓存(256字节)
http://www.laruence.com/2010/04/15/1414.html
-----------------------------------
文件操作
file_exists() 函数检查文件或目录是否存在
file_get_contents()得到文件
file_put_contents()生成文件
----------------------------------
正则表达式
preg_match
preg_match 匹配到一次就会停止,设置匹配到的一个匹配
preg_match_all
preg_match_all() 返回的是所有匹配的数组
------------------------------------------------
防盗链
if(isset($_SERVER['HTTP_REFERER']){-----------------------------------
ping的通却不能远程解析URL试试wget
HTTP request sent, awaiting response... 403 Forbidden
10:58:22 ERROR 403: Forbidden.
break和continue
break 结束当前 for,foreach,while,do..while 或者 switch 结构的执行。
break 可以接受一个可选的数字参数来决定跳出几重循环。
continue 在循环结构用用来跳过本次循环中剩余的代码并开始执行本循环结构的下一次循环。
注意在 PHP 中 switch 语句被认为是作为 continue 目的的循环结构。
continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。
输出1像素细的表格
if(!empty($datas)){
echo "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\" bgcolor=\"#58CB64\"><tr><td width=\"100\" bgcolor=\"#FFFFFF\">id</td><td width=\"200\" bgcolor=\"#FFFFFF\">时间</td></tr>";
foreach($events as $event){
echo "<tr><td bgcolor=\"#FFFFFF\">".$datas['Id']."</td><td bgcolor=\"#FFFFFF\">".$datas['inTime']."</td></tr>";
}
echo "</table>";
}
----------------------------------
调试
通过set_error_handler来捕获线上运行错误,统一收集日志、报警
通过register_shutdown_function来捕获fatal errors、记录运行时间
Xdebug、xhprof
$start=microtime(true);
///
$cost=microtime(true)-$start
----------------------------------
1.PHP和JS交互
拼凑HTML
<? if(1==1):?>
<div id='search'></div>
<?endif?>
2.PHP字符串技巧
输出:Hello world. Day number 123
单引号和双引号
单引号: ’a string’
不能内嵌变量, \’是唯一的转义码
双引号: ”a $better string\n”
可内嵌变量, 标准的转义码能正常使用
“Here-doc” 语法:
$foo = <<<END
…
END;
对于多行的大文本或html非常有用
支持内嵌变量
注意: 以<<<END开头,后面另起新行
END; 占用一行,不能有空格
重复输出
str_repeat("A",5);
字符串连接小技巧
逗号,也可以和点号.一样连接字符串,同时性能上逗号还好一些,但是非常有限。
字符串保护变量的时候使用双引号。
substr() 函数返回字符串的一部分
substr(string,start,length)
输出:world!
strpos() 和strrpos()
strpos() 返回字符串在另一字符串中首次出现的位置【对大小写敏感】
stripos() 返回字符串在另一字符串中首次出现的位置【对大小写不敏感】
strrpos() 返回字符串在另一字符串中最后出现的位置【对大小写敏感】
strripos() 返回字符串在另一字符串中最后出现的位置【对大小写不敏感】
如果成功,则返回位置,否则返回 false。
输出:6
PHP界定符
<<<eot 和eot是界定符,他们之间的内容php将会识别为一段大的字符串,相当于""。
addslashes() 函数
在指定的预定义字符前添加反斜杠。防sql注入
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
$str = "Is \your name O'reilly?";
// 输出:Is \\your name O\'reilly?
echo addslashes($str);
使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。
strcmp() 函数比较两个字符串。
0 - 如果两个字符串相等;<0 - 如果 string1 小于 string2;>0 - 如果 string1 大于 string2
htmlspecialchars() 把一些预定义的字符转换为 HTML 实体
intval
本函数可将变量转成整数类型。可省略的参数 base 是转换的基底,默认值为 10。转换的变量 var 可以为数组或类之外的任何类型变量。
3.PHP数组技巧
http://www.cnblogs.com/kym/archive/2010/03/04/1678726.html
PHP默认就是不定长数组,php中的数组,是数组(array),是队列(queue),是堆栈(stack),也是哈希(hash table),还是向量(vector)。
$arr[1]=123;
$arr['b']=124;
print_r($arr);
$a="abc";
echo $a[1];
输出:
aa
bb
cc
dd
0
a-0
b-1
c-2
0-aa-
1-bb-
2-cc-
3-dd-
说明:对于foreach其实 用$key=>$value和$i => $g 是效果一样的,并不仅限于key value
reset() 函数把数组的内部指针指向第一个元素,并返回这个元素的值。
输出:
Peter
Joe
Peter
array_fill ()函数
用给定的值填充数组
输出:
Array ( [5] => banana [6] => banana [7] => banana [8] => banana [9] => banana [10] => banana )
4.打印数组(PHP模式和JSON模式)
输出:
Array ( [firstname] => Tom [lastname] => Smith [age] => 40 )
{"firstname":"Tom","lastname":"Smith","age":40}
说明:print_r($data,true);这样才可以把数组写到日志里
$a = array ("a", "b", "c");
$c= print_r($a,true);
$logfile = "t.txt";
error_log("{$c}\r\n\r\n",3,$logfile);
输出:["1","2","3"]
说明:如果是一维数组json后是[],二维是{}
implode() 函数
implode() 函数把数组元素组合为一个字符串。
输出:
Hello World! Beautiful Day!
join() 函数是 implode() 函数的别名。
var_dump()
$a = array ("a", "b", "c");
var_dump ($a);
echo "<br>";
print_r($a);
echo "<br>";
输出:
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
Array ( [0] => a [1] => b [2] => c )
5.判断是否数组
if(is_array($ac))
6.类与引用
注意是$this->Name 不是$this->$Name
7.静态变量(不同于C#,java等的全局变量)
输出:2 4
8.函数中的静态成员
和$this不同,静态变量引用必须加$
9.常量
http://www.php.net/manual/zh/language.constants.php
// 合法的常量名
define("FOO", "something");
//使用
echo FOO
10.文件路径
dirname(__FILE__);//当前文件所在文件夹
dirname(dirname(__FILE__));//当前文件所在文件夹的上一层文件夹,这样如果是和当前路径平行的目录可以直接后面加上即可,如果是更上面的需要再网上回溯。
11.引入文件
require_once(dirname(__FILE__).文件名);//引入当前目录的某文件
12.执行远程文件
echo file_get_contents("http://www.baidu.com");
13.error_log记日志
$logfile = "/www/ws.txt";
$dd = '时间'.date("Y-m-d H:i:s").'| 来源:'.$_SERVER['HTTP_REFERER'].'| IP:'.$_SERVER['REMOTE_ADDR'].'|主机名:'.$_SERVER['REMOTE_HOST'] ;
error_log("{$dd}\r\n\r\n",3,$logfile);
14.常用时间
echo date('Ymd');
echo date("[Y-m-d H:i:s]");
php拆分日期时间,因为日期的长度是固定的,所以可直接用substr来做
echo substr(date("Y-m-d H:i:s"),0,10);//日期
echo substr(date("Y-m-d H:i:s"),10);//时间
unix时间戳和当前时差几天
select datediff(now(),FROM_UNIXTIME(1328803108))
15.sprintf() 函数
把格式化的字符串写写入一个变量中。
$str = "Hello";$number = 123;$txt = sprintf("%s world. Day number %u",$str,$number)
;
16.isset()函数
isset()函数一般用来检测变量是否设置,使用 unset() 释放变量之后,它将不再是 isset()。
empty()函数 判断值为否为空
17.class_exists陷阱
if(class_exists("类名"));
如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE。
只要代码中有就是True,而不是new一个
18.implementsInterface
//如果该类实现 了IController接口
if($rc->implementsInterface('接口名'))
19.ReflectionClass
//利用反射api构造一个控制器类对应的反射类
$rc = new ReflectionClass(‘类名’);
20.hasMethod
//该类拥有解析后的action字符串所指向的方法名
if($rc->hasMethod('方法名'))
21.newInstance
//构造一个控制器类的实例
$controller = $rc->newInstance();
22.getMethod
获取该类$action参数所指向的方法对象
$method = $rc->getMethod('方法');
23.isStatic
//如果方法是静态的
if($rc->isStatic())
24.invoke
PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象.使用反射api 来调用一个方法.
注意静态和非静态不同
if($plugin->hasMethod('getMenuItems')) {
/*实例化一个方法实例(注意当你将类和方法看成概念时,它们就可以有实例,
就像“人”这个概念一样),该方法返回的是ReflectionMethod 的实例*/
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果方法是静态的
if($reflectionMethod->isStatic()) {
//调用静态方法,注意参数是null 而不是一个反射类实例
$items = $reflectionMethod->invoke(null);
} else {
//如果方法不是静态的,则先实例化一个反射类实例所代表的类的实例。
$pluginInstance = $plugin->newInstance();
//使用反射api 来调用一个方法,参数是通过反射实例化的对象引用
$items = $reflectionMethod->invoke($pluginInstance);
}
25.explode()
可以讲字符串打散为数组的格式
explode(separator,string,limit)
参数分析:
separator:指定以什么字符来打散
string: 需要被打散的字符串
limit: 限制被打散的数组元素最多为多少个
26.chunk_split()
chunk_split() 函数能够把字符串分割为一块一块的更小的字符串块。
下面写了一个可以分割中文字符串的函数。
/**
* 分割字符串
* @param String $str 要分割的字符串
* @param int $length 指定的长度
* @param String $end 在分割后的字符串块追加的内容
* @param String $charset 字符编码,默认为utf-8
*/
function mb_chunk_split($str,$length, $end, $charset='utf-8')
{
if (empty($str)) return false;
if ( $charset != 'utf-8' ) $length = $length*2;
return chunk_split($str, $length, $end);
}
$str = '六一马上就要到了';
$str1 = 'aabbccddeefff';
echo mb_chunk_split($str, 2, '...', 'gb2312'); // 六一...马上...就要...到了...
echo mb_chunk_split($str1, 2, '...'); // aa...bb...cc...dd...ee...ff...f...
$str = 'one|two|three|four';
print_r(explode('|', $str, 2)); // Array( [0] => one [1] => two|three|four)
print_r(explode('|', $str, -1)); // Array( [0] => one [1] => two [2] => three)
时间
27.microtime() 函数
microtime() 函数返回当前 Unix 时间戳和微秒数。
如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
echo(microtime());
0.32491200 1321251369
PHP中date()函数与Oracle的to_date()和to_char()的使用
在Oracle中的日期类型为DATE,无法和字符串直接进行匹配,需要转化,或者把字符串通过to_date()转化为日期格式进行比较,或者使 用to_char
('column_name','yyyy-mm-dd')等方法转化为字符串后进行比较。就获得正确的记录了。
to_date( '".$params['ORDER_TIME']."','YYYY-MM-DD')
TO_DATE(:BEGIN_DATE,'yyyy-mm-dd hh24:mi:ss')
当前时间
to_date('".date('Y-m-d H:i:s')."','yyyy-mm-dd hh24:mi:ss')
28.die()函数
die() 函数输出一条消息,并退出当前脚本。
将类传给函数是引用
<?php
class per{
public $name;
}
$a=new per();
$a->name="AAA";
function t($a)
{
$a->name="CCC";
}
t($a);
echo $a->name;
?>
输出:CCC
析构函数
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
析构函数允许你在使用一个对象之后执行任意代码来清除内存.
当PHP决定你的脚本不再与对象相关时,析构函数将被调用.
<?php
class per{
public $name;
function __destruct(){
echo $this->name."销毁资源<br/>";
}
}
$a=new per();
$a->name="AAA";
$b=new per();
$b->name="CCC";
?>
输出:
CCC销毁资源
AAA销毁资源
因为栈是先入后出$a先入,$b后入
析构方法小结:
php5加入析构方法function __destruct()
析构方法没有返回值
一个类最多一个析构方法
析构方法会自动调用
析构方法自身主要用于销毁资源,而并不消耗对象,在销毁对象前,系统自动的调用该类的析构方法
析构方法调用顺序是先创建的对象后被销毁!
析构方法什么时候被调用?
当程序进程结束退出时;
当一个对象成为垃圾对象的时候,该对象的析构方法也会被调用;
所谓垃圾对象,就是指没有任何变量再引用它
一旦一个对象成为垃圾对象,析构方法就会立即调用!(C#和java不会立即)
php垃圾回收器
在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁,从而回收该对象占用的内存
当程序退出前,php也将启用垃圾回收器,销毁对象
<?php
class per{
public $name;
function __destruct(){
echo $this->name."销毁资源<br/>";
}
}
$a=new per();
$a->name="AAA";
//$d=$a;
$a=null;
$b=new per();
$b->name="BBB";
$c=new per();
$c->name="CCC";
?>
输出:
AAA销毁资源
CCC销毁资源
BBB销毁资源
看出差异
<?php
class per{
public $name;
function __destruct(){
echo $this->name."销毁资源<br/>";
}
}
$a=new per();
$a->name="AAA";
$d=$a;
$a=null;
$b=new per();
$b->name="BBB";
$c=new per();
$c->name="CCC";
?>
输出:
CCC销毁资源
BBB销毁资源
AAA销毁资源
构造函数
构造函数对对象的引用是$this-> 而不可直接赋值!
class per{
public $name;
public function __construct($iname)
{
$this->name=$iname;
//$name=$iname;//这样会认为是一个新的对象!
}
系统会给每个对象分配this,this代表当前对象的地址,谁调用代表谁,那个对象使用到$this就是那个对象地址,this在代码区
this不能在类定义的外部使用,只能在类定义的方法中使用
php4构造方法和类同名,php5也可以__construct
构造方法没有返回值,主要作用是完成对象初始化,并不创建对象本身
在创建新对象以后,系统自动调用该类的构造方法
一个类只能有一个构造方法,自定义构造方法会覆盖默认的构造方法
构造函数默认修饰符是public