PHP一些有意思的小区别
2018-09-07 12:29
单引号和双引号的区别:
首先是单引号要比双引号执行效率要高,因为双引号会对内容进行预处理。
例如:$value输出字符$value;$value输出变量$value的值。
char和varchar的区别:
char是定长而varchar是变长,char的主要特点是存储方式预分配,varchar当它的数据长度发生变化时会影响其存储的页分配。
char与varchar2是一对矛盾的统一体,两者是互补的关系.
varchar2比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率。
varchar2虽然比char节省空间,但是如果一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移(RowMigration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar2会更好一些。
mysql_connect和mysql_pconnect的区别
引用exceedphpclub论坛上的朋友原话:
php中mysql_pconnect()的实现方式:
其实mysql_pconnect()本身并没有做太多的处理,它唯一做的只是在php运行结束后不主动close掉mysql的连接.
mysql_pconnect()与此同时mysql_connect()的区别:
cgi方式下:
在php经cgi方式运行时pconnect和connect是基本没有区别的,因为cgi方式是每一个php访问起一个进程,访问结束后进程也就结束了,资源也全释放了.
apache模块方式下:
区别在于当php以apache模块方式运行时,由于apache有使用进程池,一个httpd进程结束后会被放回进程池,这也就使得用pconnect打开的的那个mysql连接资源不被释放,于是有下一个连接请求时就可以被复用.
这就使得在apache并发访问量不大的时候,由于使用了pconnect,php节省了反复连接db的时间,使得访问速度加快.这应该是比较好理解的.
但是在apache并发访问量大的时候,如果使用pconnect,会由于之前的一些httpd进程占用的mysql连接没有close,则可能会因为mysql已经达到最大连接着,使得之后的一些请求永远得不到满足.
例如:
若mysql最大连接数设为500,而apache的最大同时访问数设为2000
假设所有访问都会要求访问db,而且操作时间会比较长
当前500个请求的httpd都没有结束的时候...之后的httd进程都是无法连接到mysql的(因已经达到mysql最大连接数).只有当前500个httpd进程结束或被复用才可以连接得到了mysql.
其实这个也很好解释了xgy_p的测试中若操作比较简单,pconnect比connect效率高很多,而且跟使用jsp的连接池的速度比较接近.因为这个时候httpd进程可以不断的给复用.
而当DB操作复杂,耗时较长时,因httpd会fork很多并发进程处理,而先产生的httpd进程不释放db连接,使得后产生的httpd进程无法连上db.因为这样没有复用其它httpd进程的mysql连接.于是会就产生很多连接超时,像一开始的1000个并发连接测试说几乎都是连接超时就是这个原因.
---
(反进来看jsp用的如果是纯粹的db连接池,则不会有因为达到mysql连接上限而连不上的问题,因为jsp的连接池会使得可以等待其它连接使用完毕并复用.)
因此在并发访问量不高时,使用pconnect可以简单提高访问速度,但在并发量增大后,是否再使用pconnect就要看程序员的选择了..
就我个人认为,php现在对mysql的连接并没有真正用到连接池,pconnect也只是相当于借了apache的进程池来用,所以在并发访问量大的时候pconnect并不能很好的提高访问DB效率.在这一点上.php的确比不上jsp.
就目前的这种情况,如果并发量大的话,我个人建议最好还用mysql_connect.
include和require的区别
以下取自nbsp;
php的require()性能与include()相类似。不同之处在于,对include()来说,在include()执行时文件每次都要进行读取和评估;而对于require()来说,文件只处理一次(实际上,文件内容替换了require()语句)。这就意味着如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高。另一方面,如果每次执行代码时相读取不同的文件,或者有通过一组文件叠代的循环,就使用include(),因为可以给想要包括的文件名设置一个变量,当参数为include()时使用这个变量。
include在执行时,如果include进来的文件发生错误的话,不会立刻停止;而require则会立刻终止程序,不再往下执行。
include可以用在循环;require不行。
以下取自ricky
1,require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
这个已经不适用了,因为require可以包含变量指向的文件如
if($a=1){
$file=1.php;
}else{
$file=2.php;
}
require($file);
2,包含文件不存在或者语法错误的时候require是致命的,include不是
3,include有返回值,而require没有(可能因为如此require的速度比include快)
$login=include(test.php);
if(!empty($login)){
echo文件包含成功;
}else{
echo文件包含失败;
}
引用文件的方法有两种:require及include。两种方式提供不同的使用弹性。
require的使用方法如require(MyRequireFile.php);。这个函数通常放在PHP程序的最前面,PHP程序在执行前,就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。
include使用方法如include(MyIncludeFile.php);。这个函数一般是放在流程控制的处理部分中。PHP程序网页在读到include的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。
isset()和empty()的区别
两者都是测试变量用的,但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空。
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示,如果一个变量被赋空值,$foo=或者$foo=0或者$foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。
要注销一个变量,可以用unset($foo)或者$foo=NULL