• PHP和Mysql中一些容易混淆的概念
    时间:2009-12-09   作者:佚名   出处:互联网

    对于初学者来说,PHP和Mysql中一些基础的东西比较容易混淆,本文简单介绍一下
    单引号'和双引号"的区别

      首先是单引号要比双引号执行效率要高,因为双引号会对内容进行预处理。例如:'$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

    网友留言/评论

    我要留言/评论