php unset php preg_replace
各位老铁们好,相信很多人对php unset都不是特别的了解,因此呢,今天就来为大家分享下关于php unset以及php preg_replace的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
php有哪些优化技巧
优化的点有很多,看具体使用环境:
1、用单引号代替双引号来包含字符串,这样做会更快一些。因为 PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有 echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 echo是语言结构,不是真正的函数,故把函数加上了双引号)。
2、如果能将类的方法定义成 static,就尽量定义成 static,它的速度会提升将近 4倍。
3、$row['id']的速度是$row[id]的 7倍。
4、echo比 print快,并且使用 echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如 echo$str1,$str2。
5、在执行 for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用 foreach代替。
6、注销那些不用的变量尤其是大数组,以便释放内存。
7、尽量避免使用__get,__set,__autoload。
8、require_once()代价昂贵。
9、include文件时尽量使用绝对路径,因为它避免了 PHP去 include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
10、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER['REQUEST_TIME']要好于 time()
11、函数代替正则表达式完成相同功能。
12、str_replace函数比 preg_replace函数快,但 strtr函数的效率是 str_replace函数的四倍。
13、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
14、使用选择分支语句(译注:即 switch case)好于使用多个 if,else if语句。
15、用@屏蔽错误消息的做法非常低效,极其低效。
16、打开 apache的 mod_deflate模块,可以提高网页的浏览速度。
17、数据库连接当使用完毕时应关掉,不要用长连接。
18、错误消息代价昂贵。
19、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
20、递增一个全局变量要比递增一个局部变量慢 2倍。
21、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢 3倍。
22、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢 9至 10倍。
23、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
24、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了 10个方法,但性能上没有变化。
25、派生类中的方法运行起来要快于在基类中定义的同样的方法。
26、调用带有一个参数的空函数,其花费的时间相当于执行 7至 8次的局部变量递增操作。类似的方法调用所花费的时间接近于 15次的局部变量递增操作。
27、Apache解析一个 PHP脚本的时间要比解析一个静态 HTML页面慢 2至 10倍。尽量多用静态 HTML页面,少用脚本。
28、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套 PHP缓存机制通常可以提升 25%至 100%的性能,以免除编译开销。
29、尽量做缓存,可使用 memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态 Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
30、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用 strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在 zval结构(C的内置数据结构,用于存储 PHP变量)中存储的已知字符串长度。但是,由于 strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用 isset()技巧加速执行你的代码。(举例如下) if(strlen($foo)< 5){ echo“Foo is too short”$$}(与下面的技巧做比较) if(!isset($foo{5})){ echo“Foo is too short”$$}调用 isset()恰巧比 strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
31、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是 PHP特有的,并不适用于其他语言,所以请不要修改你的 C或 Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要 3条指令(opcodes),$i++则需要 4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如 Zend的 PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
32、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
33、并非要用类实现所有的数据结构,数组也很有用。
34、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
35、当你需要时,你总能把代码分解成方法。
36、尽量采用大量的 PHP内置函数。
37、如果在代码中存在大量耗时的函数,你可以考虑用 C扩展的方式实现它们。
38、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。 Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
39、mod_zip可作为 Apache模块,用来即时压缩你的数据,并可让数据传输量降低 80%。
40、在可以用 file_get_contents替代 file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意 file_get_contents在打开一个 URL文件时候的 PHP版本问题;
41、尽量的少进行文件操作,虽然 PHP的文件操作效率也不低的;
42、优化 Select SQL语句,在可能的情况下尽量少的进行 Insert、Update操作(在 update上,我被恶批过);
43、尽可能的使用 PHP内部函数(但是我却为了找个 PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
44、循环内部不要声明变量,尤其是大变量:对象(这好像不只是 PHP里面要注意的问题吧?);
45、多维数组尽量不要循环嵌套赋值;
46、在可以用 PHP内部字符串操作函数的情况下,不要用正则表达式;
47、foreach效率更高,尽量用 foreach代替 while和 for循环;
48、用单引号替代双引号引用字符串;
49、“用 i+=1代替 i=i+1。符合 c/c++的习惯,效率还高”
50、对 global变量,应该用完就 unset()掉;
php高级教程
php高级教程
php是it行业语言,也是一门较热的网络技术,下面就由我为大家介绍一下php高级教程,欢迎大家阅读!
一、PHP-多维数组:
$cars= array(
array("huawei","12","11"),
array("meizu","23","12"),
array("iphone","12","4")
);
$title= array("手机总共有:","个,已经卖出去了","个!");
for($i=0;$i{ for($j=0;$j{ echo$cars[$i][$j]; echo$title[$j];} echo"";}?>
输出:
huawei手机总共有:12个,已经卖出去了11个!
meizu手机总共有:23个,已经卖出去了12个!
iphone手机总共有:12个,已经卖出去了4个!
二、PHP日期和时间
date()函数的格式参数是必需的,它们规定如何格式化日期或时间。
下面列出了一些常用于日期的字符:
·d-表示月里的某天(01-31) D-表示当前这天的英文星期简写
·m-表示月(01-12) M-表示当前月的英文缩写
·Y-表示年(四位数) y-表示年(后两位数)
·1-表示周里的某天 L-返回0
其他字符,比如"/","."或"-"也可被插入字符中,以增加其他格式。
echo"今天是". date("YYYY/m/d")."";//2017201720172017/06/26由此可见不能用js中yyyy-mm-dd的形式
echo"今天是". date("Y.m.d")."";//2017.06.26
echo"今天是". date("Y-M-D")."";//17-Jun-Mon
echo"今天是". date("l")."";//Monday星期全称
echo"今天是". date("L")."";//0
?>
获得简单的时间
下面是常用于时间的字符:
date_default_timezone_set("Asia/Shanghai");//设置时区
echo date_default_timezone_get(oid);//获取当前时区
·h-带有首位零的 12小时小时格式 H-24小时格式
·i-带有首位零的分钟 I-0
·s-带有首位零的秒(00-59) S-返回th我也不知道是什么鬼
·a-小写的午前和午后(am或 pm) A-返回大写格式:AM或PM
echo"现在是". date("h:i:sa")."";//现在是 02:15:44pm
echo"现在是". date("H:I:SA")."";//现在是 14:0:thPM
通过 PHP mktime()创建日期
date()函数中可选的时间戳参数规定时间戳。如果您未规定时间戳,将使用当前日期和时间
语法
mktime(hour,minute,second,month,day,year)
$d=mktime(9,12, 31, 6, 10, 215);
echo"创建日期是". date("Y-m-d h:i:sa",$d)."";//在date方法里面传参则取的是参数中的时间,如果不传的话则取的是当前时间
通过 PHP strtotime()用字符串来创建日期
PHP strtotime()函数用于把人类可读的字符串转换为Unix时间。
$d=strtotime("10:38pm April 15 2015");
echo"创建日期是". date("Y-m-d h:i:sa",$d);
如果输入了它不能识别的字符串则保存为 1970-01-01 12:00:00am
计算两个时间段内的时间所有的周六
$startdate= strtotime("Saturday");
$enddate= strtotime("+6 weeks",$startdate);
while($startdate<$enddate){
echo date("M d",$startdate),"";
$startdate= strtotime("+1 week",$startdate);//在$startdate基础上加一个礼拜,你还可以加1天,1个月,1年
}
?>
计算距离某一天还有多长时间
$d1=strtotime("2017-7-30");
$d2=ceil(($d1-time())/60/60/24);
echo"距离十二月三十一日还有:".$d2."天。";
?>
三、PHP Cookies
cookie常用于识别用户。cookie是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie的值。
创建cookie
setcookie()函数用于设置 cookie。
注释:setcookie()函数必须位于
标签之前。
语法
setcookie(name, value, expire, path, domain);
在下面的例子中,我们将创建名为"user"的 cookie,把为它赋值"Alex Porter"。我们也规定了此 cookie在一小时后过期:
setcookie("user","Alex Porter", time()+3600);
?>
注释:在发送 cookie时,cookie的值会自动进行 URL编码,在取回时进行自动解码(为防止 URL编码,请使用setrawcookie()取而代之)。
取回 Cookie的值
PHP的$_COOKIE变量用于取回cookie的值。
// Print a cookie
echo$_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>
删除 cookie当删除 cookie时,您应当使过期日期变更为过去的时间点。
// set the expiration date to one hour ago
setcookie("user","", time()-3600);
?>
如果浏览器不支持 cookie该怎么办?
如果您的应用程序涉及不支持cookie的浏览器,就不得不采取其他方法在应用程序中从一张页面向另一张页面传递信息。一种方式是从表单传递数据(有关表单和用户输入的内容,稍早前我们已经在本教程中介绍过了)。
下面的表单在用户单击提交按钮时向"welcome.php"提交了用户输入:
Name:
Age:
取回"welcome.php"中的值,就像这样:
Welcome.
You are years old.
四、PHP Sessions
PHP Session变量
当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP地址不能维持状态。
通过在服务器上存储用户信息以便随后使用,PHP session解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。
Session的工作机制是:为每个访问者创建一个唯一的 id(UID),并基于这个 UID来存储变量。UID存储在cookie中,亦或通过 URL进行传导。
开始 PHP Session
在您把用户信息存储到 PHPsession中之前,首先必须启动会话。
注释:session_start()函数必须位于
标签之前:
上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
存储 Session变量
存储和取回session变量的正确方法是使用 PHP$_SESSION变量:
session_start();
// store session data
$_SESSION['views']=1;
?>
//retrieve session data
echo"Pageviews=".$_SESSION['views'];
?>
输出:
Pageviews=1
在下面的例子中,我们创建了一个简单的 page-view计数器。isset()函数检测是否已设置"views"变量。如果已设置"views"变量,我们累加计数器。如果"views"不存在,则我们创建"views"变量,并把它设置为 1:
session_start();
if(isset($_SESSION['views']))
$_SESSION['views']=$_SESSION['views']+1;
else
$_SESSION['views']=1;
echo"Views=".$_SESSION['views'];
?>
终结 Session
如果您希望删除某些session数据,可以使用 unset()或 session_destroy()函数。
unset()函数用于释放指定的 session变量:
unset($_SESSION['views']);
?>
您也可以通过session_destroy()函数彻底终结 session:
session_destroy();
?>
注释:session_destroy()将重置 session,您将失去所有已存储的session数据。
五、PHP错误处理
错误处理方法:
·简单的"die()"语句
·自定义错误和错误触发器
·错误报告
为了避免用户获得类似上面的错误消息,我们在访问文件之前检测该文件是否存在:
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
假如文件不存在,您会得到类似这样的错误消息:
File not found
比起之前的代码,上面的代码更有效,这是由于它采用了一个简单的错误处理机制在错误之后终止了脚本。
不过,简单地终止脚本并不总是恰当的方式。让我们研究一下用于处理错误的备选的 PHP函数。
创建自定义错误处理器
创建一个自定义的错误处理器,可以在PHP中发生错误时调用该函数。
该函数必须有能力处理至少两个参数(error level和 error message),但是可以接受最多五个参数(可选的:file, line-number以及error context):
语法
error_function(error_level,error_message,
error_file,error_line,error_context)
参数描述
error_level:必需。为用户定义的错误规定错误报告级别。必须是一个值数。参见下面的表格:错误报告级别。
error_message:必需。为用户定义的错误规定错误消息。
error_file:可选。规定错误在其中发生的文件名。
error_line:可选。规定错误发生的行号。
error_context:可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
创建错误处理函数
function customError($errno,$errstr)
{
echo"Error: [$errno]$errstr
";
echo"Ending Script";
die();
}
现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数。
Set ErrorHandler
PHP的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序。
可以修改错误处理程序,使其仅应用到某些错误,这样脚本就可以不同的方式来处理不同的错误。不过,在本例中,我们打算针对所有错误来使用我们的自定义错误处理程序:
set_error_handler("customError");
由于我们希望我们的自定义函数来处理所有错误,set_error_handler()仅需要一个参数,可以添加第二个参数来规定错误级别。
//定义错误处理函数
function customError($errno,$errstr)
{
echo"rror: [$errno]$errstr";
}
//设置错误处理函数
set_error_handler("customError");
//触发错误
echo($test);
?>
可能的错误类型:
·E_USER_ERROR-致命的用户生成的run-time错误。错误无法恢复。脚本执行被中断。
·E_USER_WARNING-非致命的用户生成的run-time警告。脚本执行不被中断。
·E_USER_NOTICE-默认。用户生成的`run-time通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
例子
在本例中,如果"test"变量大于"1",则发生E_USER_WARNING错误。如果发生了 E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本:
//error handler function
function customError($errno,$errstr)
{
echo"Error: [$errno]$errstr
";
echo"Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
错误记录
通过 E-Mail发送错误消息
function customError($errno,$errstr)
{
echo"Error: [$errno]$errstr";
echo"Webmaster has been notified";
error_log("Error: [$errno]$errstr",1,
"526369948@qq.com","From: 526369948@qq.com");
}
六、PHP异常处理
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
·当前代码状态被保存
·代码执行被切换到预定义的异常处理器函数
·根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:
·异常的基本使用
·创建自定义的异常处理器
·多个异常
·重新抛出异常
·设置顶层异常处理器
Try, throw和 catch
要避免上面例子出现的错误,我们需要创建适当的代码来处理异常。
正确的处理程序应当包括:
1.Try-使用异常的函数应该位于"try"代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
2.Throw-这里规定如何触发异常。每一个"throw"必须对应至少一个"catch"
3.Catch-"catch"代码块会捕获异常,并创建一个包含异常信息的对象
让我们触发一个异常:
//创建可抛出一个异常的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//在"try"代码块中触发异常
try
{
checkNum(2);//如果抛出异常则执行catch中的语句,这里就不接着往下执行了
//If the exception is thrown, this text will not be shown
echo'If you see this, the number is 1 or below';
}
//捕获异常
catch(Exception$e)
{
echo'Message:'.$e->getMessage();
}
?>
上面代码将获得类似这样一个错误:
Message: Value must be 1 or below
创建一个自定义的 Exception类
创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP中发生异常时,可调用其函数。该类必须是 exception类的一个扩展。
这个自定义的exception类继承了 PHP的 exception类的所有属性,您可向其添加自定义的函数。
我们开始创建exception类:
class customException extends Exception//extends相当于继承关键字
{
public function errorMessage()//定义了自己的报错函数
{
//error message在继承的类中,可以访问基类的方法
$errorMsg='Error on line'.$this->getLine().' in'.$this->getFile()
.':'.$this->getMessage().' is not a valid E-Mail address';
return$errorMsg;
}
}
$email="someone@example...com";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL)=== FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch(customException$e)
{
//display custom message
echo$e->errorMessage();
}
?>
这个新的类是旧的exception类的副本,外加 errorMessage()函数。正因为它是旧类的副本,因此它从旧类继承了属性和方法,我们可以使用 exception类的方法,比如 getLine()、getFile()以及 getMessage()。
多个异常
可以为一段脚本使用多个异常,来检测多种情况。
可以使用多个if..else代码块,或一个 switch代码块,或者嵌套多个异常。这些异常能够使用不同的 exception类,并返回不同的错误消息:
php数组的语法
定义 array()
可以用 array()语言结构来新建一个 array。它接受一定数量用逗号分隔的 key=> value参数对。
array( [key=>]value,...)// key可以是 integer或者 string// value可以是任何值<?php$arr= array(foo=> bar, 12=> true);echo$arr[foo];// barecho$arr[12];// 1?>
key可以是 integer或者 string。如果键名是一个 integer的标准表达方法,则被解释为整数(例如 8将被解释为 8,而 08将被解释为 08)。key中的浮点数被取整为 integer。php中没有不同的数字下标和关联下标数组,数组的类型只有一种,它可以同时包含整型和字符串型的下标。
值可以是任何值。
<?php$arr= array(somearray=> array(6=> 5, 13=> 9, a=> 42));echo$arr[somearray][6];// 5echo$arr[somearray][13];// 9echo$arr[somearray][a];// 42?>
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
<?php// This array is the same as...array(5=> 43, 32, 56, b=> 12);//...this arrayarray(5=> 43, 6=> 32, 7=> 56, b=> 12);?>如果$arr还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名/值对,要对它用 unset()。<?php$arr= array(5=> 1, 12=> 2);$arr[]= 56;// This is the same as$arr[13]= 56;// at this point of the script$arr[x]= 42;// This adds a new element to// the array with key xunset($arr[5]);// This removes the element from the arrayunset($arr);// This deletes the whole array?>
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
<?php//创建一个简单的数组$array= array(1, 2, 3, 4, 5);print_r($array);//现在删除其中的所有单元,但保持数组本身的结构foreach($array as$i=>$value){ unset($array[$i]);}print_r($array);//添加一个单元(注意新的键名是 5,而不是你可能以为的 0)$array[]= 6;print_r($array);//重新索引:$array= array_values($array);$array[]= 7;print_r($array);?>上例将输出: Array( [0]=> 1 [1]=> 2 [2]=> 3 [3]=> 4 [4]=> 5)Array()Array( [5]=> 6)Array( [0]=> 6 [1]=> 7)
如果你还想了解更多这方面的信息,记得收藏关注本站。