php经典面试题,面试题汇总(二)

三十九·请使用 php编写程序,读取出www.baidu.com的首页的网页内容,并存入字符串$str?
方法一:

$url ="http://www.baidu.com";
$str = file_get_contents($url);
echo $str;

方法二:

$fp = fopen("http://www.baidu.com",'r');
$str = '';
while(!feof($fp)){
    echo $str.=fread($fp,'1024');
}

请用php将上题中读出来的网页内容的<title>标签的值解析出来?

header("Content-type:text/html;charset=utf-8");
$url ="http://www.baidu.com";
$str = file_get_contents($url);

preg_match('/<title>(.+)<\/title>/',$str,$ms);
echo $ms[1];

四十·通过php函数循环遍历出文件夹下的所有目录的文件,写出程序?

$dir = "zt";
function dirList($dir){
    $arr = scandir($dir);
    foreach($arr as $file){
        if($file !='.' && $file !='..'){
            $path = $dir."/".$file;
            if(is_dir($path)){
                dirList($path);
            }else{
                echo "<p>{$path}</p>";
            }
        }
    }
}
dirList($dir);

四十一·linux打印出一个文件夹下的所有目录和文件,编写shell脚本?

vi tree.sh

#! /bin/bash
tree

chomd 777 tree.sh

四十二·什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么?

数据库索引就相当于一本书的目录,就是给数据库中的每张表建立索引,便于检索提高select 效率,加快搜索速度
主键索引就是给每张表的主键设置索引,
唯一索引就是给每张表的唯一值字段设置索引,
主键索引本身就内置唯一索引,
一旦在列里加唯一索引,列里的值就不能重复,
主键索引在检索中比唯一索引快,
一个表只能有一个主键索引,一个表可以有多个唯一索引,
索引的缺点是建立索引需要增加存储空间,空间利用率低,并且数据发生变化时会改变索引资源消耗较大。

四十三·数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案是?

1·查询速度慢,避免全盘扫描,因为全盘扫描会导致大量的磁盘I/O操作,用sphinx来解决,和添加索引。
2·读写过于频繁,使用读写分离操作。
3·数据库压力大,采用分布式数据库负载均衡来解决。
4·memcache缓存。
5·链接数据库使用pdo,或者mysqli,预处理缓存字段。
6·尽量使用MyISAM。
7·建议表的列不要过多,要适当的多用些表。

四十四·通过js实现页面的前进和后退操作?

<a href="javascript:window.history.go(1)">前进</a>
<a href="javascript:window.history.go(-1)">后退</a>

四十五·浏览器ie和非ie浏览器的区分,区别是什么?

<script>
    var val = navigator.userAgent;
    if(val.search('MSIE')>=0){
        alert('ie浏览器');
    }else{
        alert('非ie浏览器');
    }
</script>

四十六·设定网站的用户数量在千万级,但是活跃用户的数量只有1%,如何通过优化数据库提高活跃用户的访问速度?

1·分区。(分活跃用户表和非活跃用户表)
2·分表。(人为分表,需要在php写一段路由层,判断是活跃用户,或者非活跃用户)
3·索引优化

四十七·ajax技术利用了什么协议,简述一下ajax的工作机制?

利用http协议
工作原理:
1·先通过浏览器内置的XMLHttpRequest类产生一个ajax对象,
2·调用ajax对象open方法建立一个与某一个脚本发生通讯的链接
3·设定好传输方式get/post,还要确定是异步还是同步,默认是异步
4·调用ajax的send方法发送请求,发起对php文件的请求
5·通过给ajax绑定状态检测事件,当状态码为4,并且服务器响应码为200时则获取php文件的响应数据。

<script>
function showHint(str)
{
  var xmlhttp;
  if (str.length==0)
  { 
    document.getElementById("txtHint").innerHTML="";
    return;
  }
  if (window.XMLHttpRequest)
  {
    // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
    xmlhttp=new XMLHttpRequest();
  }
  else
  {
    // IE6, IE5 浏览器执行代码
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function()
  {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
    }
  }
  xmlhttp.open("GET","/try/ajax/gethint.php?q="+str,true);
  xmlhttp.send();
}
</script>

四十八·利用php打印出前一天的时间格式是2017-8-10 22:21:50?

echo date('Y-n-d H:i:s',strtotime('-1 day'));

四十九·echo ,print ,print_r的区别是什么?

1·echo 和print是语言结构,print_r是函数
2·echo 可以有多个参数,print,print_r只能有一个参数
3·print()只能打印简单的数据类型变量的值(int ,string)
print_r()可以打印出复杂类型变量的值(数组,对象)
echo 可以输出一个或者多个字符串

五十·能够使html和php分离开使用的模板引擎?

Smarty,template,thinkphp,laravel,yii

五十一·用php写出显示客户端ip与服务器ip的代码?

$_SERVER['SERVER_ADDR'];
$_SERVER['REMOTE_ADDR'];
gethostbyname("www.mobanw.com");

