欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

PHP中一些有意思的小知识

程序员文章站 2022-05-08 12:26:52
...

单引号'和双引号"的区别 首先是单引号要比双引号执行效率要高,因为双引号会对内容进行预处理。例如:'$value' 输出字符 $value,"$value"输出变量$value的值。 char和varchar的区别 char是定长而varchar是变长,char的主要特点是存储方式预分配,varchar当

单引号'和双引号"的区别   首先是单引号要比双引号执行效率要高,因为双引号会对内容进行预处理。例如:'$value' 输出字符 $value ,"$value"输出变量$value的值。   char和varchar的区别   char是定长而varchar是变长,char的主要特点是存储方式预分配,varchar当它的数据长度发生变化时会影响其存储的页分配。   char与varchar2是一对矛盾的统一体,两者是互补的关系。varchar2比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的“以空间换效率”。   varchar2虽然比char节省空间,但是如果一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起“行迁移(Row Migration)”现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar2会更好一些。   mysql_connect和mysql_pconnect的区别   引用exceed php club论坛上的朋友原话:   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的区别   以下取自phpchina.cn   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