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的内存利用率更高(Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。),而如果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自增。