PHP常见面试题

 PHP   admin   阅读(342)   2018-10-10 15:55:49 

1.php的意思?
服务器端脚本语言,生成动态网站,收集表单,操作文件,利用网络协议等等

2.双引号和单引号的区别?
双引号解释变量,单引号不解释变量
双引号的变量名后面必须有一个非数字,字母,下划线的特殊字符
双引号解析转义字符,单引号不解释转义字符.
3.php几个超全局变量
$_GET ----->get传送方式 $POST ----->post传送方式
$REQUEST ----->可以接收到get和post两种方式的值
$GLOBALS ----->所有的变量都放在里面
$FILE ----->上传文件使用
$SERVER ----->系统环境变量
$SESSION ----->会话控制的时候会用到
$COOKIE ----->会话控制的时候会用到
4.get与post的区别?
get是发送请求HTTP协议通过urkl参数传递,post是实体数据,可以提交大量数据。
5.echo,print,print_r的区别?
echo是语句,print是函数没有返回值,也可以有返回值
print 打印简单类型变量的值 print_r打印复杂类型变量的值
6.修改session生存时间?
$savePa
th ='./session_save_dir/';
$fileTime ='2*60';//小时*秒数
session_save_path($savePath);
session_set_cookie_params($fileTime);
7.session与cookie的区别?
session是存放在服务端,COOKIE存在客户端。session方式较为安全性高些。

