玩码玩码

关注互联网
关注技术

PHP面试指南<一>

c3fc020794f3065e4910a87795c29ba3_b.jpg

  前一段时间接受了一波面试,结果有好有坏,基本上这些东西大家都能碰到,可能不怎么深入了解罢了,因为我们日常工作是处理事情,并不会深究其所以然,在这里跟大家分享一下有关题目,以备不时之需,之后还会补充,哪里说得不对的或者补充的,敬请留言,欢迎批评指正~~~

1.单引号和双引号的区别

  双引号里面的字段会经过编译器解释,然后再当作HTML代码输出,单引号里面的不进行解释,直接输出。或者可以这么解释,双引号内部变量会解析,单引号则不解析。

2.多用户读写文件

1>一般首先想到的方案就是文件锁,然而在多并发情况下,似乎是经常独占资源,不即时释放,或者是根本不释放,造成死锁.

  $fp = fopen("/tmp/lock.txt", "w+");
    if (flock($fp, LOCK_EX)) {
        fwrite($fp, "Write something heren");
        flock($fp, LOCK_UN);
    } else {
        echo "Couldn't lock the file !";
    }
    fclose($fp);

2>如果flock()我们使用得当,完全可能解决死锁的问题,超时设置为1ms,如果这里时间内没有获得锁,就反复获得,直接获得到对文件操作权为止,当然。如果超时限制已到,就必需马上退出,让出锁让其它进程来进行操作.

if($fp = fopen($fileName, 'a')) {
 $startTime = microtime();
 do {
         $canWrite = flock($fp, LOCK_EX);
  if(!$canWrite) usleep(round(rand(0, 100)*1000));
 } while ((!$canWrite)&& ((microtime()-$startTime) < 1000));
 if ($canWrite) {
   fwrite($fp, $dataToSave);
 }
 fclose($fp);
}

3>不使用flock函数,借用临时文件来解决读写冲突的问题,大致原理如下:
 ①将需要更新的文件考虑一份到我们的临时文件目录,将文件最后修改时间保存到一个变量,并为这个临时文件取一个随机的,不容易重复的文件名。
 ②当对这个临时文件进行更新后,再检测原文件的最后更新时间和先前所保存的时间是否一致。如果最后一次修改时间一致,就将所修改的临时文件重命名到原文件,为了确保文件状态同步更新,所以需要清除一下文件状态。
 ③但是,如果最后一次修改时间和先前所保存的一致,这说明在这期间,原文件已经被修改过,这时,需要把临时文件删除,然后返回false,说明文件这时有其它进程在进行操作。

    $dir_fileopen = "tmp";
    function randomid() {
        return time().substr(md5(microtime()), 0, rand(5, 12));
    }
    function cfopen($filename, $mode) {
        global $dir_fileopen;
        clearstatcache();
        do {
            $id = md5(randomid(rand(), TRUE));
            $tempfilename = $dir_fileopen."/".$id.md5($filename);
        } while(file_exists($tempfilename));
        if (file_exists($filename)) {
            $newfile = false;
            copy($filename, $tempfilename);
        }else{
            $newfile = true;
        }
        $fp = fopen($tempfilename, $mode);
        return $fp ? array($fp, $filename, $id, @filemtime($filename)) : false;
    }
    function cfwrite($fp,$string) { return fwrite($fp[0], $string); }
    function cfclose($fp, $debug = "off") {
        global $dir_fileopen;
        $success = fclose($fp[0]);
        clearstatcache();
        $tempfilename = $dir_fileopen."/".$fp[2].md5($fp[1]);
        if ((@filemtime($fp[1]) == $fp[3]) || ($fp[4]==true && !file_exists($fp[1])) || $fp[5]==true) {
            rename($tempfilename, $fp[1]);
        }else{
            unlink($tempfilename);
      //说明有其它进程 在操作目标文件,当前进程被拒绝
            $success = false;
        }
        return $success;
    }
    $fp = cfopen('lock.txt','a+');
    cfwrite($fp,"welcome to beijing.n");
    fclose($fp,'on');

3.redis数据类型

Redis支持5种数据类型,分别是字符串(string),散列/哈希(hash),列表(list),集合(set),有序集合(zset)。
4.redis和memcache的区别


简单点说就有一下几点,
   1>redis支持出key/value以外的多种数据格式,比如string,set,hash等;
   2>支持持久化存储,可以将内存中的数据同步到硬盘,机器重启后,数据可以从硬盘更新到内存,继续使用
   3>支持数据备份
   4>Redis 单个 value 的最大限制的 1GB , memcached 只能保存 1MB 的数
5.Mysql的存储引擎--MyISAM与InnoDB区别


  MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
  ◆1.InnoDB不支持FULLTEXT类型的索引。
  ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count( * ) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count( * )语句包含 where条件时,两种表的操作是一样的。
  ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
  然而两种类型最主要的差别就是Innodb支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。
  作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。
6.Mysql的索引原则


 (1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。
 (2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
 (3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
7.Memcache优势


 (1)数据只需要进行简单的key-value存储,不需要更多的数据类型;
 (2)数据内容不需要持久化到硬盘;
 (3)在100k以上的数据中,Memcache性能要高于Redis,对于大数据的存储,Memcache还是要占优势一些

未经允许不得转载:玩码 » PHP面试指南<一>

评论 5

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 有什么不对的或者补充的,欢迎批评指正

    linmufeng (2017-09-08) 回复
  2. 前来拜访,~~~~飘过~~~~~飘过~~~!

    冷场王驾到 (2017-10-23) 回复
    • Thank you.

      linmufeng (2018-01-11) 回复
  3. 准备面试phper?

    山野愚人居 (2017-11-30) 回复
    • I'm a phper.

      linmufeng (2018-01-11) 回复