zoukankan      html  css  js  c++  java
  • 程序员找工作必备 PHP 基础面试题

    1、优化 MYSQL 数据库的方法

     

    (1) 选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置 NOT NULL, 例如’省份,性别’, 最好设置为 ENUM

    (2) 使用连接(JOIN)来代替子查询:

    (3) 使用联合 (UNION) 来代替手动创建的临时表

    (4) 事务处理:

    (5) 锁定表,优化事务处理:

    (6) 使用外键,优化锁定表

    (7) 建立索引

    (8) 优化 sql 语句

    或者

    (1). 数据库设计方面,这是 DBA 和 Architect 的责任,设计结构良好的数据库,必要的时候,去正规化 (英文是这个:denormalize, 中文翻译成啥我不知道), 允许部分数据冗余,避免 JOIN 操作,以提高查询效率

    (2). 系统架构设计方面,表散列,把海量数据散列到几个不同的表里面。快慢表,快表只留最新数据,慢表是历史存档。集群,主服务器 Read & write, 从服务器 read only, 或者 N 台服务器,各机器互为 Master

     

    3).(1) 和 (2) 超越 PHP Programmer 的要求了,会更好,不会没关系。检查有没有少加索引

    (4). 写高效的 SQL 语句,看看有没有写低效的 SQL 语句,比如生成笛卡尔积的全连接啊,大量的 Group By 和 order by, 没有 limit 等等。必要的时候,把数据库逻辑封装到 DBMS 端的存储过程里面。缓存查询结果,explain 每一个 sql 语句

    (5). 所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count (*) … where article_id = ? 就可以了,不要先 select * … where article_id = ? 然后 msql_num_rows.只传送必须的 SQL 语句,比如修改文章的时候,如果用户只修改了标题,那就 update … set title = ? where article_id = ? 不要 set content = ?(大文本)

    (6). 必要的时候用不同的存储引擎。比如 InnoDB 可以减少死锁.HEAP 可以提高一个数量级的查询速度

    2、用 PHP 打印出前一天的时间格式是 2020-3-18 22:21:21

     

    $time=date(‘Y-m-d H:i:s’,strtotime(‘-1,days’))
    echo $time;
    

      

    3、写一段 JS 代码来实现图片的幻灯片形式展示

    <script>
        $(function(){
            //页码
            var page=1;
            //每页显示数
            var total=4;
            //点下一页的时候执行
            $('span.next').click(function(){
                //通过它找到div.v_show
                var $v_show=$(this).parents('div.v_show');
                //通过div.v_show再找到v_content
                var $v_content=$v_show.children('.v_content');
                //v_content找到下面的所有的li
                var $list=$v_content.children('.v_content_list');
                //总条数 li.length得到总条数
                var $li=$list.find('li');
                var $count=Math.ceil($li.length/total);
                var $width=$v_content.width();
                if(page==$count){
                    $list.animate({left:'0px'},500);
                    page=1;
                }else{
                    $list.animate({left:'-='+$width+'px'},500);
                    page++;
                }
                $('.highlight_tip span').eq(page-1).addClass('current').siblings().removeClass('current');
            })
    
            $('span.prev').click(function(){
                //通过它找到div.v_show
                var $v_show=$(this).parents('div.v_show');
                //通过div.v_show再找到v_content
                var $v_content=$v_show.children('.v_content');
                //v_content找到下面的所有的li
                var $list=$v_content.children('.v_content_list');
                //总条数 li.length得到总条数
                var $li=$list.find('li');
    
                var $count=Math.ceil($li.length/total);
    
                var $width=$v_content.width();
    
                if(page==1){
                    $list.animate({left:'-='+(($count-1)*$width)+'px'},500);
                    page=4;
                }else{
                    $list.animate({left:'+='+$width+'px'},500);
                    page--;
                }
    
                $('.highlight_tip span').eq(page-1).addClass('current').siblings().removeClass('current');
            })
        })
    
    </script>
    

      

    4、如何让你来实现一个 SNS 网站的短消息功能,简述一下,你该如何实现.

     

    首先建立数据表,其中字段 uid 与用户表 ID 相关联,字段 sid 与被发送信息的用户相关联,当发送信息时,将内容保存到数据库中,间隔一定时间查询数据库是否有与用户相关连的信息存储,若有与用户相关联的信息就遍历输出出来。

    5、写一个函数,算出两个文件的相对路径

    如:

    $a=’/a/b/c/d/e.php’
    $b=’/a/b/12/34/c.php’
    计算出 $b 相对于 $a 的相对路径应该是../../c/d
    
    $na=explode('/',$a);
    $nb=explode('/',$b);
    $numa=count($na);
    $numb=count($nb);
    $max=$numa>$numb?$numa:$numb;
    for($i=0;$i<$max-1;$i++){
        if($na[$i]!=$nb[$i]){
            $up.='../';
            $path.=$na[$i]."/";
        }}
    echo $relpath=$up.$path;
    

      

    6、请用 PHP 设计一个函数,对学生英语考试得分从高到低排序,输入是所有学生的学号和考试得分,返回排好序的考试得分和对应学生的学好。考试满分为 100,由于判卷要求,得分不会有小数

     

    要求:1 不要使用 qsort 等系统内置排序函数。

    2 请使用你认为最快最优的方式实现该函数并使排序的复杂度最低

     

    <?php
        function quickSort($arr)
        {
            $len    = count($arr);
            if($len <= 1) {
                return $arr;
            }
            $key = $arr[0];
            $left_arr    = array();
            $right_arr    = array();
    
            for($i=1; $i<$len; $i++){
            if($arr[$i] <= $key){
               $left_arr[] = $arr[$i];
            } else {
               $right_arr[] = $arr[$i];
            }
            }
            $left_arr = quickSort($left_arr);
            $right_arr = quickSort($right_arr);
            return array_merge($left_arr,array($key),$right_arr);
        }
    

      

    7、现在有一个 Mysql 数据库表 payment 记录用户购买订单,表结构如下:

    TABLE payment(
        id int unsigned AUTO_INCREMENT,
        user_id int unsigned comment ‘用户id’,
        quantity smallint unsigned comment ‘本次购买产品数量’,
        pay_time timestamp comment ‘购买时间’,
        PRIMARY KEY(id)
    )
    

      

    用户每访问成功付款一笔订单 (从进入到离开), 会增加一条记录,记录用户的 ID (user_id),以及购买的产品数量。比如:1、208,2 //208 这个用户购买 2 个产品

    Insert into payment (user_id,quantity)values(‘***’,’***’)
    

      

    1)请写出一个 SQL 语句挑出用户(id=100)最近购买的 10 条订单。

    Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc;
    

      

    2)请写一个 SQL 语句挑出用户(id=100)最近】购买的第 10 到第 20 条订单 (共 10 个)

    Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc limit 10,10;
    

      

    3) 请写出一个 SQL 语句挑出购买产品数最多的 10 个用户 (user_id) 和对应购买的产品总数。

    Select use_id,sum(quantity) total,pay_time form payment group by use_id order by total desc limit 10;
    

      

    8、请写一个 SQL 语句。输出购买产品数分别等于 1,2,3,4,5,6,7,8,9,10 的用户数量,如果某个数量对应的用户数为 0,可以不输出。

    Select count(id) from payment where quantity in (1,2,3,4,5.6,7,8,9,10) group by quantity
    

      

    面试题系列:

    2020最新PHP面试题(附带答案)

    分享一波腾讯PHP面试题

    2019年PHP最新面试题(含答案)

    Redis 高级面试题 学会这些还怕进不了大厂?

    面试官三年经验PHP程序员知识点汇总

    php面试题之PHP核心技术

    掌握 Redis这些 知识点,面试官一定觉得你很 NB

    当面试官问你:如何进行性能优化?

    PHP 经典面试题集

    更多学习内容请访问:

    腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/a609251438/p/12552387.html
Copyright © 2011-2022 走看看