五十二·include,require,include_once,require_once的区别 ?

1·include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误,require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误。
2·include有返回值,而require没有。
3·include_once()会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了,如果有的话就不会再次重复导入。
4·include_once(),require_once()会先检查目标文件的内容是不是在之前就已经导入过了,如果是的话,便不会再次重复导入同样的内容

五十三·如何修改session的生存时间?

方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:

session_start();
//保存一天,session的过期时间是有cookie决定的
$lifetime = 24*3600;
setcookie(session_name(),session_id(),time()+$lifetime,'/');

五十四·写出发帖数最多的十个人的名字的sql语句?,利用下表:
members(id,username,posts,pass,email)

select username,count(id) from members group by username order by count(id) desc limit 10;

五十五·请说明php中传值和传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略,外部不会改变。
按引用传递:函数范围内对值的任何改变在函数外部也能反应出这些修改,外部也可以改变。
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。

五十六·在php中error_reporting这个函数的作用是什么?

设置错误级别,错误信息回报。
错误级别有以下五种:
E_ALL,E_PARSE,E_ERROR,E_WARNING,E_NOTICE

五十七·msyql_fetch_row(),mysql_fetch_assoc(),mysql_fetch_array()之间有什么区别?

msyql_fetch_row()是从结果取出1行索引数组,作为枚举。
mysql_fetch_assoc()获取的是关联数组
msyql_fetch_array()获取的是关联和索引混合的数组

mysql_num_rows($result)取得查询结果集总数

五十八·$a=”abcdef”;请打印出$a中第一个字母?

echo $a{0}或者echo substr($a,0,1);

五十九·写出正则匹配js标签?

$str = <<<script
<div>
    <script src='jquery.js'></script>
    <h1>找出匹配js标签</h1>
    <script>alert(1);</script>
</div>
script;
preg_match_all('/<script(.*)?>.*<\/script>/',$str,$ms);
echo "<pre>";
print_r($ms);

六十·linux服务器常用端口?
21 ftp服务端口
22 ssh服务
23 telnet服务
25 发邮件服务
53 dns服务
80 web服务
110 收邮件服务
443 https服务

六十一·写出一个函数实现字符串翻转?
方法一:

strrev();

方法二:

$str = "abcdefg";
function show($str){
    for ($i=strlen($str); $i>= 0; $i--) { 
        $str2 .= $str{$i};
    }
    return $str2;
}
echo @show($str);

六十二.在hello.txt文件前面追加字符串,往前面写数据?

$str = "h1\n";
$file = 'hello.txt';
$get = file_get_contents($file);
file_put_contents($file,$str .=$get);

六十三.判断用户ip地址是否在192.168.1.100~192.168.1.150范围内?
方法一:

$ip = "192.167.1.110";
$x = ip2long($ip);
$ip1 = "192.168.1.100";
$min = ip2long($ip1);
$ip2 = "192.168.1.150";
$max = ip2long($ip2);
if($x > $max || $x < $min){
    exit("ip不在范围内");
}
echo "ip符合要求";

方法二:

$ip = "192.168.1.120";
echo $pos = strrpos($ip,'.')+1;
$ipleft =  substr($ip,0,$pos);
$ipright =  substr($ip,$pos);
if($ipleft != "192.168.1."){
    exit("ip不在范围内");
}
if($ipright >150 || $ipright <100){
    exit("ip不在范围内");
}
echo "ip符合要求";

六十四·请将2维数组按组 name的长度进行重新排序,按照顺序将id赋值(从1开始)?

$arr = array(
    array('id' => 0,'name' => '323444'),
    array('id' => 0,"name" => 'sgegesssssg'),
    array('id' => 0,'name' => '这是字符串'),
    array('id' => 0,'name' => '101928ss323sssgee323'),
    array('id' => 0,'name' => 'slkgjeoge'),
    array('id' => 0,'name' => '32'),
    array('id' => 0,'name' => '1019283'),
);
foreach ($arr as $val) {
    $long[] = strlen($val['name']);
}
array_multisort($long,$arr);
foreach ($arr as $key => &$val) {
    $val['id'] = $key+1;
}
echo "<pre>";
print_r($arr);

六十五·实现不使用第三个变量,交换$a,$b的值?
方法一:

$a = "linux";
$b ="php";
list($b,$a)=array($a,$b);
echo $a;

方法二:

$a = "linux";
$b ="php";
$b=array($a,$b);
$a=$b[1];
$b=$b[0];
echo $b;

方法三:

$a = "linux";
$b ="php";
$a .= $b;
$b = str_replace($b,"",$a);
$a = str_replace($b,'',$a);
echo $a;

方法四:

$a = "linux";
$b ="php";
$a .= $b;
$b = substr($a,0,(strlen($a)-strlen($b)));
$a = substr($a,strlen($b));
echo $a;

六十六·写出一个Check_ip,使用正则表达式检测一个IPV4的ip是否正确,正确返回1,错误返回0?

