PHP一些有意思的小区别

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

(0)

相关推荐

  • PHP一些有意思的小区别

    单引号'和双引号"的区别:  首先是单引号要比双引号执行效率要高,因为双引号会对内容进行预处理.  例如:'$value' 输出字符 $value ; "$value"输出变量$value的值. char和varchar的区别:  char是定长而varchar是变长,char的主要特点是存储方式预分配,varchar当它的数据长度发生变化时会影响其存储的页分配.  char与varchar2是一对矛盾的统一体,两者是互补的关系.   varchar2比char节省空间,在效

  • 浅谈c和c++的某些小区别

    C++类型检查更加严格 c语言中,当字符当做函数参数传入是,都把字符当整型int使用,sizeof('c') = sizeof(int); 更进一步,c编译器把字符常量等同于整数常量处理: putchar(10) 同 putchar('\n') 等效. 但是,C++中, sizeof('c') == 1, 补充说明一点, sizeof(wchar_t) ==4. 因此可以很容易代表65,536个不同的Unicode字符. 另外,C++中,区别函数不仅要看他的函数名,更要看它的参数.因此,putc

  • strings命令分析浅谈Go和C++编译时的一点小区别

    最近查一个bug, 用strings命令分析, 竟然出乎意料地没有结果, 非常纳闷. 最后根据这个线索查出了bug的根本原因. 1.  在C++中, 即使函数在代码层面没有被调用, 也会最终编译到二进制中, 用strings可以分析.  #include <iostream> using namespace std; void fun() { printf("hello world\n"); // strings分析有结果 } int main() { return 0;

  • javascript函数命名的三种方式及区别介绍

    javascript函数命名的三种方式及区别介绍 第一 复制代码 代码如下: function fn(val1,val2) { alert(val1+val2); } fn(1,2); 第二 复制代码 代码如下: var fn=function() { alert(val1+val2); } fn(1,2); 第三 复制代码 代码如下: var fn=new Function("alert(val1+val2)"); fn(1,2); 上面三种方式逻辑上是等价的,但是还是有点小区别:区

  • 浅谈JS函数定义方式的区别

    关于JS的函数定义方式有以下两种: (1)典型的函数声明 function slide(arguments){ //...code } (2)以函数表达式的形式定义函数 var slide = function(arguments){ //...code } 虽然上面两种方式逻辑上是等价的,但是还是有点小区别: 区别一:例一中的函数会在代码执行以前被加载到作用域中,而例二则是在代码执行到那一行的时候才会有定 义: 区别二:函数声明会给函数指定一个名字,而函数表达式则是创建一个匿名函数,然后将这个

  • JS函数定义方式的区别介绍

    关于JS的函数定义方式有以下两种: (1)典型的函数声明 function slide(arguments){ //...code } (2)以函数表达式的形式定义函数 var slide = function(arguments){ //...code } 虽然上面两种方式逻辑上是等价的,但是还是有点小区别: 区别一:例一中的函数会在代码执行以前被加载到作用域中,而例二则是在代码执行到那一行的时候才会有定 义: 区别二:函数声明会给函数指定一个名字,而函数表达式则是创建一个匿名函数,然后将这个

  • JDK1.8、JDK1.7、JDK1.6区别看这里

    这一篇开始说ArrayList 参考代码为jdk1.6_45 jdk1.7_80 jdk1.8_111中的源码,对比阅读,发现修改的问题以及改进点. public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 一.基本性质 1.底层使用原生数组实现,实现RandomAccess接口,可以随机访问,随机

  • golang新手不注意可能会出现的一些小问题

    go简介 语言哲学 C语言是纯过程式的,这和它产生的历史背景有关.Java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数.而Go语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精 Go语言反对函数和操作符重载(overload),而C++.Java和C#都允许出现同名函数或操作符,只要它们的参数列表不同. 其次,Go语言支持类.类成员方法.类的组合,但反对继承,反对虚函数(v

  • javascript从作用域链谈闭包

    神马是闭包 关于闭包的概念,是婆说婆有理. 闭包是指有权访问另外一个函数作用域中的变量的函数 这概念有点绕,拆分一下.从概念上说,闭包有两个特点: 1.函数 2.能访问另外一个函数作用域中的变量 在ES 6之前,Javascript只有函数作用域的概念,没有块级作用域(但catch捕获的异常 只能在catch块中访问)的概念(IIFE可以创建局部作用域).每个函数作用域都是封闭的,即外部是访问不到函数作用域中的变量. function getName() { var name = "美女的名字&

  • Ajax和跨域问题深入解析

    什么是ajax Ajax(Asynchronous JavaScript and XML),是一种可以向服务器请求额外的数据并且无需刷新页面的技术,ajax的出现带来了更好的用户体验. Ajax的核心就是XMLHttpRequest(XHR)对象.XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.可以使用XHR对象获取新数据,通过DOM将新数据插入到页面.虽然名字中包含XML,但是ajax通信和数据格式无关;这种技术就是可以不用刷新就从服务器获取数据,但是不一定是XML数据,也可以是js

随机推荐