企业网站建设指导规范,怀柔重庆网站建设,做网站和做app,织梦网站首页标签PHP 高级工程面试题汇总
php面试
1.大型的分页查询
发现当表中有很多上万条数据时#xff0c;越后的数据用limit分页显示就越慢#xff08;2秒#xff09;#xff0c;可能是mysql的特性所致。所以花了点时间总结实现了更优解决方案#xff0c;最终实现毫秒级响应。…PHP 高级工程面试题汇总
php面试
1.大型的分页查询
发现当表中有很多上万条数据时越后的数据用limit分页显示就越慢2秒可能是mysql的特性所致。所以花了点时间总结实现了更优解决方案最终实现毫秒级响应。若网友有更优的请留言谢谢
?
/*
高效分页效果
特点及优点1.不使用limit当总记录数很大时limit取后面的数据会很慢
2.保存主键值至数组再截取最终需要的一段主键值再放入sql in中减少了数据库的负担。
步骤
1.先取出所有记录的主键id值
2.保存id值入数组
3.根据当前页、每页数据量获取需要返回记录的id串 ;implode(,,array_slice($conndb_arr,($page-1)*$page_size,$page_size));array_slice取出数组中的一段,implode组合数组为字符串
4.构造最终的sql语句 $sql where id in(.implode(,,array_slice($conndb_arr,($page-1)*$page_size,$page_size)).)
例子如下
*/if(isset($_GET[page]))$page intval($_GET[page]);else $page 1; //取出当前所在页默认为1
$page_size 9; // 每页显示记录数
//完整的查询
$sqlselect id,title,addtime,visit,content,(select count(*) from blog_news where archive_idblog_archive.id) as news_c,(select realname from users where idblog_archive.users_id) as creator from blog_archive;
$sql_cselect id from blog_archive order by id desc;// 取出表所有id值 强烈建议id为主键或已添加索引
$resultconndb($sql_c);
if(getresult_right($result)){ //自定义的sql语句执行结果判断语句
$amountmysql_num_rows($result);//得到总记录数
//$row mysql_fetch_array($result);
while ($row mysql_fetch_array($result)){
$conndb_arr[]$row[0];//将所有id值存入数组
}
// 记算总共有多少页
if( $amount ){ if( $amount $page_size ){ $page_count 1; } //如果总数据量小于$PageSize那么只有一页 if( $amount % $page_size ){ //取总数据量除以每页数的余数 $page_count (int)($amount / $page_size) 1; //如果有余数则页数等于总数据量除以每页数的结果取整再加一 }else{ $page_count $amount / $page_size ; //如果没有余数则页数等于总数据量除以每页数的结果 }
} else $page_count 0;
if($page$page_count)$page(int)$page_count;if( $amount ){//array_slice($conndb_arr,($page-1)*$page_size,$page_size)表示取出id数组中的一段从($page-1)*$page_size开始取$page_size个
$resultconndb($sql where id in(.implode(,,array_slice($conndb_arr,($page-1)*$page_size,$page_size)).));while ($row mysql_fetch_array($result)){ //循环输出分页记录echo $row[id].br;
}
}else{echo 没有找到任何记录;}
}
?另外一种只适用于连续ID的大型分页查询
2.你知道哪些设计模式并且他们的使用场景和作用是什么
知乎上很好的案例解释
3.php的优化方法
代码优化是开发程序和网站必不可少的一步代码优化好了可以大大增加程序的运行效率。使网站或程序加载反应更快。用户体验也就会更好。下面就为大家总结了50条PHP代码优化技巧。1、 用单引号代替双引号来包含字符串这样做会更快一些。因为 PHP 会在双引号包围的 字符串中搜寻变量单引号则不会注意只有 echo 能这么做它是一种可以把多个字符 串当作参数的“函数”(译注PHP 手册中说 echo 是语言结构不是真正的函数故把函数 加上了双引号)。2、如果能将类的方法定义成 static就尽量定义成 static它的速度会提升将近 4 倍。3、$row[id] 的速度是$row[id]的 7 倍。4、echo 比 print 快并且使用 echo 的多重参数(译注指用逗号而不是句点)代替字符串 连接比如 echo $str1,$str2。5、在执行 for 循环之前确定最大循环数不要每循环一次都计算最大值最好运用 foreach 代替。6、注销那些不用的变量尤其是大数组以便释放内存。7、尽量避免使用__get__set__autoload。8、require_once()代价昂贵。9、include 文件时尽量使用绝对路径因为它避免了 PHP 去 include_path 里查找文件的速 度解析操作系统路径所需的时间会更少。10、如果你想知道脚本开始执行(译注即服务器端收到客户端请求)的时刻使用 $_SERVER[REQUEST_TIME] 要好于 time()11、函数代替正则表达式完成相同功能。12、str_replace 函数比 preg_replace 函数快但 strtr 函数的效率是 str_replace 函数的四倍。13、如果一个字符串替换函数可接受数组或字符作为参数并且参数长度不太长那么 可以考虑额外写一段替换代码 使得每次传递参数是一个字符 而不是只写一行代码接受数 组作为查询和替换的参数。14、使用选择分支语句(译注即 switch case)好于使用多个 ifelse if 语句。15、用屏蔽错误消息的做法非常低效极其低效。16、打开 apache 的 mod_deflate 模块可以提高网页的浏览速度。17、数据库连接当使用完毕时应关掉不要用长连接。18、错误消息代价昂贵。19、在方法中递增局部变量速度是最快的。几乎与在函数中调用局部变量的速度相当。20、递增一个全局变量要比递增一个局部变量慢 2 倍。21、递增一个对象属性(如$this-prop)要比递增一个局部变量慢 3 倍。22、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢 9 至 10 倍。23、仅定义一个局部变量而没在函数中调用它同样会减慢速度(其程度相当于递增一个局 部变量)。PHP 大概会检查看是否存在全局变量。24、方法调用看来与类中定义的方法的数量无关因为我(在测试方法之前和之后都)添加了 10 个方法但性能上没有变化。25、派生类中的方法运行起来要快于在基类中定义的同样的方法。26、调用带有一个参数的空函数其花费的时间相当于执行 7 至 8 次的局部变量递增操作。 类似的方法调用所花费的时间接近于 15 次的局部变量递增操作。27、Apache 解析一个 PHP 脚本的时间要比解析一个静态 HTML 页面慢 2 至 10 倍。尽量 多用静态 HTML 页面少用脚本。28、除非脚本可以缓存否则每次调用时都会重新编译一次。引入一套 PHP 缓存机制通常 可以提升 25%至 100%的性能以免除编译开销。29、尽量做缓存可使用 memcached。memcached 是一款高性能的内存对象缓存系统 可用来加速动态 Web 应用程序减轻数据库负载。对运算码 (OP code)的缓存很有用使 得脚本不必为每个请求做重新编译。30、 当操作字符串并需要检验其长度是否满足某种要求时 你想当然地会使用 strlen()函数。 此函数执行起来相当快因为它不做任何计算只返回在 zval 结构(C 的内置数据结构用 于存储 PHP 变量)中存储的已知字符串长度。但是由于 strlen()是函数多多少少会有些 慢因为函数调用会经过诸多步骤如字母小写化(译注指函数名小写化PHP 不区分函 数名大小写)、哈希查找会跟随被调用的函数一起执行。在某些情况下你可以使用 isset() 技巧加速执行你的代码。 (举例如下) if (strlen($foo) 5) { echo “Foo is too short”
} (与下面的技巧做比较) if (!isset($foo{5})) { echo “Foo is too short”
} 调用 isset()恰巧比 strlen()快因为与后者不同的是isset()作为一种语言结构意味着它 的执行不需要函数查找和字母小写化。 也就是说 实际上在检验字符串长度的顶层代码中你 没有花太多开销。31、当执行变量$i 的递增或递减时$i会比$i 慢一些。这种差异是 PHP 特有的并不 适用于其他语言 所以请不要修改你的 C 或 Java 代码并指望它们能立即变快 没用的。 $i 更快是因为它只需要 3 条指令(opcodes)$i则需要 4 条指令。后置递增实际上会产生一 个临时变量这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的 一种正如 Zend 的 PHP 优化器所作的那样。牢记这个优化处理不失为一个好主意因为 并不是所有的指令优化器都会做同样的优化处理 并且存在大量没有装配指令优化器的互联 网服务提供商(ISPs)和服务器。32、并不是事必面向对象(OOP)面向对象往往开销很大每个方法和对象调用都会消耗很 多内存。33、并非要用类实现所有的数据结构数组也很有用。34、不要把方法细分得过多仔细想想你真正打算重用的是哪些代码?35、当你需要时你总能把代码分解成方法。36、尽量采用大量的 PHP 内置函数。37、如果在代码中存在大量耗时的函数你可以考虑用 C 扩展的方式实现它们。38、 评估检验(profile)你的代码。 检验器会告诉你 代码的哪些部分消耗了多少时间。 Xdebug 调试器包含了检验程序评估检验总体上可以显示出代码的瓶颈。39、mod_zip 可作为 Apache 模块用来即时压缩你的数据并可让数据传输量降低 80%。40、在可以用 file_get_contents 替代 file、fopen、feof、fgets 等系列方法的情况下尽量 用 file_get_contents因为他的效率高得多!但是要注意 file_get_contents 在打开一个 URL 文件时候的 PHP 版本问题;41、尽量的少进行文件操作虽然 PHP 的文件操作效率也不低的;42、优化 Select SQL 语句在可能的情况下尽量少的进行 Insert、Update 操作(在 update 上我被恶批过);43、尽可能的使用 PHP 内部函数(但是我却为了找个 PHP 里面不存在的函数浪费了本可 以写出一个自定义函数的时间经验问题啊!);44、 循环内部不要声明变量 尤其是大变量 对象(这好像不只是 PHP 里面要注意的问题吧?);45、多维数组尽量不要循环嵌套赋值;46、在可以用 PHP 内部字符串操作函数的情况下不要用正则表达式;47、foreach 效率更高尽量用 foreach 代替 while 和 for 循环;48、用单引号替代双引号引用字符串;49、“用 i1 代替 ii1。符合 c/c的习惯效率还高”50、对 global 变量应该用完就 unset()掉;4.php中传值与传引用的区别。什么时候传值什么时候传引用
值传递 函数范围内对值的任何改变在函数外部都会被忽略;引用传递 函数范围内对值的任何改变在函数外部也能反映出这些修改优缺点按值传递时php必须复制值。特别是对于大型的字符串和对象来说这将会是一个代价很大的操作。
按引用传递则不需要复制值对于性能提高很有好处。?php$name aa;function add_img($name){$name bb;}add_img($name);echo $name;//输出bb不是aa5.说一下php的(内存)垃圾回收机制
PHP的垃圾回收机制建议收藏知乎上一个不错的帖子
6.php如何实现页面跳转
在网页开发中实现页面跳转是一个常见的需求。对于PHP语言来说我们可以使用一些方法来实现页面跳转。在本文中我们将讨论一些PHP方法来实现页面跳转。一、使用header()函数实现跳转其中一个最常见的方法就是使用PHP的header()函数来实现跳转。该函数可以设置HTTP响应头包括Location头用于重定向。header()函数的基本格式如下header(Location: http://www.example.com/);在上述代码中我们指定了Location头该头中包含了要跳转的URL。需要注意的是在使用header()函数前不能有任何输出否则会导致出错。我们经常看到一个报错信息Warning: Cannot modify header information - headers already sent by ...这是因为在header()函数调用之前PHP已经输出了一些内容。为了避免这个问题在使用header()函数之前请确保没有输出。二、使用Location重定向代码实现跳转除了header()函数我们还可以使用Location重定向代码来实现跳转。Location重定向代码可以通过HTML元数据来执行重定向。这种方法可以在不使用header()函数的情况下进行跳转。Location重定向代码的基本格式如下meta http-equivrefresh content0; urlhttp://www.example.com/在上述代码中我们使用了HTML元数据meta并设置了http-equiv属性为refreshcontent属性中包含了要执行的动作和跳转的URL。其中content属性的值中0表示在不等待任何时间后开始跳转url属性中指定了要跳转的URL。需要注意的是在使用Location重定向代码进行跳转时不能有任何输出否则会导致出错。跳转时尽量不要使用该方法。三、使用JavaScript实现跳转除了上述两种方法我们还可以使用JavaScript来实现跳转。该方法可以在不使用header()函数的情况下执行重定向。同时我们还可以在跳转之前添加一些JS代码进行处理。JavaScript实现跳转的基本代码如下script typetext/javascriptwindow.location.hrefhttp://www.example.com/;/script在上述代码中我们使用了window.location.href属性来指定要跳转的URL。需要注意的是若使用该方法在跳转时会在新的页面中打开指定的URL。四、总结在本文中我们探讨了三种实现跳转的方法。使用header()函数和Location重定向代码可以实现服务器端跳转而使用JavaScript可以实现客户端跳转。总体来说header()函数和Location重定向代码是较为常用的方法。但是若需要在跳转时进行处理或在客户端跳转时使用JS操作使用JavaScript也是一个好的选择。在使用PHP实现跳转时务必谨慎处理避免误用导致程序出错。7.php遍历文件夹下所有文件(写出代码) 需要php获取文件夹下所有文件名我们有时候需要读取目录里面的内容在 PHP 有多个函数可以获取文件系统目录信息今天就给大家分享 PHP 遍历目录的三种方法。 php获取文件夹下所有文件名实现代码
1、用 dir() 返回对象function listDir($dir) {$mydir dir($dir);echo ul;while ($file $mydir - read()) {if ((is_dir($dir/$file))) {echo li$file/li;listDir($dir/$file);}elseif($file ! . $file ! ..) echo lia href$dir/$file target_blank$file/a/li;}echo /ul;$mydir - close();
}
listDir(.);2、使用 readdir() 函数function listDir2($dir) {$mydir opendir($dir);echo ul;while (($file readdir($mydir)) ! false) {if ($file ! . $file ! ..) {if (is_dir($file)) {echo li classdir$file/li;listDir2($dir/$file);} else {echo li classfilea href$dir/$file target_blank$file/a/li;}}}closedir($mydir);echo /ul;
}
listDir2(.);3、使用 scandir() 函数function listDir3($dir) {$mydir scandir($dir);echo ul;foreach($mydir as $key $value) {if ($value ! . $value ! ..) {if (is_dir($value)) {echo li classdir$value/li;listDir3($dir/$value);} else {echo li classfilea href$dir/$value target_blank$value/a/li;}}}echo /ul;
}
listDir3(.);对于上面提到的3个php函数对执行速度没有做过测试你可以按照你的习惯和喜欢选用一个。$path ./use;$result scanFile($path);function scanFile($path) {global $result;$files scandir($path);foreach ($files as $file) {if ($file ! . $file ! ..) {if (is_dir($path . / . $file)) {scanFile($path . / . $file);} else {$result[] basename($file);}}}return $result;}php使用递归的方法删除目录中的所有文件function delDir($directory){//自定义函数递归的函数整个目录if(file_exists($directory)){//判断目录是否存在如果不存在rmdir()函数会出错if($dir_handleopendir($directory)){//打开目录返回目录资源并判断是否成功while($filenamereaddir($dir_handle)){//遍历目录读出目录中的文件或文件夹if($filename!. $filename!..){//一定要排除两个特殊的目录$subFile$directory./.$filename;//将目录下的文件与当前目录相连if(is_dir($subFile)){//如果是目录条件则成了delDir($subFile);//递归调用自己删除子目录}if(is_file($subFile)){//如果是文件条件则成立unlink($subFile);//直接删除这个文件}}}closedir($dir_handle);//关闭目录资源rmdir($directory);//删除空目录}}}正因为来之不易所以才有了后来的倍加珍惜。8.写出至少2种获取文件后缀的方法或函数
一系列的操作还有判断文件大小等等... 今天就来聊一聊php实现获取文件扩展名的相关话题。
我在这里提供七种方法。 每一种方法都有些写注释让大家都能浅显易懂的理解和运用。第一种$file 东旭编程社区.x.png;echo substr(strrchr($file, .), 1);
解析strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置并返回从该位置到字符串结尾的所有字符第二种$file zhudongxu.z.png;echo substr($file, strrpos($file, .)1);
解析strrpos()函数查找 . 在字符串中最后一次出现的位置,返回位置 substr()从该位置开始截取第三种$file zhudongxu.y.z.png;$arrexplode(., $file);echo $arr[count($arr)-1];
解析explode()函数用“.”把字符串进行分割成数组 count()获取数组的长度 -1是数组的下标从0开始第四种$file 东旭编程社区.y.z.png;$arrexplode(., $file);echo end($arr);
解析和第三种方法一样 不一样的是利用end()函数直接返回数组最后一个元素第五种$file x.zhudongxu.z.png;echo strrev(explode(., strrev($file))[0]);
解析先用strrev()反转字符串然后用explode()函数分割成数组取出第0个也就是gnp 然后把字符串反转一次 [ 第一次反转只是为了保证数组的0下标永远获取的是文件扩展名或后缀 在不知道数组长度的情况下 ]第六种$file x.东旭编程社区.z.png;echo pathinfo($file)[extension];
解析pathinfo()函数以数组的形式返回文件路径的信息。包含[dirname] [basename] [extension] 其中extension就是文件的扩展名第七种$file x.y.东旭编程社区.png;echo pathinfo($file, PATHINFO_EXTENSION);
解析和第六种方法一样pathinfo()函数第二个参数 可以传入[PATHINFO_DIRNAME ][PATHINFO_BASENAME][PATHINFO_EXTENSION] PATHINFO_EXTENSION获取的就是就是文件的扩展名9.写一个函数吗获取一篇文章内容的全部图片并下载
function download_images($article_url , $image_path tmp){// 获取文章类容$content file_get_contents($article_url);// 利用正则表达式得到图片链接$reg_tag /img.*?\([^\]*(jpg|bmp|jpeg|gif|png)).*?/;$ret preg_match_all($reg_tag, $content, $match_result); $pic_url_array array_unique($match_result1[1]);// 创建路径$dir getcwd() . DIRECTORY_SEPARATOR .$image_path;mkdir(iconv(UTF-8, GBK, $dir), 0777, true);foreach($pic_url_array as $pic_url){// 获取文件信息$ch curl_init($pic_url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_NOBODY, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$fileInfo curl_exec($ch);$httpinfo curl_getinfo($ch);curl_close($ch);// 获取图片文件后缀$ext strrchr($pic_url, .);$filename $dir . / . uniqid() . $ext; // 保存图片信息到文件$local_file fopen($filename, w);if(false ! $local_file){if( false ! fwrite($local_file, $filecontent) ){fclose($local_file);}}}}10.php如何实现不用自带的cookie函数为客户端下发cookie。对于分布式系统如何保存session值
这个题有点绕。考的还是COOKIE和SESSION的基础知识。服务端通过set-cookie命令来通知客户端保存cookie。只要按照domain path 过期时间等规则 用header函数就可以实现。分布式系统session集中处理。按我们公司的架构为了实现高可用和高容灾提供一个分布式的验签服务。具体的可以看下redis的分布式服务架构。11.使用php实现双向队列
用php实现一个双向队列
12.url中获取文件扩展名
/**
* strrchr - 查找指定字符在字符串中的最后一次出现
* strrpos — 计算指定字符串在目标字符串中最后一次出现的位置
* end — 将数组的内部指针指向最后一个单元
* pathinfo — 返回文件路径的信息
* 可以通过参数 options 指定要返回哪些单元。
* 它们包括PATHINFO_DIRNAMEPATHINFO_BASENAME 和 PATHINFO_EXTENSION。默认是返回全部的单元
*/
$url http://www.baidu.com/aaa/test.php;echo 第一种方法\n;
echo strrchr($url, .); //.php
echo substr(strrchr($url, .), 1); //phpecho 第二种方法\n;
echo substr($url, strrpos($url, .)1);echo 第三种方法\n;
echo end(explode(., $url));echo 第四种方法\n;
$info pathinfo($url);
echo $info[extension];echo 第五种方法\n;
echo pathinfo($url, PATHINFO_EXTENSION);13.怎么保证促销商品不会超卖请写出一定方案
避免商品超卖的4种方案以下是一些核心思路
原始方案失败在每次下订单前我们判断促销商品的数量够不够不够不允许下订单更改库存量时加上一个条件只更改商品库存大于0的商品的库存当时我们使用ab进行压力测试当并发超过500访问量超过2000时还是会出现超卖现象。public function buyOne() {$shop Shop::find(1);if ($shop-number 0) {DB::update(update shop set number number - 1 where id 1);}
}第1种方案使用mysql的事务加排他锁来解决首先我们选择数据库的存储引擎为innoDB使用的是排他锁实现的刚开始的时候我们测试了下共享锁发现还是会出现超卖的现象。有个问题是当我们进行高并发测试时对数据库的性能影响很大导致数据库的压力很大。//2.利用数据库的forupdate来加锁在数量少的情况下并不会出现问题但是当并发达到ab -n 1000 -c 200
//就会出现请求非2XX的响应增多1000 失败了 60time per request 65.195
//在高并发的情况下会导致数据库连接数不够部分php获取不到连接而报错或者是超过等待时间而报错public function indexMysql() {DB::beginTransaction();//通过for update 加排它锁$shop DB::table(shop)-where(id, , 1)-lockForUpdate()-first();if ($shop-number 0) {if (DB::update(update shop set number number - 1 where id 1)) {DB::commit();} else {DB::rollBack();//回滚并重试usleep(100000);$this-indexMysql();}} else {DB::commit();}
}第2种方案使用文件锁实现。当用户抢到一件促销商品后先触发文件锁防止其他用户进入该用户抢到促销品后再解开文件锁放其他用户进行操作。这样可以解决超卖的问题但是会导致文件得I/O开销很大。第3种方案使用redis的setnx来实现锁机制。但是并发大的情况下锁的争夺会变多导致响应越来越慢。(与第四种方案类似)//在数量少的情况下并不会出现问题但是当并发达到ab -n 1000 -c 200 就会出现请求非2XX的响应增多1000 失败了 54) time per request 127.575public function index() {//测试并发超卖现象if (Redis::setnx(self::KEY, 1)) {//拿到了锁$this-buy();} else {usleep(100000);//等会再去拿锁//Log::info(未争夺到锁,睡眠100ms);$this-index();}
}private function buy() {$shop Shop::find(1);if ($shop-number 0) {$shop-number --;$shop-save();}Redis::del(self::KEY);
}第4种方案redis的队列来实现。将要促销的商品数量以队列的方式存入redis中每当用户抢到一件促销商品则从队列中删除一个数据确保商品不会超卖。这个操作起来很方便而且效率极高//4.使用redis队列来用户过来直接入队列然后再将操作更新到数据库
//最佳体验redis pconnect 9.481s, 无丢失 无框架public function push() {//入队列Redis::lpush(self::QUEUE, 1);
}//脚本调用pop方法 * * * * * php xxx.php
public function pop() {while (($key Redis::rpop(self::QUEUE))) {$shop Shop::find(1);if ($shop-number 0) {DB::update(update shop set number number - 1 where id 1)}}
}14.接口数据安全如何保证
15.session和cookie的区别
1、对象不同
cookie是针对每个网站的信息每个网站只能对应一个其他网站无法访问这个文件保存在客户端每次您拨打相应网站浏览器都会查找该网站的 cookies如果有则会将该文件发送出去。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。session是针对每个用户的只有客户端才能访问程序为该客户添加一个 session。session中主要保存用户的登录信息、操作信息等等。此 session将在用户访问结束后自动消失(如果也是超时)。2、存储数据大小不同
cookie一个 cookie存储的数据不超过3K。sessionsession存储在服务器上可以任意存储数据。当 session存储数据太多时服务器可选择进行清理。3、生命周期不同
cookiecookie的生命周期当浏览器关闭的时候就消亡了cookie的生命周期是累计的从创建时就开始计时30min后cookie生命周期结束。sessionsession的生命周期是间隔的从创建时开始计时如在30min内没有访问session那么session生命周期就被销毁。4、存储位置不同
cookiecookie数据保存在客户端。sessionsession数据保存在服务器端。5、数据类型不同
两者都是key-value结构但针对value的类型是有差异的。cookievalue只能是字符串类型。sessionvalue是object类型。6、安全性不同
cookie不是很安全别人可以分析存放在本地的COOKIE并进行COOKIE欺骗如果主要考虑到安全应当使用session。16.冒泡排序和快速排序
交换排序—冒泡排序和快速排序,讲的很好
17.oop思想和mvc的理解
一个思想 一个模式 模式是凌驾于面向对象之上的一种存在
OOP是面向对象编程 MVC是实现系统所选择的一种系统架构。
不使用MVC也一样可以实现系统的。 不使用OOP也一样可以编程。与MVC相比面向对象是微观的而设计模式是更加宏观的一种概念。两者并不是一种类型的东西。OOP
面向对象编程Object Oriented ProgrammingOOP面向对象程序设计是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标重用性、灵活性和扩展性。为了实现整体运算每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件组件 数据和功能一起在运行着的计算机程序中形成的单元组件在 OOP 计算机程序中是模块和结构化的基础。抽象性 程序有能力忽略正在处理中信息的某些方面即对信息主要方面关注的能力。封装 也叫做信息封装确保组件不会以不可预期的方式改变其它组件的内部状态只有在那些提供了内部状态改变方法的组件中才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口并规定了其它组件进行调用的方法。多态性 组件的引用和类集会涉及到其它许多不同类型的组件而且引用组件所产生的结果得依据实际调用的类型。继承性 允许在现存的组件基础上创建子类组件这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组而且还可以定义新类为现存的类的扩展这样就可以将类组织成树形或网状结构这体现了动作的通用性。
由于抽象性、封装性、重用性以及便于使用等方面的原因以组件为基础的编程在脚本语言中已经变得特别流行。MVC
MVC是一个设计模式它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件模型M、视图V、控制器C它们各自处理自己的任务。视图 视图是用户看到并与之交互的界面。对老式的Web应用程序来说视图就是由HTML元素组成的界面在新式的Web应用程序中HTML依旧在视图中扮演着重要的角色但一些新的技术已层出不穷它们包括Adobe Flash和象XHTMLXML/XSLWML等一些标识语言和Web services。如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生不管这些数据是联机存储的还是一个雇员列表作为视图来讲它只是作为一种输出数据并允许用户操纵的方式。模型 模型表示企业数据和业务规则。在MVC的三个部件中模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的就是说模型与数据格式无关这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用所以减少了代码的重复性。控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求然后确定用哪个视图来显示模型处理返回的数据。现在我们总结MVC的处理过程首先控制器接收用户的请求并决定应该调用哪个模型来进行处理然后模型用业务逻辑来处理用户的请求并返回数据最后控制器用相应的视图格式化模型返回的数据并通过表示层呈现给用户。18.求数组中最大数的下标
19.linux的常用命令
20.二维数组排重函数
21.常用魔术方法
22.Php中实例化和静态类是怎么区别的
23.oop思想和mvc的理解
24.求数组中最大数的下标
25.linux的常用命令
26.二维数组排重函数
27.常用魔术方法
28.Php中实例化和静态类是怎么区别的
mysql
mysql的函数有哪些
数据库优化场景慢查询解决分别需要注意什么
MongoDb的应用场景
事务的并发问题脏读幻读不可重复读等
mysql的常用引擎及他们的区别
非关系和关系型数据库有什么区别
数据库建表,字段和索引的选择上,进行了怎么样的优化或者是约束
Mysql的优化瓶颈
同时有一千的get请求把数据库搞崩了怎么处理
在不看慢日志的情况下怎么看mysql是什么进程卡掉的
事务里面可以嵌套事务吗
多脚本中如何使用事务假如我只想使用第二个脚本
我有n个脚本的情况下如何对其中一个脚本进行事务支持
金额的字段类型decimal,为什么不用double和float
金额精确度丢失的根本原因是什么
MyISAM 和 InnoDB 区别
索引结构解释 B树
悲观锁和乐观锁
select 执行过程
事务隔离级别
索引回表
索引失效
分库分表
读写分离
关于高并发的优化方案
关于支付的接入流程和方案实现
关于支付的回调和订单的退款处理
Redis
数据类型
淘汰策略
事务机制
缓存击穿
分布式锁
集群
redis的高可用原理
redis的缓存穿透缓存击穿缓存雪崩
redis的hash类型详解消息队列使用场景
redis和memcache的区别有哪些
redis的队列是如何实现细化到代码的解读
描述几种缓存的机制以及用途和区别
Redis和mysql,谁的性能更高一些
Redis的持久化和时效性是怎么保持的
Redis产生的脏数据是怎么进行消除的
消息队列是啥
延迟队列是啥
Redis有哪几种数据类型
Redis中什么时候用hash 什么时候用string
消息队列中需要同步返回结果怎么做
Vue
双向数据绑定原理
组件通信
生命周期
其他
ElasticSearch
MeiliSearch
RabbitMQ
MongoDB
Kafka
Laravel
依赖注入实现原理
常用集合方法
常用辅助函数
常用中间件
生命周期