Maison  >  Article  >  cadre php  >  Répondez à la question d'entretien thinkphp la plus difficile de l'histoire

Répondez à la question d'entretien thinkphp la plus difficile de l'histoire

coldplay.xixi
coldplay.xixiavant
2020-08-10 17:05:264221parcourir

Répondez à la question d'entretien thinkphp la plus difficile de l'histoire

[Recommandations de sujets connexes : Questions et réponses de l'entretien thinkphp 2020 (collection complète) ]

1 Écrivez la chaîne '0. ', convertissez le type booléen en php et js respectivement, la valeur est-elle vraie ou fausse ?

Réponse :

en php

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

La valeur est fausse

en js

Description officielle : Remarque : Si le paramètre value est omis ou est 0, -0, null, , false, undefined ou NaN, l'objet est défini sur false. Sinon, il est défini sur true (même avec la chaîne false) !.

Test :

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

2. Décrivez brièvement les méthodes utilisées pour optimiser MySQL ainsi que les outils et commandes utilisés

Réponse :

1. Utilisez le compilateur pgcc (pentium gcc). Ce compilateur (http://www.goof.com/pcg/) est optimisé pour les programmes exécutés sur les systèmes à processeur Pentium. Utilisez pgcc pour compiler le code source MySQL. Les performances globales peuvent être augmentées de 10. %. Bien entendu, si votre serveur n'utilise pas de processeur Pentium, vous n'avez pas besoin de l'utiliser, car il est spécialement conçu pour les systèmes Pentium.

2. Compilez MySQL uniquement en utilisant le jeu de caractères que vous souhaitez utiliser. MySQL fournit actuellement jusqu'à 24 jeux de caractères différents permettant aux utilisateurs du monde entier d'insérer ou d'afficher des données dans des tableaux dans leur propre langue. À propos, l'installation de MySQL dépend de ces jeux de caractères, cependant, la meilleure option est de choisir celui dont vous avez besoin. Par exemple, pour désactiver tous les autres jeux de caractères à l'exception du jeu de caractères latin1 :

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

3. Compilez mysqld dans un fichier exécutable statique La compilation de mysqld dans un fichier exécutable statique sans bibliothèques partagées peut également obtenir de meilleures performances. Mysqld peut être compilé statiquement en spécifiant les options suivantes lors de la configuration.

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

4. couramment utilisé Améliorer les performances :

%>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. Il est important de garantir une compilation correcte, mais ce n'est que la première étape vers le succès. La configuration de nombreuses variables MySQL joue également un rôle clé dans le fonctionnement normal du. serveur.

Vous pouvez stocker les affectations de ces variables dans un fichier de configuration pour vous assurer qu'elles prennent effet à chaque démarrage de mysql. Ce fichier de configuration est le fichier my.cnf. Mysql a fourni plusieurs exemples de fichiers my.cnf, qui peuvent être trouvés dans le répertoire /usr/local/mysqld/share/mysql/. Les fichiers sont nommés respectivement my-small.cnf, my-medium.cnf, my-large.cnf et my-huge.cnf, avec des descriptions de taille trouvées dans l'en-tête décrivant le type de système auquel les fichiers de configuration s'appliquent.

Si vous exécutez MySQL sur un système avec relativement peu de mémoire et que vous ne l'utilisez qu'occasionnellement, alors my-small.cnf est idéal car il demande à MySQLd d'utiliser uniquement le minimum de ressources. De même, si vous envisagez de créer un supermarché de commerce électronique et que le système dispose de 2 Go de mémoire, vous souhaiterez peut-être utiliser le fichier mysql-huge.cnf.

Afin d'utiliser l'un de ces fichiers, vous devez faire une copie du fichier qui correspond le mieux à vos besoins et le renommer my.cnf. Vous pouvez choisir d'utiliser l'une des trois portées du fichier de configuration : global : copiez le fichier my.cnf dans le répertoire /etc du serveur, ce qui fait que les variables du fichier de configuration agissent globalement, c'est-à-dire pour la base de données mysql serveur sur tous les serveurs efficace.

local : copiez le fichier my.cnf dans le répertoire [mysql-install-dir]/var/ pour que my.cnf agisse sur un serveur spécifique. [mysql-install-dir] indique le répertoire d'installation de mysql.

utilisateur : vous pouvez limiter l'effet à des utilisateurs spécifiques et copier my.cnf dans le répertoire racine de l'utilisateur. Comment définir ces variables dans my.cnf ? De plus, quelles variables vous pouvez définir.

Bien que les variables utilisées soient relativement communes au serveur MySQL, chaque variable a une relation plus spécifique avec certains composants de MySQL. Par exemple, la variable max_connects est classée dans la catégorie mysqld. Vous pouvez le découvrir en exécutant la commande suivante : %>/usr/local/mysql/libexec/mysqld --help Elle affiche un grand nombre d'options et de variables liées à mysqld.

Vous pouvez facilement trouver les variables sous cette ligne de texte :

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

Ensuite, vous pouvez définir ces variables dans my.cnf comme suit :

set-variable = max_connections=100

Il définit le nombre maximum des connexions simultanées pour le serveur MySQL est de 100. Assurez-vous d'insérer les paramètres des variables dans le fichier my.cnf sous l'en-tête [mysqld].

La table Transaction Security dbd berkeley db (dbd) est une table qui prend en charge le traitement des transactions, développée par sleepycat Software Company (http://www.sleepycat.com). Il fournit une fonctionnalité très attendue pour les utilisateurs de MySQL : le contrôle des transactions.

Les contrôles de transactions sont une fonctionnalité extrêmement précieuse dans tout système de base de données car ils garantissent qu'un ensemble de commandes peut être exécuté avec succès.

Tas de sécurité sans transaction La table tas est la table la plus rapide de MySQL pour accéder aux données. En effet, ils utilisent un index de hachage stocké dans la mémoire dynamique. Un autre point important est que si MySQL ou le serveur plante, les données seront perdues.

isam La table isam était le type de table par défaut dans les premières versions de MySQL jusqu'à ce que myiasm soit développé. Il est recommandé de ne plus l'utiliser.

  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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer