>PHP 프레임워크 >ThinkPHP >역사상 가장 어려운 thinkphp 면접 질문을 만나보세요

역사상 가장 어려운 thinkphp 면접 질문을 만나보세요

coldplay.xixi
coldplay.xixi앞으로
2020-08-10 17:05:264264검색

역사상 가장 어려운 thinkphp 면접 질문을 만나보세요

【관련 주제 추천 : 2020 thinkphp 면접 질문과 답변(전집)

1 문자열 '0'을 쓰고, php와 js에서 각각 Boolean 타입으로 변환하여 합격 여부를 판단합니다. 값은 true 또는 false입니까?

답변:

In php

$a = '0';
$a = (bool) $a;
var_dump($a);

값은 false입니다

In js

공식 설명: 참고: 값 매개변수가 생략되거나 0, -0, null, , false, 정의되지 않음 또는 NaN이면 객체는 false로 설정됩니다. 그렇지 않으면 true로 설정됩니다(false 문자열 포함).

테스트:

<script type="text/javascript">
        var a=&#39;0&#39;;
        if(a){
                alert(1);
        }else{
                alert(0);
        }
</script>  值为true

2. mysql을 최적화하는 데 사용되는 방법과 사용된 도구 및 명령을 간략하게 설명하세요

답변:

