刷php面试题

mysql中表的存储引擎常用的两种,他们有什么区别?-2019.03.23

  1. 在mysql中一个数据库中可以同时存在多种引擎,存储引擎是针对表的。

  2. 事物

    MyISAM:不支持事物
    INNODE:支持事物
    
  3. 存储空间

     MyISAM:的表存储成3个文件。文件的名字与表名相同,frm文件存储表的结构,MYD文件存储数据,MYI文件存储索引。
     INNODE:所有的表都保存在同一个数据文件中。
    
  4. 表锁差异

     MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁
     InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,
     只是在WHERE的主键是有效的
    
  5. 外键

     MyISAM:不支持
     InnoDB:支持
    
  6. MyISAM和InnoDB两者的应用场景

     MyISAM管理非事务表。它提供高速存储和检索。如果应用中需要执行大量的SELECT查询,那么
     MyISAM是更好的选择。
     InnoDB用于事务处理应用程序,具有众多特性,包括事务支持。如果应用中需要执行大量的INSERT或UPDATE、
     操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
    

php根据二维数组中的某个字段排序?

array_column() 返回输入数组中某个单一列的值
array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。

	public function arrSort()
    {
        $arr = [
            '1' => ['a' => 4, 'b' => 'dfsd', 'c' => 'fdsfs'],
            '3' => ['a' => 3, 'b' => 'dfsd', 'c' => 'fdsfs'],
            '2' => ['a' => 2, 'b' => 'dfsd', 'c' => 'fdsfs'],
        ];
        $a = array_column($arr,'a');  
        array_multisort($a,SORT_ASC,$arr);
        dump($arr);
    }

当需要搜索一个字段为char型时,怎样提高效率?

1. 常用字段建立索引。
2. 尽量避免where语句中对NULL进行判断,否则引擎会放弃索引进行全表扫描。
3. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4. .in 和 not in 也要慎用,否则会导致全表扫描,beteen ,and替代。
5. 尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,union all 或 union 来替代。
6. 尽量避免like %abc%,会导致全表扫描
7. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
8. 避免使用的磁盘临时表,让他在内存中操作。

一个sql, where a=xx and b=xxx 。ac是符合索引,b是普通索引,mysql优先使用哪个索引?

索引使用是根据查询顺序来判断的,先使用a的复合索引,后面使用b的普通索引。
索引在sql优化上,尽量排好条件的优先级,去设计where。

一个装满8L水的瓶子,一个空瓶子5L,一个空瓶子3L,将水分成两个4L?

		8 		0		0
		5		0		3
		5		3		0
		2		3		3
		2		5		1
		7		0		1	
		7		1		0
		4		1		3
		4		4		0

20个编号0-19的同学围成圈,喊口号,每次第m个同学出列,最后还剩那个同学,代码完成逻辑(约瑟夫环)。

function student($arr,$m,$count = 0)
{
    $number = count($arr);
    if($number == 1)
    {
        echo $arr[0].'是最后同学';
        return;
    }else{
        $num = 1;
        while($num++ < $m)
        {
            $count++;
            $count = $count%$number;
        }
        echo $arr[$count].'student.<br>';
        array_splice($arr,$count,1);
        student($arr,$m,$count);
    }
}
$student_arr = [1,2,3,4,5,6,7,8,9,10];
$m = 3;
student($student_arr,$m);
 function yuesefu($n,$m) {  
     $r=0;  
     for($i=2; $i<=$n; $i++) {
         $r=($r+$m)%$i;  
     }
     return $r+1;  
 }  
 echo yuesefu(10,3);

网上比较简单的概率抽奖方法

 function get_rand($arr) {
     $result = '';
     //总概率
     $pro_num = array_sum($arr);
     //循环奖品概率
    foreach($arr as $key => $val)
    {
        //最大概率
        $pro_rand = mt_rand(1,$pro_num);
        //如果小于等于当前概率进入
        if($pro_rand <= $val)
        {
            $result = $key;
            break;
        }else{
            //每次减去当前概率
            $pro_num -= $val;
        }
    }
    return $result;
 }
 $prize_arr = array(
     '0' => array('id'=>1,'prize'=>'平板电脑','v'=>0.1),
     '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
     '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
     '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
     '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
     '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
 );
 $new_arr = [];
foreach($prize_arr as $key=>$val)
{
    $new_arr[$val['id']] = $val['v'];
}
get_rand($new_arr);

计算两个时间相差的天,时,分,秒。

$day1 = '2019-3-1 8:00';
$day2 = '2019-3-28 5:28:22';

$time = (strtotime($day2)-strtotime($day1))%(24*60*60);
$rem_hour = $time%3600;
$rem_minute = $rem_hour%60;
$day = floor((strtotime($day2)-strtotime($day1))/(24*60*60));
$hour = floor($time/3600);
$minute = floor($rem_hour/60);
$second = $rem_minute%60;
echo $day.'天'.$hour.':'.$minute.':'.$second;

HTTP状态码

1xx:临时响应
2xx:表示成功请求状态码
3xx:重定向,表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
4xx:请求错误,这些状态代码表示请求可能出错,妨碍了服务器的处理。
5xx:服务器错误,这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

写出一些php魔幻

__construct() 构造函数:具有构造函数的类会在每次创建新对象时先调用此方法。
__destruct() 析构函数:析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
__call() :在对象中调用一个不可访问方法时。
__callStatic() :在静态上下文中调用一个不可访问方法时。
—set() :在给不可访问属性赋值时。
__get() :读取不可访问属性的值时。
__isset() :当对不可访问属性调用 isset() 或 empty() 时。
__unset() :当对不可访问属性调用 unset() 时。
__toString() :用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。
__invoke() :当尝试以调用函数的方式调用一个对象时。
__clone() :对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

写出一个能创建多级目录的PHP函数

function create_dir($path,$mode = 0777)
{
    if(is_dir($path))
    {
        echo '目录已经存在';
    }else{
        if(mkdir($path,$mode,true))
        {
            echo '创建目录成功';
        }else{
            echo '创建目录失败';
        }
    }
}

请写一段PHP代码,确保多个进程同时写入同一个文件成功

function writeTxt($path)
{
    $fp = fopen($path,'w+');
    if(flock($fp,LOCK_EX))
    {
        fwrite($fp,'hello world/n/r');
        sleep(5);
        flock($fp, LOCK_UN);
    }else{
        echo 'file is locking...';
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值