php学习笔记(二)

3.如何销毁一个变量。   

unset();

4.执行结果是多少?  

$a = 3;  

$b = 5;    

if($a = 5 || $b = 7) {  //$a = 5 || $b = 7这里仅仅是一个条件,$a=5 为true,直接下一步程序

$a++;   

$b++;   

}   

echo $a . " " . $b;    

 

 

 

7.PHP中的PEAR是什么

PHP Extension and Application Repository的缩写,意即「PHP的延续与应用程式库」,简单的說,PEAR其实是一个PHP的程式库;

 

8.SQL 中LEFT JOIN的含义是_______,如果 circle_user记录了学生的姓名(name)和学号(ID)〃 circle_score记录了学生(有的学生考试以后被开除了〃没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject)〃要想打印出各个学生姓名及对应的的各科总成绩〃则可以用SQL语句______.      

 

9.优化MySQL数据库的方法。    

 

10.怎么关闭 PDO 的数据库链接。

 <?php

$servername = "localhost";

$username = "username";

$password = "password";

 

try {

    $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);

    echo "Connected successfully";

    }

catch(PDOException $e)

    {

    echo $e->getMessage();

    }

?>

 

Note 注意在以上 PDO 实例中我们已经指定了数据库 (myDB)。PDO 在连接过程需要设置数据库名。如果没有指定,则会抛出异常。   

实例 (MySQLi - 面向对象)

$conn->close();

 

实例 (MySQLi - 面向过程)

mysqli_close($conn);

 

实例 (PDO)

$conn = null;

11.谈谈Redis 、Memcache、MongoDB 的区别和具体应用场景。

 

12.请简单阐述您最得意的开发之作。     

 

13.请说出一个自己碰到过的最糟糕的BUG 〃并说明是如何解决的。

 

13.对于大流量的网站,您采用什么样的方法来解决访问量问题

14.针对高并发的访问量,一个用户表在添加数据时的身份证(body_no)唯一性是否可以用数据库建立唯一约束做支撑?

 

14.session跨域原理

 

两个不同的域名网站,想用同一个Session,就是牵扯到Session跨域问题!

 

默认情况下,各个服务器会各自分别对同一个客户端产生 SESSIONID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 11111111111,而B 服务器生成的则是222222。另外,PHP 的 SESSION数据都是分别保存在本服务器的文件系统中。想要共享 SESSION 数据,那就必须实现两个目标:

 

 

一个是各个服务器对同一个客户端产生的SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的COOKIE;

 

另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。这两个目标简单地说就是多服务器(A、B服务器)共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION 数据。

 

 

1.只要在php页面的最开始(要在任何输出之前,并且在session_start()之前)的地方进行以下设置

ini_set('session.cookie_path', '/');

ini_set('session.cookie_domain', '.mydomain.com');

ini_set('session.cookie_lifetime', '1800');

 

 

2.在php.ini里设置

session.cookie_path = /

session.cookie_domain = .mydomain.com

session.cookie_lifetime = 1800

 

 

3.在php页面最开始的地方(条件同1)调用函数

session_set_cookie_params(1800 , '/', '.mydomain.com');

 

 

/问题:/

php 两个不同服务器的站点怎么实现session跨域?

实质解决方案:两个站点的session共享,通过某介子传递实现session共享

 

于是,解决网站跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨:

 

1. 基于NFS的Session共享

NFS是Net FileSystem的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发。

  这个方案实现最为简单,无需做过多的二次开发,仅需将共享目录服务器mount到各频道服务器的本地session目录即可,缺点是NFS依托 于复 杂的安全机制和文件系统,因此并发效率不高,尤其对于session这类高并发读写的小文件, 会由于共享目录服务器的io-wait过高,最终拖累前端WEB应用程序的执行效率。

 

 

 

 

2. 基于数据库的Session共享

  首选当然是大名鼎鼎的Mysql数据库,并且建议使用内存表Heap,提高session操作的读写效率。这个方案的实用性比较强,相信大家普 遍在 使用,它的缺点在于session的并发读写能力取决于Mysql数据库的性能,同时需要自己实现session淘汰逻辑,以便定时从数据表中更新、删除 session记录,当并发过高时容易出现表锁,虽然我们可以选择行级锁的表引擎,但不得不否认使用数据库存储Session还是有些杀鸡用牛刀的架势。

 

 

 

3. 基于Cookie的Session共享

  这个方案我们可能比较陌生,但它在大型网站中还是比较普遍被使用。原理是将全站用户的Session信息加密、序列化后以Cookie的方式, 统一 种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现 用户的Cookie化Session 在多服务间的共享访问。

 

  这个方案的优点无需额外的服务器资源;缺点是由于受http协议头信心长度的限制,仅能够存储小部分的用户信息,同时Cookie化的 Session内容需要进行安全加解密(如:采用DES、RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证),另外它也会占用一定的带 宽资源,因为浏览器会在请求当前域名下任何资源时将本地Cookie附加在http头中传递到服务器。

 

 

 

4. 基于Memcache的Session共享