1. pgcc(pentium gcc) 컴파일러(http://www.goof.com/pcg/)를 사용하십시오. pgcc를 사용하여 mysql 소스 코드를 컴파일하십시오. 전반적인 성능이 10% 향상될 수 있습니다. 물론, 귀하의 서버가 Pentium 프로세서를 사용하지 않는 경우에는 Pentium 시스템용으로 특별히 설계되었으므로 이를 사용할 필요가 없습니다.

2. 사용하려는 문자 집합으로만 mysql을 컴파일하십시오. MySQL은 현재 전 세계 사용자가 자신의 언어로 테이블에 데이터를 삽입하거나 볼 수 있도록 최대 24개의 문자 집합을 제공합니다. 그건 그렇고, MySQL 설치는 이러한 문자 집합에 따라 다르지만 가장 좋은 옵션은 필요한 문자 집합을 선택하는 것입니다. 예를 들어 latin1 문자 집합을 제외한 다른 모든 문자 집합을 금지합니다:

%>./configure -with-extra-charsets=none [--other-configuration-options]

3. mysqld를 정적 실행 파일로 컴파일합니다. 공유 라이브러리 없이 정적 실행 파일에 mysqld를 추가하면 더 나은 성능을 얻을 수도 있습니다. Mysqld는 구성 중에 다음 옵션을 지정하여 정적으로 컴파일할 수 있습니다.

%>./configure -with-mysqld-ldflags=-all-static [--other-configuration-options]

4. 구성 샘플 성능 향상을 위해 일반적으로 사용되는 구성 명령은 다음과 같습니다.

%>cflags="-o6 -mpentiumpro -fomit-frame-pointer" cxx=gcc cxxflags="-o6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared

5. 올바른 컴파일을 사용하는 것이 중요하지만 이는 성공을 위한 첫 번째 단계일 뿐입니다. 수많은 mysql 변수를 구성하는 것도 서버의 정상적인 작동에서 중요한 역할을 합니다.

mysql을 시작할 때마다 적용되도록 이러한 변수의 할당을 구성 파일에 저장할 수 있습니다. 이 구성 파일은 my.cnf 파일입니다. MySQL은 /usr/local/mysqld/share/mysql/ 디렉터리에서 찾을 수 있는 my.cnf 파일의 여러 샘플을 제공합니다. 파일 이름은 각각 my-small.cnf, my-medium.cnf, my-large.cnf 및 my-huge.cnf이며 헤더에는 구성 파일이 적용되는 시스템 유형을 설명하는 크기 설명이 있습니다.

상대적으로 메모리가 적은 시스템에서 mysql을 실행하고 가끔씩만 사용하는 경우 my-small.cnf는 mysqld에 최소 리소스만 사용하도록 지시하므로 이상적입니다. 마찬가지로 전자 상거래 슈퍼마켓을 구축할 계획이고 시스템에 2g의 메모리가 있는 경우 mysql-huge.cnf 파일을 사용할 수 있습니다.

이러한 파일 중 하나를 활용하려면 필요에 가장 적합한 파일의 복사본을 만들고 이름을 my.cnf로 바꿔야 합니다. 구성 파일의 세 가지 범위 중 하나를 사용하도록 선택할 수 있습니다. 전역: my.cnf 파일을 서버의 /etc 디렉터리에 복사합니다. 이렇게 하면 구성 파일의 변수가 전역적으로, 즉 모든 mysql 데이터베이스에 대해 작동하게 됩니다. 서버의 서버가 효율적입니다.

로컬: my.cnf 파일을 [mysql-install-dir]/var/ 디렉터리에 복사하여 my.cnf가 특정 서버에서 작동하도록 합니다. [mysql-install-dir]은 mysql 설치 디렉터리를 나타냅니다.

user: 특정 사용자에게만 효과를 제한하고 my.cnf를 해당 사용자의 루트 디렉터리에 복사할 수 있습니다. my.cnf에서 이러한 변수를 설정하는 방법은 무엇입니까? 또한 어떤 변수를 설정할 수 있는지.

사용된 변수는 MySQL 서버에서 비교적 공통적이지만 각 변수는 MySQL의 특정 구성 요소와 더 구체적인 관계를 가지고 있습니다. 예를 들어, max_connects 변수는 mysqld 범주로 분류됩니다. 다음 명령을 실행하여 확인할 수 있습니다: %>/usr/local/mysql/libexec/mysqld --help mysqld와 관련된 많은 옵션 및 변수를 표시합니다.

다음 텍스트 줄에서 변수를 쉽게 찾을 수 있습니다.

possible variables for option --set-variable (-o) are

그런 다음 my.cnf에서 해당 변수를 다음과 같이 설정할 수 있습니다.

set-variable = max_connections=100

mysql 서버의 최대 동시 연결 수를 100으로 설정합니다. my.cnf 파일의 [mysqld] 제목 아래에 변수 설정을 삽입해야 합니다.

트랜잭션 보안 dbd berkeley db(dbd) 테이블은 슬리피캣 소프트웨어 회사(http://www.sleepycat.com)에서 개발한 트랜잭션 처리를 지원하는 테이블입니다. 이는 MySQL 사용자에게 오랫동안 기다려온 기능인 트랜잭션 제어를 제공합니다.

트랜잭션 제어는 일련의 명령이 성공적으로 실행될 수 있도록 보장하므로 모든 데이터베이스 시스템에서 매우 중요한 기능입니다.

비트랜잭션 보안 힙 힙 테이블은 MySQL에서 데이터에 액세스하는 가장 빠른 테이블입니다. 이는 동적 메모리에 저장된 해시 인덱스를 사용하기 때문입니다. 또 다른 중요한 점은 mysql이나 서버가 충돌하면 데이터가 손실된다는 것입니다.

  isam isam 테이블은 myiasm이 개발되기 전까지 초기 mysql 버전의 기본 테이블 유형이었습니다. 더 이상 사용하지 않는 것이 좋습니다.

  merge merge是一个有趣的新类型,在3.23.25之后出现。一个merge表实际上是一个相同myisam表的集合,合并成一个表,主要是为了效率原因。这样可以提高速度、搜索效率、修复效率并节省磁盘空间。 

  myiasm 这是mysql的缺省表类型。它基于iasm代码,但有很多有用的扩展。myiasm比较好的原因: myiasm表小于iasm表,所以使用较少资源。 myiasm表在不同的平台上二进制层可移植。 更大的键码尺寸,更大的键码上限。 

指定表类型 你可在创建表时指定表的类型。下例创建一个heap表: 

mysql>create table email_addresses type=heap ( ->email char(55) not null, ->name char(30) not null, ->primary key(email) ); 

bdb表需要一些配置工作,参见http://www.mysql.com/doc/b/d/bdb_overview.html。 

更多的表类型 为了使mysql管理工作更有趣,即将发布的mysql 4.0将提供两种新的表类型,称为innobase和gemeni。 

show 你可能有兴趣知道mysql服务器究竟更了什么,下列命令给出一个总结: 、

mysql>show status; 

它给出了一个相当长的状态变量及其值的列表。有些变量包含了异常终止客户的数量、异常终止连接的数量、连接尝试的次数、最大并发连接数和大量其他有用的信息。这些信息对找出系统问题和低效极具价值。 show还能做更多的事情。它可以显示关于日志文件、特定数据库、表、索引、进程和权限表中有价值的信息。详见mysql手册。 

explain 当你面对select语句时,explain解释select命令如何被处理。这不仅对决定是否应该增加一个索引,而且对决定一个复杂的join如何被mysql处理都是有帮助的。 

optimize optimize语句允许你恢复空间和合并数据文件碎片,对包含变长行的表进行了大量更新和删除后,这样做特别重要。optimize目前只工作于myiasm和bdb表。

5. 一张mysql大数据表有几千万数据,但有一自增id字段,且为主键,要遍历此表的所有数据,写出有效的方法和sql(禁止使用limit n,m)。

答:

案例分析:数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是逐渐,vtype是tinyint,vtype是索引。10万数据的效果。

select id,title from collect limit 1000,10; 基本上0.01秒就OK

select id,title from collect limit 90000,10;                8-9秒完成

select id from collect order by id limit 90000,10;  0.04秒就OK。 为什么?因为用了id主键做索引当然快。

改进方法:select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;;

select id from collect where vtype=1 order by id limit 90000,10; 很慢,用了8-9秒!

vtype 做了索引了啊?怎么会慢呢?vtype做了索引是不错,你直接 select id from collect where vtype=1 limit 1000,10; 是很快的,基本上0.05秒,可是提高90倍,从9万开始,那就是0.05*90=4.5秒的速度了。

分表的方法:

建一个索引表: t (id,title,vtype) 并设置成定长,然后做分页,分页出结果再到 collect 里面去找info 。 是否可行呢?实验下就知道了。

10万条记录到 t(id,title,vtype) 里,数据表大小20M左右。用select id from t where vtype=1 order by id limit 90000,10; 很快了。基本上0.1-0.2秒可以跑完。

其实这样做还是全表扫描,只是因为数据量小,只有10万才快。OK, 来个疯狂的实验,加到100万条,测试性能。

加了10倍的数据,马上t表就到了200多M,而且是定长。还是刚才的查询语句,时间是0.1-0.2秒完成!分表性能没问题?错!因为我们的limit还是9万,所以快。给个大的,90万开始select id from t where vtype=1 order by id limit 900000,10; 看看结果,时间是1-2秒!

怪不得有人说 discuz到了100万条记录就会很慢,我相信这是真的,这个和数据库设计有关!

开始测试结论是: 30万数据,用分表法可行,超过30万他的速度会慢道你无法忍受!当然如果用分表+我这种方法,那是绝对完美的。但是用了我这种方法后,不用分表也可以完美解决!

不分表的方法:

复合索引!search(vtype,id) 这样的索引

select id from collect where vtype=1 limit 90000,10; 非常快!0.04秒完成!

再测试: select id ,title from collect where vtype=1 limit 90000,10; 非常遗憾,8-9秒,没走search索引!

再测试:search(id,vtype),还是select id 这个语句,也非常遗憾,0.5秒。

综上:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!

http://blog.csdn.net/zqtsx/article/details/8929625

6. Mysql有一个联合索引KEY(a,b,c),a为tinyint类型(长度为1),b为mediumint类型(长度为3),c为int类型(长度4)。写出条件where a=1 and c=3所使用到此索引的长度。

答:网上没找到答案。

7. InnoDB引擎中,如何开启一个排它的读写锁。

答:

lock tables test write;         //经过测试启用另一个mysql回话都不能读和写test表,表明此答案是正确的

8. 简述json和jsonp的区别以及优缺点,应用场景。

答:说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用xml来描述,跨域可以通过服务器端代理来解决。

但到目前为止最被推崇或者说首选的方案还是用JSON来传数据,靠JSONP来跨域。

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

9. 以下js代码有什么潜在问题(点击每个div弹出相应的序号)?该如何解决?

     var es=document.getElementsByTagName(‘div’);
     for(var i in es){
          es.onclick=function(){
                alert(i);
          }
     }

答:没找到答案

10. 写一个遍历目录下所有文件以及子目录的函数

答:

<?php
    function traverse($path = &#39;.&#39;) {
    $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
    while(($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目
            $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
        if($file == &#39;.&#39; || $file == &#39;..&#39;) {
            continue;
        } else if(is_dir($sub_dir)) {    //如果是目录,进行递归
            echo &#39;Directory &#39; . $file . &#39;:<br>&#39;;
            traverse($sub_dir);
        } else {    //如果是文件,直接输出
            echo &#39;File in Directory &#39; . $path . &#39;: &#39; . $file . &#39;<br>&#39;;
        }
    }
  }

11.将以下jquery选择符翻译成中文描述:

$(“#d div.cls input[type=text][name^=text_]”);

答:

12. Cookie、session的联系和区别,多台web服务器如何共享session

答:

Session采用键值对 , 也就是说ID存放客户端 , 而值放在服务器端 , 是通过用户的ID去找服务器上对应的值 , 这种方式值放置在服务器端 ,有个时间限制 ,时间到则服务器自动释放.

Cookies则有两种方法 , 一种方法是把值保存在浏览器的变量中 , 当浏览器关闭时结束 , 另一种方法是保存在硬盘中 , 只要时间不过期 , 下次还可使用.

Session 是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也 会失效。

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

共享session的方法:http://blog.csdn.net/heiyeshuwu/article/details/521010

13. 有以下数据

  • $_GET[‘int’] 整数

  • $_GET[‘float’] 浮点

  • $_GET[‘text’] 文本,不需要展示html

  • $_GET[‘content’] 文本,需要展示html

以上数据该各用什么方法过滤并保证安全?数据入库之前需要做什么处理?

14. 写出匹配,除div,span,img以外的任何html标签的正则(不需要匹配子标签)。

15. 写出正则表达式中,以下关键字的含义?

$ +? ^ [^] ?<g1> ?! ?<! ?:

16. 写出多进程并发同时,读写同一文件时,能保证文件内容完整的代码(读写文件的代码)

17. 面向对象中,self与$this的区别是?

答:this是指向当前对象的指针(姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针

18. 写出linux中,查找后缀名为.txt的,且内容包含delete的文件,找出并删除的命令是?

find / -type f -name "*.text" | xargs grep "delete"  -delete

相关学习推荐:thinkphp

위 내용은 역사상 가장 어려운 thinkphp 면접 질문을 만나보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 thinkphp에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제