求PHP面试题急忙

求PHP面试题急忙,第1张

求职的朋友可以看看,不过也不要想着这些就一定有用,有时候工作中的经验也是非常重要的。不过,基本知识点还是非常重要的。至于高阶中的算法问题,如果你不是做特别重要的任务,这些算法你是碰不到的(做网游的除外);高阶中的像册处理,如果你真能处理好了,你单独做一个产品出售也不成问题啊。

1 基本知识点

>

1 mysql *** 作语句环境有两种,1种是函数形式的,如mysql_query,另一种是面向对象形式的如$mysqli = new Mysqli($host,$username,$pwd);,第二种所有 *** 作都是以php 面向对象的形式 *** 作mysql数据的。如mysqli->query('sql');等同于mysql_qeury('sql')

查看服务器是否开启mysqli扩展的方式可以通过<php echo phpinfo() >看是否存在mysqli扩展

2获取插入数据的id方法是mysql_insert_id($query);获取mysqli->insert_id;要获取插入数据id,id必须设置为自动增加模式(auto_increment)

$msyqli = new Mysqli($host,$user,$pwd);

$mysqli->select_db($dbname);

$mysqli->query('set names gbk');

$mysqli->query('insert into tb123(body)values("test")');

echo $mysql->insert_id;

$mysqli->close();

最后,请给点分数,奖励一下啊

你这些语句都不是选择数据库的,标题好像不合适:)

明明那么多句,你问这句话是什么意思,你究竟是指的哪句:)

言归正传,你的程序段是一般数据库 *** 作的基本模板,学懂了这几句以后写什么数据库 *** 作都不难了,我把你这些语句一一注释一下:

$sql="select sum(num) as total_num from vote";

//这一句第一层意思从PHP角度理解,就是定义一个字符串变量,值是引号里面的那些,无论那些字符串是什么命令,此时仅仅是赋值,并不运行

//从MYSQL的角度理解,这是一个数据库命令,获取数据库里面vote表的记录数量,并作为名total_num返回

$result=mysql_query($sql);

//这一句让MYSQL数据库运行变量$sql里面的语句,结果存入$result中

$myarray=mysql_fetch_array($result);

//这一句获取执行结果$result里面的一行返回数据,取到数组$myarray中

$total_num=$myarray["total_num"];

//这一句把数组变量$myarray里面名字叫做total_num的元素赋给变量$total_num

这个问题问得有点模糊,什么叫PHP数据库?应该是PHP *** 作数据库吧。如果是说PHP *** 作数据库的话,那你应该了解如下内容:

1、市面上有哪些数据库。市面上有很多数据库,既有SQL型的数据库,如MySql、SQLSever,也有Nosql型数据库,如Redis、Mongodb

2、PHP可以 *** 作哪些数据库。PHP基本上可以 *** 作市面上的所有数据库。

3、PHP是如何 *** 作数据库的。PHP *** 作数据库是有两种方式,一种是使用PHP中对应数据库的扩展,如 *** 作mysql,PHP可以使用Mysqli扩展;另一种是使用PDO扩展和对应的数据库驱动。

4、这些数据库扩展如何安装启动的。通常一些常见的数据库的扩展PHP源码是有包含的,如PDO、MySql,所以像这种你只需要在安装PHP时,通过设置几个参数来启用就好,但像Redis、Mongodb等这些PHP源码里没有包含,所以在安装好PHP后,你需要先下载这些扩展,然后编译,最后在phpini文件里开启。

5、如何使用PHP代码 *** 作这些数据库。在安装好对应的扩展后,你基本上就可以使用PHP代码 *** 作数据库了,如连接数据库、执行数据库 *** 作、关闭数据库,但具体怎么写,可以参考对应扩展的开发文档,一般文档都有明确说明。

了解了以上几点,你就可以使用PHP *** 作数据库了

Redis与Memcached的区别

传统MySQL+ Memcached架构遇到的问题

实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:

1MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。

2Memcached与MySQL数据库数据一致性问题。

3Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。

4跨机房cache同步问题。

众多NoSQL百花齐放,如何选择

最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的

问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解

决以下几种问题

1少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。

2海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。

3这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。

4Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。

面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。

Redis适用场景,如何正确的使用

前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-

backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用

Memcached,何时使用Redis呢

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

2 Redis支持数据的备份,即master-slave模式的数据备份。

3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。

Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的

key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的 *** 作,Redis根据“swappability =

agelog(size_in_memory)”计

算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以

保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap *** 作的。同时由于Redis将内存

中的数据swap到磁盘中的时候,提供服务的主线程和进行swap *** 作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个

*** 作,直到子线程完成swap *** 作后才可以进行修改。

使用Redis特有内存模型前后的情况对比:

VM off: 300k keys, 4096 bytes values: 13G used

VM on: 300k keys, 4096 bytes values: 73M used

VM off: 1 million keys, 256 bytes values: 43012M used

VM on: 1 million keys, 256 bytes values: 16009M used

VM on: 1 million keys, values as large as you want, still: 16009M used

从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。

这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行

批量 *** 作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程

池的大小,对需要从swap文件中加载相应数据的读取请求进行并发 *** 作,减少阻塞的时间。

如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。

补充的知识点:

memcached和redis的比较

1 网络IO模型

Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述

字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache

coherency和锁的问题,比如,Memcached最常用的stats

命令,实际Memcached所有 *** 作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。

(Memcached网络IO模型)

Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,

对于单纯只有IO *** 作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些 *** 作,单线程模型实

际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

2内存管理方面

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内

存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可

能会被剔除,原因可以参考Timyang的文章:>

你可以按 许_亮 说的那样去做

如果你想导入数据库的文件

第一步,把导出来的SQL文件放在mysql 安装目录下的bin文件夹

第二步,直接CMD 找到mysql的bin文件夹,[bin目录]>mysql -u root -p [你想导入的数据库名]<[想导入的SQL文件],然后回车,输入密码就导入成功

或者,

你可以把个软件放到你的U盘里 Navicat for MySQL 软件,不太懂 *** 作数据库的可以用这个软件

如果你想去面试,最好还是做个网站,上传到空间,这样更有说服力,压根就不要带来带去

PS:按我第一种方法导出的文件自然就放在bin文件夹里了,我打[]是说明,不用加[],第二种用这个软件想导出什么就导出什么,想放哪就放哪

通过sysbench的oltp_read_write测试来模拟业务压力、以此来给指定的硬件环境配置一份比较合理的MySQL配置文件。

环境介绍

硬件配置

软件环境

优化层级与指导思想

优化层级

MySQL数据库优化可以在多个不同的层级进行,常见的有:

SQL优化

参数优化

架构优化

本文重点关注:参数优化

指导思想

日志先行 -- 一个事务能否成功提交的关键是日志是否成功落盘,与数据没有太大的关系;也就是说对写的优化可以表述为各方面的资源向写 *** 作倾斜。

瓶颈分析 -- 通过show global status 的各个计数器的值基本上就能分析出当前瓶颈所在,再结合一些简单的系统层面的监控工具如top iostat 就能明确瓶颈。

整体性能是“读”&“写”之间的再平衡。

以上就是关于求PHP面试题急忙全部的内容,包括:求PHP面试题急忙、用PHP做多项选择题,数据库怎么设计, 代码怎么写....、PHP mysql数据库问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9655209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存