8.sessionz运行的机制?
用户A访问Y,站点Y执行了session_start()那么会产生一个session_id
这个session_id一般会以cookie的形式保存到用户A中.可以通过在php.ini
设置session.use_only_cookies为1,强制SESSION ID必须以COOKIE传递。)
这个时候session_id为$_COOKIE['PHPSESSID']
用户A接着访问Y,这个session id($_COOKIE[’PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session——id,
然后通过session_id,来获得与SESSION数据的关联,并返回SESSION数据。
9.数据库中的事务是什么?
事务是作为一个单元的一组有序的数据操作,即使只有一个操作失败,事务也不成功
如果所有操作完成,事务则提交。其修改将作用于所有其他数据库进程,如果一个操作失败
事务将回滚,该事务所有的操作都取消。事务具有一致性,持久性,原子性,隔离性
10.对于大流量的网站,您采用什么样的方法来解决访问量问题?
确认服务器是否支持足够大的流量,数据库读写分离,优化表
程序功能规则,禁止外部盗链,控制大文件的下载,使用不同的主机分离
使用负载均衡 CDN进行存储
11.优化Mysql数据库的方法?
系统设计方面,设计良好的数据库结构,避免使用join查询,按照数据库三范式
系统架构方法,表分散,海量数据散列到不同的表,集群,主服务器read&write
从服务器read,only,或者N台服务器,各机器互为master
高效的sql语句,缓存查询,explain每个sql语句
锁定表,使用事务,建立索引,尽量把字段设置为notnull
12.开发过程中使用什么方法加快页面加载速度?
需用到服务器资源才打开,及时关闭服务器资源,数据库添加索引,页面生成静态化,图片大文件单独服务器
13.优化数据库的方法.
1.使用索引,增加索引命中率
2.优化查询语句,添加缓存命中率
数据库涉及方面,构造分库分表,提高数据库存储能力和扩展能力,使用不同的存储引擎
14.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
避免使用join‘查询,提交效率,设置良好的数据库结构
选择适合的数据类型和存储引擎,适当添加索引
mysql库主从读写分离
添加缓存机制memcached
不经常改动的页面,生成静态页面
15.读写分离的好处?
增加了冗余
增加了机器的处理能力
主从负责各自写与读,极大程序缓解了x锁和s锁争用
从库配置myisam引擎,提升查询性能以及节约系统开销
从库同步数据和主库直接写还是有区别的,通过主库发送来的binlog恢复数据,但是
最重要区别在于主库发binlog是异步的,从库恢复数据也是异步点
读写分离适用于大于写的场景中,如果只能一台服务器,当select很多的时候
update和delete会被这些select访问中的数据堵塞,等待select结束
并发不高,对于写和读比例相近的应用,应该部署双主相互复制
分摊读取 假如我们有1主3从,假设现在1分钟内有10条写入,150条读取
那么1主3从相当于共计40条写入,因此写入没变,平均每台服务器承担了
10条写入和50条读取((主库不 承担读取操作)).
16.索引的目的是什么?
创建唯一索引保证数据库表每一个数据的唯一性
加速表与表的之间的连接使用,分组和排序子句进行数据检索时
可以显著减少查询中分组和排序时间
负面影响:
创建索引和维护索引需要耗时时间,这个时间随着数据增加而增加,索引需要占用
物理空间对表进行增删改查的时间索引也要动态维护,降低了数据的维护速度?
17.什么情况下不宜简历索引?
对于查询很少涉及列或者重复比较多的列不宜建立索引
对于一些特殊的数据类型,不宜建立索引比如文本
18.解释MySQL外连接,内连接和自然连接的区别?
内连接:只有条件的交叉连接,根据某个条件选择符合符合条件的记录
不符合的记录不会出现在结果集中,则内连接只匹配的行
左外连接:也称左连接,左表为主表,左表的所有记录都会出现在结果集中,对于右边那些
没有匹配的记录,如果要选择右边对应的字段可以null填充
右外连接:称为右连接,右表为主表,右表中的所有记录都会出现在结果集中 Mysql不支持全外连接
19.MySQL的存储引擎名称?
MyIsam innodb BOB Merge Memory csv MaxDB

20.Mysql取得当前时间的函数是?格式化日期的函数是?
current_timestamp();
date_format('2019-2-22','%Y-%m-%d');
21.数据类型(int,char,varchar,datetime,text)的意思,请问varchar和char的区别?
int存储定长,varchar变长datetime 时间 text 存储 char定长
22.查询数据集结果的总数函数是?
mysqli_num_rows();
23.Mysql的存储引擎,myisam和innodb的区别?
myisam类型不支持事务等高级处理,innndo的区别
myisam类型强调的性能,执行速度比innodb快
innodb不支持fulltext类型的索引
myisam支持表锁,innodb支持行锁
24.如何处理服务器共享session?
数据库/文件同步session 缓存 同步session
25.中文截取无乱码的方法?
mb_substr($str,1,1,'UTF-8');
26.得到一个网站的内容?
echo file_get_contents("http://www.phpres.com/index.html");
27.post的传值与传引用的区别,什么时候传值什么时候传引用?
按值传递,函数范围对值的任何改变在函数外都会被忽略。
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
对象默认是传引用
对于较大是的数据,传引用比较好,这样可以节省内存的开销
28.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
function my_sandir($dir)
{
$files = array();

if (is_dir($dir)){
if ($handle = opendir($dir)){
while (($file = readdir($handle))!==false){
if ($file!='..' && $file!='.'){
if (is_dir($file.'/'.$dir)){
$files[$file] = my_sandir($dir.'/'.$file);
}else
{
$files[] = $dir.'/'.$file;
}
}
}
closedir($handle);
return $files;
}
}
}
29.字符串截取无乱码?
function substrU($str,$start,$length=null)
{
return join("",array_slice(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY),$start,$length));
}

30.三个数中最大的?
function maxI($a,$b,$c)
{
return $a > $b ? ($b>$c?$a:$c):($b>$c?$b:$c);
}
31.字符串翻转无乱码?
function strreva($arr)
{
return join("",array_reverse(preg_split("//u",$arr)));
}
32.转换成(如1,234,567,890)每3位用逗号隔开的形式?
function str($str)
{
$str = strrev($str);
$str = chunk_split($str,3,',');
$str = strrev($str);
$str = ltrim($str,',');
return $str;
}
33.种方式或者.php后缀名?
$path = str_replace('\\','/',__FILE__);
function e1($path)
{
return strrchr($path,'.');
}
function e2($path)
{
return substr($path,strrpos($path,'.'));
}
function e3($path)
{
$path_parts = pathinfo($path);
return $path_parts['extension'];
}
function e4($path)
{
$arr = explode('.',$path);
return $arr[count($arr)-1];
}
//echo e4($path);

function change_str($str)
{
$arr = explode('_',$str);
$arr = array_map('ucfirst',$arr);
return implode('',$arr);
}
34.将open_dir首字母转换成大写?
function change_str($str)
{
$arr = explode('_',$str);
$arr = array_map('ucfirst',$arr);
return implode('',$arr);
}
$s1 = 'open_dir';
echo change_str($s1);
35.写一个函数对二维数组进行排序?
function array_sort($arr,$row,$type='asc')
{
$arr_temp = array();
foreach ($arr as $v){
$arr_temp[$v[$row]] = $v;
}
if ($type=='asc'){
ksort($arr_temp);
}
else if ($type=='desc'){
krsort($arr_temp);
}else
{
exit;
}
return $arr_temp;
}
$person = array(
array('id'=>2,'name'=>'zhangsan','age'=>23),
array('id'=>5,'name'=>'lisi','age'=>28),
array('id'=>3,'name'=>'apple','age'=>17)
);

$person = array_sort($person,'name');
print_r($person);

36.统计字符的个数
function strlenU($str)
{
return count(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY));
}