Memcache由于是一款基于Libevent多路异步I/O技术的内存共享系统,简单的Key + Value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前本人所经历的项目达到2000/秒 平均查询,并且服务器CPU消耗依然不到10%。

 

  另外值得一提的是Memcache的内存hash表所特有的Expires数据过期淘汰机制,正好和Session的过期机制不谋而合,降低了 过期Session数据删除的代码复杂度,对比“基于数据库的存储方案”,仅这块逻辑就给数据表产生巨大的查询压力。

 

 

 

  基于Memcache 的存储是这几个方案中推荐选用的!

  其它方案依然有其使用的场合,具体选用哪套需要开发人员的根据当前的服务器资源、网站并发压力等综合评估。

 

/**

*技术如何实现?

*

**/

/end 问题:/


15.php3.2新增魔术函数:

__construct:构造函数

__destruct:析构方法 __destruct()

允许在销毁一个类之前执行执行析构方法。和构造方法一样,PHP不会在本类中自动的调用父类的析构方法。

要执行父类的析构方法,必须在子类的析构方法体中手动调用 parent::__destruct() 。

试图在析构函数中抛出一个异常会导致致命错误。

__call()  方法用于监视错误的方法调用。

为了避免当调用的方法不存在时产生错误,可以使用 __call() 方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

__callStatic(): 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。

__set() 方法用于设置私有属性值。

__get() 方法用于获取私有属性值。

__isset() 方法用于检测私有属性值是否被设定。

__unset() 方法用于删除私有属性。

__sleep():序列化之前调用

__wakeup():反序列化之前调用

__toString():在将一个对象转化成字符串时自动调用

__invoke(): 当尝试以调用函数的方式调用一个对象时,该方法会被自动调用

 

<?php

class CallableClass{

function __invoke($x) {

var_dump($x);

}

}

$obj = new CallableClass;

$obj(5);//int(5)

var_dump(is_callable($obj));//bool(true)

 

?>

16.redis和memcatch的区别?

*******************redis和memcatch对比**********************

*memcached是一个高性能的分布式的内存对象缓存系统

*redis是一个key-value存储系统

a、Redis支持服务器端的数据操作:

Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

 

1、redis的数据结构有哪些

 string(字符串): 

string是最简单 的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。

 list(双向链表):

list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。之所以说它是双向的,因为它可以在链表左,右两边分别操作

 dict(hash表)

set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字

 zset(排序set)

zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。 可以对指定键的值进行排序权重的设定,它应用排名模块比较多

 

2. 为什么memcatch需要把数据拿到客户端来修改?

 

b、内存使用效率对比:

使用简单的key-value存储的话,Memcached的内存利用率更高(Redisstring类型上会消耗较多内存,可以使用dicthash表)压缩存储以降低内存耗用。),而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

 

c、性能对比:

由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

 

1.redis是单核,memcatched是多核是什么意思?

答:就是单线程和多线程的意思

 

d、存储方式:

    memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小

    redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化

 

*******************redis和memcatch对比**********************

 

 

 

17.php各个版本之间的区别

PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束

1.__autoload

大家可能都知道 __autoload() 函数,如果定义了该函数,那么当在代码中使用一个未定义的类的时候,该函数就会被调用,你可以在该函数中加载相应的类实现文件,如:

 

function __autoload($classname)

{

    require_once("{$classname}.php")

}

但该函数已经不被建议使用,原因是一个项目中仅能有一个这样的 __autoload() 函数,因为 PHP 不允许函数重名。但当你使用一些类库的时候,难免会出现多个 autoload 函数的需要,于是 spl_autoload_register() 取而代之:

spl_autoload_register(function($classname)

{

    require_once("{$classname}.php")

});

spl_autoload_register() 会将一个函数注册到 autoload 函数列表中,当出现未定义的类的时候,SPL [注] 会按照注册的倒序逐个调用被注册的 autoload 函数,这意味着你可以使用 spl_autoload_register() 注册多个 autoload 函数.

 

     2.PDO

   PDO 和 MySQLi

         PHP Data Object, PHP 数据对象,这是 PHP 的新式数据库访问接口。

        按照传统的风格,访问 MySQL 数据库应该是这样子:

 

// 连接到服务器,选择数据库

$conn = mysql_connect("localhost", "user", "password");

mysql_select_db("database");

 

// 执行 SQL 查询

$type = $_POST['type'];

$sql = "SELECT * FROM `table` WHERE `type` = {$type}";

$result = mysql_query($sql);

 

// 打印结果

while($row = mysql_fetch_array($result, MYSQL_ASSOC))

{

    foreach($row as $k => $v)

        print "{$k}: {$v}\n";

}

 

// 释放结果集,关闭连接

mysql_free_result($result);

mysql_close($conn);

为了能够让代码实现数据库无关,即一段代码同时适用于多种数据库(例如以上代码仅仅适用于MySQL),PHP 官方设计了 PDO.

除此之外,PDO 还提供了更多功能,比如:

 

面向对象风格的接口

SQL预编译(prepare), 占位符语法

更高的执行效率,作为官方推荐,有特别的性能优化

支持大部分SQL数据库,更换数据库无需改动代码