$ip="211.0.255.166";
$pmt = "/^(((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))$/";
$num = preg_match($pmt,$ip);
echo $num;

//如果不用正则,php有自带函数判断是否是ip
//判断是否是合法的IPv4 IP地址

$ip="211.0.255.266";
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
    echo "是一个正确的ip";
}else{
    echo "错误的ip";
}

//判断是否是合法的IPv6地址

if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)) {
    echo "是一个正确的ip";
}else{
    echo "错误的ip";
}

六十七·快速排序实现方法?

function quickSort(&$arr){
    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $_size=count($arr);
        for($i=1;$i<$_size;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }elseif($arr[$i]>$k){
                $y[]=$arr[$i];
            }
        }
        $x=quickSort($x);
        $y=quickSort($y);
        return array_merge($x,array($k),$y);
    }else{
        return $arr;
    }
}

$arr = array(12,10,90,7,4);
$arr2 = quickSort($arr);
print_r($arr2);

六十八·设置文件上传大小限制?

1·post_max_size=256M
2·upload_max_filesize=200M

六十九·以下程序每一次循环结束后变量$data的值是什么,程序执行完后,变量$data 的值是什么?

$data = array('a','b','c');
foreach ($data as $key => $val) {
    $val = &$data[$key];
    echo "<pre>";
    print_r($data);
}
echo "<pre>";
print_r($data);

执行结果:
1·abc,
bbc,
bcc
2·bcc

七十·如何创建多级目录?

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

七十一·为了确保多个进程同时写入同一个文件成功,怎么操作?

$fp=fopen('lock.txt','w+');
if(flock($fp,LOCK_EX)) {
    //获得写锁,写数据
    fwrite($fp,"write something");
    //解除锁定
    flock($fp,LOCK_UN);
} else {
    echo "file is locking...";
}
fclose($fp);

七十二·判断一个字符串是否是一个合法日期?

function checkDateTime($data){
    if(date('Y-m-d H:i:s',strtotime($data)) == $data) {
        echo "合法日期";
    } else {
        echo "不是合法日期";
    }
}
$date = "2017-08-31 12:23:35";
checkDateTime($date);

七十三·编写函数取得上一月的最后一天?

date_default_timezone_set("PRC");
function get_last_month_last_day($date = ''){
    if ($date !='') {
        $time = strtotime($date);
    } else {
        $time = time();
    }
    $day = date('j',$time);//获取该日期是当前月的第几天
    return date('Y-m-d',strtotime("-{$day} days",$time));
}
echo get_last_month_last_day();
echo get_last_month_last_day('2017-10-20');

七十四·一群猴子排成一圈,按 1,2,…,n 依次编号。然后从第 1 只开始数,数到第 m 只,把它踢出圈,从它后面再开始数,再数到第 m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入 m、n,输出最后那个大王的编号。(新浪)(小米)这是著名的约瑟夫环问题方案一,使用 php 来模拟这个过程?

方法一:

function king($n,$m){
    $monkey = range(1,$n);
    $i = 0;
    while (count($monkey) > 1) {
        $i +=1;
        $head = array_shift($monkey); //一个个列出最前面的猴子
        if ($i % $m !=0) {
            //如果不是m的倍数,则把该猴子返回尾部,否则就抛掉,也就是出列了
            $arr = array_push($monkey, $head);
        }
    }
    //剩下的最后一个就是大王了
    return $monkey[0];
}
king(10,7);

方法二:

function king($n, $m){
    $r= 0;
    for($i = 2; $i <= $n; $i++){
        $r = ($r+$m) % $i;
    }
    return $r+1;
}
echo king(10,7);

七十五·写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数?

//二维数组排序, $arr 是数据,$keys 是排序的健值,$order 是排序规则,1 是降序,0 是升序
function array_sort($arr, $keys, $order=0) {
    if(!is_array($arr)) { 
        return false;
    }
    $keysvalue = array(); 
    foreach($arr as $key => $val) {
        $keysvalue[$key] = $val[$keys];
    }
    if($order==0){
        asort($keysvalue);
    } else { 
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
        $keysort[$key] = $key;
    }
    $new_array = array(); 
    foreach($keysort as $key => $val) {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}
//测试
$person = array(
            array('id' => 2, 'name' => 'zhangsan','age' => 23),
            array('id' => 5, 'name' => 'lisi', 'age' => 28),
            array('id' => 3, 'name' => 'apple', 'age' => 17)
);
$result = array_sort($person,'name',0); 
print_r($result);

七十六·我们希望开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?

$card_num=54; //牌数
function wash_card($card_num){
    $cards=$tmp=array();
    for($i=0;$i<$card_num;$i++){
        $tmp[$i]=$i;
    }
    for($i=0;$i<$card_num;$i++){
        $index=rand(0,$card_num-$i-1); 
        $cards[$i]=$tmp[$index]; 
        unset($tmp[$index]);
        $tmp=array_values($tmp);
    }
    return $cards;
}
print_r(wash_card($card_num));
0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到