37.This is PHP翻转PHP is This?;
function reverse($str)
{
$arr = explode(' ',$str);
$arr = array_reverse($arr);
return implode(' ',$arr);
}
38.正则匹配一个邮箱是否正确?function checkEmail($email)
{
$preg = "/([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?/i";
return preg_match($preg,$email);
}
39.两个文件的相对路径?
$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
function RelativePath($path,$conpath)
{
$pathArr = explode('/',$path);
$conpath = explode('/',$conpath);
$dis = 0;
for ($i=0;$i if ($conpath[$i] !=$pathArr[$i]){
$dismatchlen = count($pathArr) -$i;
$arrLeft = array_slice($pathArr,$i);
break;
}
}
$ret =str_repeat('../',$dismatchlen).implode('/',$arrLeft);
return $ret;
}
print_r(RelativePath($b,$a));
40.语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们?
nclude产生一个warning,而require产生直接产生错误中断
require_once include_once
41.在HTTP1.0中,状态码401的含义是?如果找不到文件的提示,则可以用header函数语句是?
header('HTTP/1.0 404 Not Found');


42.http协议状态码503,500,404,403,404,200,301,302.
200请求成功 301永久性重定向 302展示型重定向
401 当前请求需要用户验证 403 服务器拒绝执行请求
404 请求失败,请求的数据在服务器上没有发现
503 服务器临时维护
43.多线程/多线程读写文件的问题?
$fp = fopen('/lock.txt','w+');
if (flock($fp,LOCK_EX)){
fwrite($fp,'write someting here\n');
flock($fp,LOCK_UN); //释放锁
}else
{
echo "Couldn't lock the file !";
}
44.$_SERVER预定义变量
$_SERVER['SERVER_ADDR']; 服务器ip
$_SERVER['REMOTE_ADDR']; 客户端ip
$_SERVER['HTTP_REFERER']; 上一个来源
$_SERVER['PHP_SELF']; 当前php的文件
$_SERVER['SERVER_NAME']; //获取主机名
$_SERVER['QUERY_STRING']; 获取当前url路径的函数及服务器变量
$_SERVER['REQUEST_URI']; 访问此页面所需的URI
45.求两个日期的差数,2019-2-22到2020-2-22的日期差数?
echo (strtotime('2019-2-22') - strtotime('2020-2-22'))/(3600*24);
46.谈谈mvc的认识?
由模型,视图,控制器完成的应用程序,由模型发出要实现的功能到控制器
控制器接收组织功能传给视图
47.php网站主要攻击的方式有哪些?
命令注入(Command Injection)
eval 注入(Eval Injection)
客户端脚本攻击(Script Insertion)
跨网站脚本攻击(Cross Site Scripting, XSS)
SQL 注入攻击(SQL injection)
跨网站请求伪造攻击(Cross Site Request
Forgeries, CSRF)
Session 会话劫持(Session Hijacking)
Session 固定攻击(Session Fixation)
HTTP 响应拆分攻击(HTTP Response Splitting)
文件上传漏洞(File Upload Attack)
目录穿越漏洞(Directory Traversal)
远程文件包含攻击(Remote Inclusion)
动态函数注入攻击(Dynamic Variable
Evaluation)
URL 攻击(URL attack)
表单提交欺骗攻击(Spoofed Form
Submissions)
48.框架中单一入口和多入口,单一入口的优缺点?
多口就是通过不同的文件来完成的请求
单一入口web程序所有的请求指向一个脚本
单一更加容易控制权限,对http请求可以进行安全检查
缺点:看起来不那么美观,对搜索引擎不好
49.什么是面向对象.主要特征,几大原则?
面向对象是程序是一种设计模式,提高程序的重用性,特征:封装,继承,多态
原则:单一职责原则,开放封闭原则,替换原则,依赖原则,接口分离原则
$arr=array(11,3,56,62,21,66,32,78,36,76,39,88,34);
50.//冒泡排序
function bubbleSort($arr)
{
$len = count($arr);
for ($i=1;$i<$len;$i++){
for ($k=0;$k<$len-$i;$k++){
if ($arr[$k] > $arr[$k+1]){
$temp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $temp;
}
}
}
return $arr;
}
51.选择排序
function selectSort($arr)
{
for ($i=0,$len=count($arr);$i<$len-1;$i++){
$p = $i;
for ($j=$i+1;$j<$len;$j++){
if ($arr[$p] > $arr[$j]){
$p = $j;
}
}
if ($p!=$i){
$temp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $temp;
}
}
return $arr;
}
52.插入排序
function insertSort($arr)
{
$len = count($arr);
for ($i=1;$i<$len;$i++){
$temp = $arr[$i];
for ($j=$i-1;$j>0;$j--){
if ($temp < $arr[$j]){
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
}else{
break;
}
}
}
return $arr;
}
53.快速排序
function quickSort($arr)
{
if (!is_array($arr)){
return $arr;
}
$lenght = count($arr);
if ($lenght<=1){
return false;
}
$left = array();
$right = array();
for ($i=1;$i<$lenght;$i++){
if ($arr[$i] < $arr[0]){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
$left = quickSort($left);
$right = quickSort($right);
return array_merge($left,array($arr[0]),$right);
}
//print_r(quickSort($arr));
54.二分查找法

function binSearch($arr,$s)
{
$height = count($arr)-1;
$low = 0;
while ($low<=$height){
$mid = floor(($low/$height)/2);
if ($arr[$mid] == $s){
return $mid;
}else if ($arr[$mid] < $s){
$low = $mid + 1;
}else if ($arr[$mid] > $s){
$height = $mid - 1;
}
}
return '查找失败';
}


55.PHP魔术方法__construct() 实例化类时自动调用。__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

56.php函数
array_values($arr); //获得数组的值
array_keys($arr); //获得数组的键名
array_flip($arr); //数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
array_search('PHP',$arr); //检索给定的值,加true则是严格类型检查
array_reverse($arr); //将数组中的元素翻转
in_array("apple", $arr); //在数组中检索apple
array_key_exists("apple", $arr); // 检索给定的键名是否存在数组中
array_count_values($arr); // 统计数组中所有值出现的次数
array_slice($arr, 0, 3); //将数组中的一段取出,此函数忽略键名(数组的分段)
array_splice($arr, 0, 3,array("black","maroon")); //将数组中的一段取出,返回的序列从原数组中删除
array_chunk($arr, 3, TRUE); //将一个数组分割成多个,TRUE为保留原数组的键名(分割多个数组)
sort($arr); //由小到大,忽略键名
rsort($arr); //由大到小,忽略键名
asort($arr); //由小到大,保留键名
arsort($arr); // 由大到小,保留键名
ksort($arr); //按照键名正序排序
krsort($arr); // 按照键名逆序排序
array_sum($arr); //对数组内部的所有元素做求和运算(数组元素的求和)
//array_merge($arr1, $arr2); //合并两个或多个(相同字符串键名,后面覆盖前面,相同的数字键名,后面的附加到后面)
array_diff($arr1, $arr2); //返回差集结果数组 array_diff_assoc($arr1, $arr2, $arr3); //返回差集结果数组,键名也做比较
array_intersect($arr1, $arr2); //返回交集结果数组 array_intersect_assoc($arr1, $arr2); //返回交集结果数组,键名也做比较 explode() //分割数组 strlen() //字符串长度 substr() //截取字符串 mb_substr() //替换字符串函数 strstr() //检索字符串 str_repeat() //重复一个字符串 addslashes() //转义字符串 htmlspecialchars() //html转实体
57.Linux命令?
top 是linux常用的性能分析,显示进程资源占用
Ps查看进程
mv 移动更改文件
find 在子目录中搜索匹配的文件
cat 把一个或多个文件内容显示到标准输出
chmod 改变文件属性
chgrp 改变用户分组
grep 文件内进行搜索
wc 统计文件的字节数 字数 行数
df 显示磁盘空间
58.Apache与Nginx的优缺点比较
1.nginx相对于apache的优点:
轻量级,比apache 占用更少的内存及资源。高度模块化的设计,编写模块相对简单
抗并发,nginx 处理请求是异步非阻塞,多个连接(万级别)可以对应一个进程,而apache 则是阻塞型的,是同步多进程模型,一个连接对应一个进程,在高并发下nginx 能保持低资源低消耗高性能
2.nginx处理静态文件好,Nginx 静态处理性能比 Apache 高 3倍以上
apache 相对于nginx 的优点:
apache 的rewrite 比nginx 的rewrite 强大 ,模块非常多,基本想到的都可以找到 ,比较稳定,少bug ,nginx 的bug 相对较多
59.多线程和多进程的区别?
多进程是程序在计算机上的一次执行活动,当你运行一个程序,你就是启动了一个进程
程序是死的,进程是活的,进程分为系统进程和用户进程,完成操作系统的各种功能的进程就是系统进程
进程是操作系统进行资源分配的单元,windows中进程被细化为线程,也就是一个进程下面有多个能独立运行的小单元
60.Memcache和Redis区别
Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。
他们的扩展都需要做集群;实现方式:master-slave、Hash。
在100k以上的数据中,Memcached性能要高于Redis。
如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache更强
61.php实现工厂模式?
class Man{
private static $_instance;
private function __construct()
{
echo '我被实例化了';
}
//单例模式
public static function getInstance()
{
if (!isset(self::$_instance)){
self::$_instance = new self();
}
return self::$_instance;
}
private function __clone()
{
trigger_error('clone is not allow',E_USER_ERROR);
}
function test()
{
echo 'test';
}

}
62.TCP网络协议,ISO7层是什么?
应用层
HTTP、FTP、SMTP、DNS、DSP、Telnet、Gopher、WAIS……
传输层
TCP、UDP、DVP……
网络层
IP、ICMP、AKP、RARP、UUCP……
接口层
Ethernet、Arpanet、PDN……
物理层
只要能传输IP数据报(Datagram),允许任何协议……
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2
63.PHP抽象类与接口的区别

对接口的继承使用implements,抽象类使用extends.

接口中不可以声明变量,但可以声明类常量.抽象类中可以声明各种变量

接口没有构造函数,抽象类可以有

接口中的方法默认为public,抽象类中的方法可以用public,protected,private修饰

一个类可以继承多个接口,但只能继承一个抽象类

64.php三种访问控制模式的区别?
public 公用 任何地方都可以访问
protected 继承只能在本类种或子类中访问,其他地方不可以访问
private 私有的只能在本类中访问

65.isset,empty()与is_null的区别?isset();  检测变量是否存在empty() '',0,'0',null,false,array()未定义返回true;

is_null() 仅判断是否为null 未定义报警告

66.写出发帖最多的十个人名字SQL?

select top 10 id,usernaeme from members order by posts desc;

67.命令连接Mysql?
mysql -h110.110.110.110 -u root -p 123;

68.MySQL修改密码?
mysqladmin -u root -p abc123 password def456;

69.Mysql添加用户?
grant all PRIVILEGES on *.* to 'test'@'localhost' identified by '123';

70.Mysql设置权限?
grant select,insert,delete,update on test.* to 'tet@localhost' identified by '123';

71.创建数据库,显示数据库,删除数据库,修改表名,连接数据库,显示时间,显示年月日,备份数据库(导出整个表,导出一个数据库结构)?
create database news;
show database news;
drop database news;
rename table table_name to news
use news;
select now(); select MONTH(CURRENT_DATE);
mysqldump -u root -p root news >c:/news.sql
mysqldump -u root -p root -d -add-drop-table database >c:/news.sql -d

72.增加字段,加索引,删除索引,删除字段?
alert table table_name add user_price varchar(40) default
alter table table_name add add index emp_name (name);
alert table table_name frop index emp_name;
alert table table_name frop field_name;

73.MySQL 中LEFT JOIN的含义是__,如果tbl_user记录了学生的姓名(name)和学号(ID)
tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句____.
答:自然左外连接
create database phpinterview;
use phpinterview
create table tbl_user
(
ID int not null,
name varchar(50) not null,
primary key (ID)
);
create table tbl_score
(
ID int not null,
score dec(6,2) not null,
subject varchar(20) not null
);
insert into tbl_user (ID, name) values (1, 'beimu');
insert into tbl_user (ID, name) values (2, 'aihui');
insert into tbl_score (ID, score, subject) values (1, 90, '语文');
insert into tbl_score (ID, score, subject) values (1, 80, '数学');
insert into tbl_score (ID, score, subject) values (2, 86, '数学');
insert into tbl_score (ID, score, subject) values (2, 96, '语文');
select A.id,sum(B.score) as sumscore
from tbl_user A left join tbl_score B
on A.ID=B.ID
group by A.id
74.cgi 与fastcgi的区别?
cgi在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序 (或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。

后来出现了一种更高级的方式是, web服务器可以内置perl解释器或php解释器。 也就是说这些解释器做成模块的方式,web服务器会在启动的时候就启动这些解释器。 当有新的动态请求进来时,web服务器就是自己解析这些perl或php脚本,省得重新fork一个进程,效率提高了。

fastcgi的方式是,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退 出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回 给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
fastcgi跟cgi的区别是:

在web服务器方面 在对数据进行处理的进程方面
cgi fork一个新的进程进行处理 读取参数,处理数据,然后就结束生命期
fastcgi 用tcp方式跟远程机子上的进程或本地进程建立连接 要开启tcp端口,进入循环,等待数据的到来,处理数据

举个例子: 服务端现在有个10万个字单词, 客户每次会发来一个字符串,问以这个字符串为前缀的单词有多少个。 那么可以写一个程序,这个程序会建一棵trie树,然后每次用户请求过来时可以直接到这个trie去查找。 但是如果以cgi的方式的话,这次请求结束后这课trie也就没了,等下次再启动该进程时,又要新建一棵trie树,这样的效率就太低下了。 而用fastcgi的方式的话,这课trie树在进程启动时建立,以后就可以直接在trie树上查询指定的前缀了。

75.socket http tcp udp的关系区别tcp udp属于传输层协议
http 属于应用层协议
socket 是tcp udp协议封装的API

76.tcp 与 udp的区别tcp 稳定、可靠、速度慢:会有三次握手来建立连接。
udp不稳定、不可靠、速度快:没有TCP的握手,UDP是一个无状态的传输协议,所以它在传递数据时非常快。

77.表中有A,B,C三列用sql语句实现,当A列大于B列时选择A列,否则选择B列
当B列大于C列选择B列否则选择C列?

select case when a >b
then A
else B end,
case when b > c
then B
c end
from table

78.简述存储过程的使用情况?
当需要处理复杂的查询运算时,可以使用存储过程
从应用层的原则,大量使用存储过程导致业务逻辑分散在DB和应用服务器层
不利于维护和更新,总体来说,存储程序可以用,但要慎重,只能用来维护.
不能用于高性能的东西


















我要评论



展示评论