PHP学习笔记_1103

来源:互联网 发布:主机监控软件 编辑:程序博客网 时间:2024/06/13 20:28

1.mysql_pconnect()mysql_connect()非常相似,但是有两个主要区别:

1.首先,当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。

2.其次,当脚本执行完毕后到SQL服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close()不会关闭有mysql_pconnect()建立的连接)

 

 

2.数据库持久连接

持久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个持久连接的请求时。PHP将检查是否已经存在一个(前面已经开启的)相同的持久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓相同的连接是指用相同的用户名和密码到相同主机的连接。

web 服务器的工作和分布负载没有完全理解的读者可能会错误地理解持久连接的作用。特别的,持久连接不会在相同的连接上提供建立用户会话的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,持久连接不会提供任何非持久连接无法提供的特殊功能。

为什么?

这和 web 服务器工作的方式有关web 服务器可以用三种方法来利用 PHP 生成web页面。

第一种方法是 PHP用作一个单独运行的语言解释器(CGI Wapper)。以这种方法运行,PHP会为向web服务器提出的每个PHP页面请求生成并结束一个PHP解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向SQL数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,使用持久连接和非持久连接没有任何区别——因为PHP脚本本身的执行不是持久的。

第二,也是最常用的方法,是 PHP用作多进程web服务器的一个模块,这种方法目前只适用于 Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成web页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个持久连接后,所有请求 SQL服务的后继页面都能够重用这个已经建立的 SQL Server连接。 

最后一种方法是 PHP用作多线程web服务器的一个插件。目前 PHP 4已经支持ISAPIWSAPINSAPI(在非Windows环境下),这些使得PHP可以被用作诸如Netscape FastTrack (iPlanet)Microsoft's Internet Information Server (IIS)O'Reilly's WebSite Pro等多线程web服务器的插件。持久连接的行为和前面所描述的多过程模型在本质上是相同的。注意PHP 3 不支持SAPI

如果持久连接并没有任何附加的功能,那么使用它有什么好处

答案非常简单——效率。当Web Server创建到SQL服务器的连接耗费(Overhead)较高(如耗时较久,消耗临时内存较多)时,持久连接将更加高效。Overhead高低取决于很多因素。例如,数据库的种类,数据库服务和web服务是否在同一台服务器上,SQL服务器负载状况等。当Overhead较高,每次创建数据库连接成本较高时,持久连接将显著的提高效率。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向SQL服务器提出连接请求。这也就是说,每个子进程将对服务器建立各自独立的持久连接。例如,如果有20个不同的子进程运行某脚本建立了持久的SQL服务器持久连接,那么实际上向该SQL服务器建立了20个不同的持久连接,每个进程占有一个。

注意,如果持久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些问题。如果数据库的同时连接数限制为 16,而在繁忙会话的情况下,有17个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的16个连接将迅速地受到影响。请查阅使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。

 

3.function_exists(string $functing_name)

unction_exists(string $function_name)--在已经定义的函数列表(包括系统自带的函数和用户自定义的函数)中查找function_name,如果给定的函数已经被定义则返回true

 

 

4.PHP_VERSION

PHP_VERSION为常量,在PHP的内核中定义。它包含PHPZend引擎和SAPI模块。

PHP_VERSION  php版本

类似常量还有 PHP_OSPHP_SAPI

 

 

5.get_magic_quotes_gpc()

magic_quotes_gpc函数在php终端作用是判断解析用户提示的数据,如包括有:postgetcookie过来的数据增加转移字符"",以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误

magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:postgetcookie过来的数据增加转义字符\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误

magic_quotes_gpc=On的情况下,如果输入的数据有

单引号(’)、双引号(”)、反斜线()与NULNULL字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在magic_quotes_gpc=Off下进行了。在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。

 

6.addslashes(string $str)

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(‘)、双引号(“)、反斜线(\)与NULNULL字符)

一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS指定的转义函数 (比如MySQLmysqli_real_escape_string() PostgreSQLpg_escape_string() ),但是如果你使用的 DBMS没有一个转义函数,并且使用\来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的\并不会插入。 当PHP指令magic_quotes_sybase 被设置成 on时,意味着插入'时将使用'进行转义。

PHP 5.4 之前 PHP指令magic_quotes_gpc 默认是 on, 实际上所有的GETPOSTCOOKIE数据都用被addslashes()了。 不要对已经被magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。 遇到这种情况时可以使用函数get_magic_quotes_gpc() 进行检测。

 

<?php

$str = “is your name O’reilly?”;

Echo addslashes($str);

//输出:is your name O\’reilly?

>

 

7.stripslashes(string $str)

如果magic_quotes_sybase项开启,反斜线将被取出,但是两个反斜线将会被替换成一个

一个使用范例是使用PHP检测magic_quotes_gpc配置项的开启情况(在PHP5.4之前默认是开启的)并且你不需要将数据插入到一个需要转义的位置(例如数据库)。例如,你只是简单地将表单数据直接输出。

<?php

$str = “is your name O\’reilly?”;

 

echo stripslashes($str);

//输出:is your name O’reilly?

?>

 

8.三元表达式

语法:  条件?结果1:结果2

说明:问号前面的位置是判断条件,如果满足条件时结果2,不满足时结果2

eg

<?php

$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

//如果magic_quotes_gpc开启,则执行stripslashes$theValue,否则,直接是$theValue

?>

 

0 0