上面的代码用 PDO 实现将会是这样:

 

// 连接到数据库

$conn = new PDO("mysql:host=localhost;dbname=database", "user", "password");

 

// 预编译SQL, 绑定参数

$query = $conn->prepare("SELECT * FROM `table` WHERE `type` = :type");

$query->bindParam("type", $_POST['type']);

 

// 执行查询并打印结果

foreach($query->execute() as $row)

{

    foreach($row as $k => $v)

        print "{$k}: {$v}\n";

}

PDO 是官方推荐的,更为通用的数据库访问方式,如果你没有特殊需求,那么你最好学习和使用 PDO.

但如果你需要使用 MySQL 所特有的高级功能,那么你可能需要尝试一下 MySQLi, 因为 PDO 为了能够同时在多种数据库上使用,不会包含那些 MySQL 独有的功能。

 

MySQLi 是 MySQL 的增强接口,同时提供面向过程和面向对象接口,也是目前推荐的 MySQL 驱动,旧的C风格 MySQL 接口将会在今后被默认关闭。

MySQLi 的用法和以上两段代码相比,没有太多新概念,在此不再给出示例,可以参见 PHP 官网文档 [注]。

注:http://www.php.net/manual/en/mysqli.quickstart.php

注:SPL: Standard PHP Library, 标准 PHP 库, 被设计用来解决一些经典问题(如数据结构).

 

    3.类型约束

    通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.

 

    // 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组

    function MyFunction(MyClass $a, callable $b, array $c)

   {

      // ...

    }

 

PHP5.2:JSON 支持

JSON 支持

包括 json_encode(), json_decode() 等函数,JSON 算是在 Web 领域非常常用的数据交换格式,可以被 JS 直接支持,JSON 实际上是 JS 语法的一部分。

JSON 系列函数,可以将 PHP 中的数组结构与 JSON 字符串进行转换:

 

$array = ["key" => "value", "array" => [1, 2, 3, 4]];

$json = json_encode($array);

echo "{$json}\n";

 

$object = json_decode($json);

print_r($object);

输出:

 

{"key":"value","array":[1,2,3,4]}

stdClass Object

(

    [key] => value

    [array] => Array

        (

            [0] => 1

            [1] => 2

            [2] => 3

            [3] => 4

        )

)

值得注意的是 json_decode() 默认会返回一个对象而非数组,如果需要返回数组需要将第二个参数设置为 true.

PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar

1.三元运算符

 $a="yes";

      $a = $a ? :"no";

      print_r($a);

2. 弃用的功能

       以下几个功能被弃用,若在配置文件中启用,则 PHP 会在运行时发出警告。

     3. 匿名函数

        也叫闭包(Closures), 经常被用来临时性地创建一个无名函数,用于回调函数等用途。

$func = function($arg)

{

    print $arg;

};

 

$func("Hello World");

以上代码定义了一个匿名函数,并赋值给了 $func.

可以看到定义匿名函数依旧使用 function 关键字,只不过省略了函数名,直接是参数列表。

 

然后我们又调用了 $func 所储存的匿名函数。

 

匿名函数还可以用 use 关键字来捕捉外部变量:

 

function arrayPlus($array, $num)

{

    array_walk($array, function(&$v) use($num){

        $v += $num;

    });

}

上面的代码定义了一个 arrayPlus() 函数(这不是匿名函数), 它会将一个数组($array)中的每一项,加上一个指定的数字($num).

 

arrayPlus() 的实现中,我们使用了 array_walk() 函数,它会为一个数组的每一项执行一个回调函数,即我们定义的匿名函数。

在匿名函数的参数列表后,我们用 use 关键字将匿名函数外的 $num 捕捉到了函数内,以便知道到底应该加上多少。

PHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改

PHP5.5:yield, list() 用于 foreach, 细节修改

PHP5.6: 常量增强,可变函数参数,命名空间增强

PHP6在php5.6的时候已经继承,直接跳过

PHP 7 的五大新特性

A:1. 运算符(NULL 合并运算符)

把这个放在第一个说是因为我觉得它很有用。用法:

$a = $_GET['a'] ?? 1;

它相当于:

<php

$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

B: 函数返回值类型声明

官方文档提供的例子(注意 … 的边长参数语法在 PHP 5.6 以上的版本中才有):

<php

function arraysSum(array ...$arrays): array

{

    return array_map(function(array $array): int {

        return array_sum($array);

    }, $arrays);

}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。

 

18. PHP ++$I和$i++区别

(谁先赋值的区别,都会自动加1)

$i++和++$i在发生赋值时是有区别的,但是无论哪种形式都不影响自身值得自增。
例子中执行$i++后$i的值已经变化为3了。
举个例子:
$i=1;
$y=$i++;    //这里的运算顺序是$y=$i;$i=$i+1
注意,此时$y的值是1,但是$i的值是自增1次后是2了。
同样:mx


$i=1;
$y=++$i;    //这里的运算顺序是 $i=$i+1;$y=$i;
结果$y=2,$i=2
这两个例子反映了他们赋值的顺序,也说明无论使用哪种形式,都不影响变量$i自增。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值