isset()和empty()函数的区别在于,前者只验证一个值是否存在,后者在此基础上还会检验它的值是否非空和非0注:empty()只检测变量,检测任何非变量的东西都将导致解析错误isset()判断一个变量是否已经设置当设置一个变量值为0,empty()认为这个变量同等于空,即相当于没有设置
可以定义一个变量,设置值为'',0,null,'aaa'几种不同情况下,用if判断empty、isset看看结果
确定是文件夹——打开文件夹(产生dh句柄)——循环读取文件夹内容(读取句柄的内容,即为file/folder)——递归读取上一步判断为folder且文件夹不为'.'或者'..'的文件夹内容
$dir="D:/www/project/";functionreadDirectory($dir){if(is_dir($dir)){//if($dh=opendir($dir)){while(($file=readdir($dh))!=false){if(is_dir($dir.$file)&&$file!="."&&$file!=".."){echo$dir.$file." functionvalid(){$data=$_GET['data'];if(!$data){$res['ret']=1;$res['msg']='fail';echojson_encode($res);}$str=$data['Time'].'+'.$data['param'];if($data['token']!=md5($str)){$res['ret']=1;$res['msg']='fail';echojson_encode($res);}else{$res['ret']=0;$res['msg']='success';echojson_encode($res);}}其实今天笔试的时候做这道题忘了怎么返回json格式的数据了,就直接用了Thinkphp的ajaxReturn,后来回来的时候查了一下才知道原来直接echo,这么简单,框架还是为辅吧,要多写原生。今天笔试的是一家手游公司,对数据库操作和原生要求比较多。 第一种方式:在每个超链接上添加一个PHPSESSID=$sid //防止返回初始页产生新的session if(isset($_GET["PHPSESSID"])){session_id($_GET["PHPSESSID"]);}//启动一个sessionsession_start();//获取当前session的session_id()$sid=session_id();//在每个链接上添加参数PHPSESSID=$sid其他页面的获取方式为:if(isset($_GET["PHPSESSID"])){//设置当前的session为初始的session,session_id()一致即可session_id($_GET["PHPSESSID"])}session_start();第二种方式:使用SID常量替换链接上的PHPSESSID=$sid(SID的值类似:PHPSESSID=sddg34r593dfdlksrewr) 分布式缓存了解一下 notice、warning、error、exception等———————————————— 还有其它常见的就 (7)字符集的转换:客户端或者应用程序使用的字符集可能和数据库使用的字符集不一致,需要在mysql运行过程中隐含转化(8)模糊查询优化:使用FULLTEXT全文搜索(注意前提是MyISAM存储引擎)FULLTEXT解析器用“”(空格)、“,”(逗号)“.”(点号)作为默认的单词分隔符,因此对于不使用这些分隔符的语言如汉语来说,FULLTEXT解析器不能正确的识别单词,对于这种情况需做额外处理。(9)尽量满足范式(有的情况下要用反范式)下面是三大范式的区别,也要去看一下第一范式:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性 第二范式:满足第一范式前提,当存在多个主键的时候,才会发生不符合第二范式的情况。比如有两个主键,不能存在这样的属性,它只依赖于其中一个主键,这就是不符合第二范式 MyISAM强调性能,其执行速度比InnoDB类型更快,但不支持事务,而InnoDB提供事务支持以及外部键、行级锁等高级数据库功能(2)如果增删改操作比较多,或者需要事务支持,则使用Innodb,如果是读的操作比较多,则使用Myisam(3)MyISAM表锁,Innodb行锁 (1)memcached只能使用简单的key-value形式进行存储,而redis还支持hash,list,set等等。因此需要其他的数据类型支持的时候用redis更方便(2)memcached是多核,redis是单核,所以在存储小数据上redis性能更高,反之大数据上memcached的性能比redis要高(3)memcached不支持持久化操作,数据不能备份,只能用于缓存使用,重启后数据全部丢失。redis支持持久化操作可以数据备份和数据恢复(4)redis只能使用单线程,性能受限于cpu性能,memecached是多线程 Atomicity原子性:事务是一个不可分割的工作单位,要么都发生要么都不发生Consistency一致性:必须使数据库从一个一致性状态变换到另外一个一致性状态(即开启一个事务之后不能再开启一个事务,除非提交或者新建一个线程)Isolation隔离性:多个用户并发访问数据库时,数据库为每个用户开启的事务不能被其它事务的操作数据干扰,多个并发事务之间要相互隔离Durability持久性:未commit之前可以回滚,一旦commit对数据的改变就是永久性的事务保存点 可以设置多个保存点savepointa;savepointb;savepointc;但是回退需要按照顺序回退,即如果回退rollbacktob;c保存点就不存在了 ①读未提交(readuncommitted)setsessiontransactionisolationlevelreaduncommitted②读已提交(readcommitted)setsessiontransactionisolationlevelreadcommitted③可重复读(repeatableread)系统默认的隔离级别setsessiontransactionisolationlevelrepeatableread④可串行化(serializable)(独占某个线程的时候使用,直到A程序commit后B程序才能成功update,在那之前是在队列中)setsessiontransactionisolationlevelserializable隔离程度,从上到下越来越强 ①脏读:一个事务读取另一个事务尚未提交的修改②不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集③幻读(虚读):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集 functiongetDepth($arr){ $max_depth=1;foreach($arras$key=>$val){if(is_array($val)){$depth=getDepth($val)+1;if($depth>$max_depth){$max_depth=$depth;}}}return$max_depth;}
";readDirectory($dir.$file."/");}}closedir($dh);}}}readDirectory($dir);>
755rwxr-xr-x代表含义:第一位7等于4+2+1,所以就是rwx,所有者有读取、写入、执行的权限第二位5是4+1,r-x,同组用户具有读取、执行权限,第三位5,代表其他用户有读取、执行的权限。从左至右,1-3位代表文件所有者的权限,4-6位代表同组用户的权限,7-9代表其他用户的权限。
雪碧图cssspirites前端自动构建工具打包图片使用base64编码②启用浏览器缓存和文件压缩
把一些前端资源文件放到cdn中,还可以把数据缓存到cdn节点中cdn原理:④建立独立图片服务器⑤一些不重要的数据,可以做成ajax异步请求,在需要的时候再进行引入、展示,如js、jquery等等
①页面静态化,如smarty②做一些程序上的并发处理,如多线程多进程的异步处理、队列处理等③队列处理
①数据库缓存(memcacheredis等)②分库分表、分区操作
垂直拆分、水平拆分分区③读写分离
把一些服务器、一些数据完全分开一些服务器做读操作(查询)一些服务器做些操作(增删改)④负载均衡⑤索引、高并发安全问题加锁
使用nginx的反向代理来实现负载均衡4.负载均衡七、其他1.遇到问题时怎么解决(错误日志)我回答的时候举了做项目的时候的例子,先缕一下思路。因为后台这一块,只要思路缕清了,在纸上写出来,接下来一步一步去debug,不断var_dump、print_r、echo,最后exit()一下,其实很好debug后来发现面试官想问的其实不是这个,而是错误日志,今天特意去搜了一下,研究了一个下午终于会一点点
首先开启错误日志,配置php.inierror_reporting=E_ALL;将会向PHP报告发生的每个错误,包括ERROR、NOTICE、WARNING等等display_errors=Off;本地测试开启,项目上线要关闭,防止服务器重要信息泄露log_errors=On;开启错误日志log_errors_max_len=1024;设置每个日志项的最大长度error_log=/www/phpernote/error.log;指定产生的错误报告写入的日志文件位置
网页输出的内容:
sql注入:利用用户输入揣测sql语句
解决方案:addslashes、stripslashes函数、预处理绑定xss攻击(跨站脚本攻击):,一种通过嵌入或者发布含有恶意脚本的链接,另一种是通过将恶意脚本提交到被攻击网站的数据库中
解决方案:strip_tags()、htmlspecialchars()、htmlentities()等函数CSRF(跨站请求伪造):利用用户在其它网站的cookie或session伪造请求
解决方案:判断请求ip是不是来自本服务器;上面的防范xss攻击的方法也可以使用mysql数据库备份、主从分离
手动分割线在上面提到的内容,其实有一些可以自己去拓展看一下的,比如提到innodb和myisam,前者是使用行锁,后者是使用表锁,那可以去拓展一下,什么是表锁什么事行锁,逐渐增大自己的知识面
先更新到这,明天还得去招聘会碰壁...2017/03/18
先写到这里。前两天跑了广工招聘会,今天有一家联系明天面试了,继续去撞壁...2017/03/20
七月底裸辞了,顺便考了驾照,潇洒了一阵子。但是辞职时有多洒脱,现在就有多焦虑,找工作还是需要看缘分,不知道以后会不会继续做技术,还是觉得自己对技术没有太多的天分,很多东西还是比较文科生思维,希望能确定一份好的offer吧,期待那一声铃响。2019/10/21