作为程序员一定要保持良好的睡眠,才能好编程

php面试题全面解析(3)

发布时间:2017-11-20

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79725234



1、用PHP获取当前时间并打印,打印格式:2016-5-10 10:22:10

2、字符串转数组,数组转字符串,字符串截取、字符串替换、字符串查找函数分别是什么?

        


        $str="linux is very much php";


        str_replace("linux","java",$str); 

        echo str_replace(array("linux","php"),array("苹果","song"),$str); 

         echo preg_replace('/linux|php/',"java",$str);

        这就是替换功能



        preg_match_all()

        



        

        $str="/a/b/c/index.html";

        strpos($str,$find) strrpos   preg_match()  preg_match_all

        截取一个路径中的文件部分

        找到最后的/ 出现的位置,然后进行截取  

                        index.html

          找到目录 :截取最后的

                            basename()  /a/b/c

                            dirname()     /a/b/c   

        字符串查找   preg_match() 也可以使用这个   strstr 可以使用这个

        

3、解释一下PHP的类中 protected、public、private、interface、abstract、final、static 的含义

    protected 被保护的属性或方法 本类和子类能访问  外部不能访问。

    public 公开  

    private 私有修饰符  只有本类可以调用 

    interface 接口

    abstract 抽象化的方法或类  没有实现的方法叫抽象方法 

                  接口中只有抽象方法的叫接口

    final  一旦定义不能修改 这是最后一个版本不允许有子类  修饰类和方法的

    

    static 静态方法或属性  属于类并不依赖于类生存 




4、写出下列代码的数据结果

    $date='08/29/2017';     请将这个格式调整成  2017/08/29 显示

    

    两种实现方法:


//请输入你的php代码

    $date='08/29/2017';

    

    /*$_arr=explode("/",$date);

    $_str=$_arr[2]."/".$_arr[0]."/".$_arr[1];

    echo $_str;*/


    $_arr=explode("/",$date); str=$_arr[2]."/".$_arr[0]."/".$_arr[1]

    

    

    正则表达式:    

    //正则

    

      $_preg='/([0-9]+)\/([0-9]+)\/([0-9]+)/';
    
    if(preg_match($_preg,$date)){   
        $_str=preg_replace($_preg,'$3/$1/$2',$date);        
        echo $_str;
    }

        

        11.jpg

5、请写出表中包含 admin 的前10条数据

      select * from web_aa where user like '%admin%' order by id asc limit 10

      这里说到了 前 那么肯定是有一个排序的,对不  因此用到了 order by id asc  前 嘛,对不

    

    

6、解释 左连接  右连接  内连接  索引

             左连接:就是以左边为主导 右侧表没有匹配到的话使用null补充。

             右连接:以右表的表为标准,左表没有匹配到合适的数据以null填充

            内连接:不以任何表为基础,只有有数据显示,没有数据以null填充

            索引:犹如一本书的目录,需要查看哪条数据,则翻看索引找到对应的页码。

        先说明关键字是什么?    如果可以写sql语句,那么就写一条sql语句。

        left join

        right join

        inner join   等同于 join   两个相等

        index

     

        alter table web_a add index indexname("filed_name");

        alter table web_a drop index indexname; //删除索引


        最直接有效的就是索引优化


7、无限分类的实现原理

    

    声明一个方法,根据条件重复无限次的调用本身,达到我们想要的数据效果。


    例如 声明一个方法 显示此文件夹下所有的文件


<?php


    function getFile($path){
		$_files=array();
		if(is_dir($path)){
			$handle=opendir($path);			
			while(($file=readdir($handle))!==false){
				if($file!="." && $file!=".."){
					$_temp=$path."/".$file;
					if(is_dir($_temp)&& filetype($_temp)=="dir"){					 
						$_files[$file]=getFile($_temp);
					}else{
						$_files[]=$file;
					}
				} 
			}			
		}
		return $_files;
	}
	
	$_path=dirname(__FILE__);

	print_r(getFile($_path));
	
	//就是这样就能遍历出此文件夹下所有的文件了,并且以文件夹的形式 展现出来。
	
	
	
	//还是有另外一种需求的  都展现在以个数组中
	
	function getFile($path){
		$_files=array();
		if(is_dir($path)){
			$handle=opendir($path);			
			while(($file=readdir($handle))!==false){
				if($file!="." && $file!=".."){
					$_temp=$path."/".$file;
					if(is_dir($_temp)&& filetype($_temp)=="dir"){
						$_files=array_merge($_files,getFile($_temp));
						//$_files[$file]=getFile($_temp);
					}else{
						$_files[]=$file;
					}
				} 
			}			
		}
		return $_files;
	}

	$_path=dirname(__FILE__);

	print_r(getFile($_path));
	
		


?>


截图01.jpg0


下面这张图是以子类的形式展现的。

截图02.jpg

    

8、写一个函数,尽可能高效的从一个url中获取文件的扩展名

        先看看有没有php内置函数,如果有,就直接用系统中的。

        例如:http://localhost/a/b/c.php?a=123

        请获取文件的扩展名

        

$str="http://localhost/a/b/c.php?a=123#username";
//通过pathinfo的方式获取

$str=parse_url($url);
//print_r($str); //Array ( [scheme] => http [host] => localhost [path] => /a/b/c.php [query] => a=123 [fragment]=username)
print_r(pathinfo($str['path'],PATHINFO_EXTENSION));




9、解释MVC

      PHP开发中经常用到MVC ,MVC 最主要的功能就是视图层与逻辑层分离

      M model 数据模型

      V view 视图层 展现层

      C controller 控制器 逻辑层

       

10、描述一下大流量高并发网站解决方案

        


11、配置选项

        单独让一个文件执行时长超过500s

        set_time_limit(500);

        ini_set();

        ini_get();

       

        开发模式:  设置是否开启错误

        if(DEBUG){

            ini_set("display_errors",on);

        }else{

            ini_set("display_errors",off);

        }


        生产模式

            log_errors on 开启错误日志

            error_log 错误日志记录

            

12、设置post最大提交

        此配置在php.ini 中进行配置

        post_max_size=20M   //post表单最大提交的文件大小      

        file_uploads=on  这是开启文件上传。

        upload_max_filesize=20M  //php最大允许上传文件的大小是 20M  

        max_file_uploads=20   //依次允许上传的文件个数


        以上这几项都是需要进行配置的 否则文件大了就上传不了了。

       

13、设置时区 正八时区

        date_timezone_default_set("Asia/Shanghai"); 正八时区

14、pdo有什么好处

        

        pdo 声明时 options

        

        pdo::mysql_attr_init_command=>"set names utf8"

        pdo::errmode=>pdo::errmode_Exception


        pdo本身可以预防sql注入

        pdo预处理有助于快速操作同一组操作,可加快效率。

        大量重复操作时,提高数据库操作的效率



15、PHP如何接收没有任何参数的post提交

        $http_raw_post_data

        php://input

    先判断是否存在于 HTTP_RAW_POST_DATA  如果没有存在就使用  file_get_contents('php://input');来获取

    

    Content-type:application/json;

    那么PHP端当采用  file_get_contents('php://input'); 或者 $GLOBALS[‘HTTP_RAW_POST_DATA'] 但是这个不建议使用。

  拿到这些值以后,进行json_decode 即可。


    看代码:

$_data=isset($GLOBALS["HTTP_RAW_POST_DATA"])?$GLOBALS["HTTP_RAW_POST_DATA"]:file_get_contents("php://input");


    $GLOBALS['']

    

    存在于这个里面


注意:当设置了 enctype='multipart/form-data' 后,使用 php://input 是获取不到值的,是无效的。








16、请简述一个上传文件是怎么做到的,并编写代码


    上传文件,html中form必须包含 enctype="multipart/form-data" 这个属性,否则不能检测到上传文件

    

        input type='file' name='file'

    

    php  通过 $_FILES 这个变量进行检测 那么就可以通过 $_FILES['file']检测到这个数据


    Array ( [name] => 7.jpg [type] => image/jpeg [tmp_name] => C:\Windows\php8612.tmp [error] => 0 [size] => 10695 )

    

    $extends=strrchr($_FILE['file']['name'],".");   // 得到扩展名;


    然后使用  move_uploaded_file($_FILES['file']['tmp_name'],"./".time().$extends);


    通过上面这几步就能实现一个简单的文件上传。


    截图05.jpg

     


    以上就实现了简单的上传,当然还有目录的创建   如何创建等


17、请解析一个xml文档


    这里使用 simplexml_load_string()  如果获取的是文件 那么就使用  simplexml_load_file()


    截图06.jpg


  $xml=<<<EOT
		<info>
			<name>james</name>
			<age>14</age>
			<address>
				<first>北京</first>
				<second>河北</second>
			</address>
		</info>		
EOT;

  $obj=simplexml_load_string($xml);
  print_r((string)$obj->age);
  echo "<br>";
  print_r((array)$obj->address);





18、请使用curl获取远程文件内容

    

    $curl=curl_init();
        
    
    curl_setopt()
    curl_exec()    
    curl_close()
    
    
    $ch=new curl_init();

    curl_setopt($ch,CURLOPT_URL,"http://aaaa.com");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_POST,true);
    //设置post提交的数据
    curl_setopt($DATA_POST, CURLOPT_POSTFIELDS, $post); 
      
    $_data=curl_exec($ch);
    curl_close($ch);
    return $_data;
    
    
    CURLOPT_USERAGENT
    
    CURLOPT_FILE	设置输出文件,默认为STDOUT (浏览器)。
    CURLOPT_INFILE	上传文件时需要读取的文件。
    
  
    
    CURLOPT_HTTPHEADER  设置请求头信息
    
    CURLOPT_CONNECTIONTIMEOUT  连接时长
    
    CURLOPT_TIMEOUT  允许 cURL 函数执行的最长秒数。
    
    CURLOPT_POST     设置为true的时候,  post提交 
    CURLOPT_POSTFIELDS
    
    CURLOPT_COOKIE  设置cookie    array("name"=>123,"b"=>"333"); 那么使用 implode("; ",$_arr);   多个cookie值使用 分好+空格 分割   
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());




19、计算出$b相对于$a的相对路径

        $a=/a/b/c/aa.php

        $b=/a/b/d/bb.php

        使用函数得出  $b 相对于 $a 的路径为  ../../c/aa.php

        使用函数得到:


20、获取php使用的内存

        memory_get_usage()


21、如何使用session

        session_start();


22、使用ob

        ob_start()


        ob_get_contents

        

        ob_flush(); 清空session


        ob_end();


        

23、请说出5种以上的设计模式

        

        单例模式、工厂模式、策略模式、注册树模式、        



24、你觉着你的优点是什么,缺点是什么?

        

        对时间管理不够准确 ,缺少项目管理经验  、

        学习比较努力,今天不会没有关系,明天就会了。


25、nginx你使用几个模块

       mod_rewrite

      

        给一个连接地址吧,看看

https://blog.csdn.net/Michaelwubo/article/details/81201020



26、cookie的限制是多少?

        4Kb

        cookie的个数,各个浏览器不尽相同 ,有30个  、50个

        所有浏览器中的cookie超过大小后,会被忽略,不写入cookie



26、三次握手和四次挥手每次传递包的名字?


        三次握手 :  SYN   ACK

        四次挥手: FIN  ACK



27、请说说你用过的几款PHP模板?分别是什么?

        smarty   Twig  xTtemplate

        



        smarty

        smarty是一个基于PHP开发的PHP模板引擎。它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。


        Template Lite
Template Lite是一个非常快而且很小HTML模板引擎。该引擎支持Smarty模板引擎所具有的大部分功能和过滤器。


        XTemplate
XTemplate是一个适用于PHP的模板引擎。它允许把HTML代码与PHP代码分开存储。XTemplate包含了许多有用的功能比如嵌套的程序块,各种类型的插值变量。其代码非常简洁并且是最优化的。


        phemplate
phemplate是一个简单而且快速的PHP模板引擎。它允许在模板中加入变量和一些动态程序块包括循环。该模板引擎能够可以实现表现与逻辑相分离,也就是说你可以从PHP脚本中抽出所有HTML内容。设计人员可以随意更改HTML而不用担心弄乱你的PHP脚本。

        Dwoo
Dwoo是一个PHP5模板引擎。兼容Smarty模板,它在Smarty语法的基础上完全进行重写。支持通过插件扩展其功能。


        Sugar
Sugar是一个类似于Smarty的模板引擎,拥有一个简洁和易于理解的语法。


        Twig
Twig是一个灵活,快速,安全的PHP模板语言。它将模板编译成经过优化的原始PHP代码。Twig拥有一个砂箱模型来评估不可信的模板代码。Twig由一个灵活的词法分析器和语法分析器组成,可以让开发人员定义自己的标签,过滤器并创建自己的DSL。

        Blade
Blade是Laravel框架下的一种简单又强大的模板引擎。Blade 非常快,因为仅使用了少量的正则表达式来为你的模板编译成原始PHP代码。不同于控制器布局,Blade模板引擎由模板继承和模板片段驱动。所有的Blade模板文件必须使用Blade.blade.php文件扩展名。


28、操作表的约束有哪些?

        完整性约束

        非空约束

        主键约束

        唯一约束

        外键约束


29、为什么使用索引?

        索引可以提高检索速度。        


30、mysql有几种索引?

        普通索引    index

        唯一索引    unique index

        单列索引    

        复合索引

        全文索引    fulltext index

       

        desc tableName 查看索引的情况。



索引的创建有利有弊,创建索引可以提高访问速度、但过多的创建索引则会占据大量的磁盘空间。因此创建索引之前,必须权衡利弊。

31、什么情况下适合建立索引?

        1、经常被查询的字段、即在where字句中出现的字段

        2、分组的字段,即在group by 字句中出现的索引

        3、存在依赖关系的子表或父表的联合查询,即主键或外键

        4、唯一性约束的字段

        SQL:

         CREATE TABEL  web_user(

            id int,

            name varchar(30),

            age tinyint default 0,

            index indexName(id)

        );

        创建web_user 表,并建立索引 indexName  的一个索引  作用在 id 上


            


        不适合建立索引的条件?

        1、查询很少被使用到的字段

        2、很多重复值的字段

        

32、检查一条sql语句运行情况,在mysql中使用什么命令?

        explain  sql语句

        进行查看


33、请写出创建索引的三种方式

        1、  CREATE TABEL  web_user(

            id int,

            name varchar(30),

            age tinyint default 0,

            index indexName(id)

        );

        2、    CREATE  INDEX indexName ON web_user(id);

        3、    ALTER TABLE web_user add index indexName(id)


drop index indexName ON web_user       



70.jpg




34、如何得到url中访问扩展名  

    

 $_url="http://localhost/a/b/c.php?a=123";
 $_data=parse_url($_url); 
 print_r(pathinfo($_data['path'],PATHINFO_EXTENSION));
 echo "<br>";

  

   这个简单了 $_SERVER['HTTP_HOST'];   得到域名

    


    

35、PHP如何创建目录


    mkdir("file",0777);权限  777


    mkdir("file/a/b/c",0777,true);   如果有的文件夹不存在,系统递归创建,不会报错。    

截图04.jpg

    

36、文件限速下载


    实现原理就是  fopen一个文件,然后 while循环 feof()  是否到了文件最后,如果没有继续循环

    通过 print fread($file,round($download_rate*1024)) 限制速度   并且实时响应到浏览器 flush()  

    sleep(1) 中间休息一下


    就是这样保存下来一个文件的

    $local_file = 'file.zip';
    $download_file = 'name.zip';
    $download_rate = 20.5; //最快速度不超过20.5kb  
    if(file_exists($local_file) && is_file($local_file)){
        header('Cache-control: private');
        header('Content-Type: application/octet-stream');
        header('Content-Length: '.filesize($local_file));
        header('Content-Disposition: filename='.$download_file);
        flush();
        $file = fopen($local_file, "r");
        while(!feof($file)){
            // send the current file part to the browser
            print fread($file, round($download_rate * 1024));
            // flush the content to the browser
            flush();
            // sleep one second
            sleep(1);
        }
        fclose($file);
    }else{
        die('Error: The file '.$local_file.' does not exist!');
    }


  37、抽象类和接口的区别

    抽象类定义使用 abstract 定义

    抽象类中必须有一个方法是抽象方法,费抽象类不能包含抽象方法 

    抽象类不能被直接实例化,必须有他的子类继承,然后再实例化

    如果类方法被声明成抽象的,那么其中就不能包含具体的功能实现。

    继承一个抽象类,子类必须实现抽象类所有的抽象方法。


    接口声明定义使用interface

    其中定义的方法都是空方法

    方法没有声明关键字时候都是public的 可省略关键字 public

    接口可以继承其他接口,接口可以多继承   extends

    

    类与抽象类之间是继承关系    类与接口之间是实现关系

    类与抽象类是单继承   类与接口之间是多实现

    抽象类是一个类

    接口不是类,而是约束类的结构


   38、静态延迟绑定 self和static的区别

        

        self:: 代表本类,永远代表本类,因为在类编译时已经被确定

        即子类调用父类方法,self却不代表调用的子类,static:: 代表本类


//
abstract class Animal{
    
    
    public function eat($str);
    
    public function say($str){
        echo $str."<br>";
    }
}

class Cat extends Animal{
    
    public function eat($str){
        echo "猫在吃".$str."<br>";            
    }

}

  

39、mysql看的like语句是否会使用索引?

一、在使用like的时候,如果使用‘%%’,不会使用索引

二、在后边跟上% 会使用索引

三、在前边加上% 不使用索引



40、栈和堆


栈(又名堆栈)先进后出,内存存储于一级缓存中,使用完后,立即释放


堆先进先出 类似说链表,内存存储于二级缓存中,使用完后,没有立即释放,而是等待 os 垃圾自动回收机制处理。


https://jingyan.baidu.com/article/6c67b1d6a09f9a2786bb1e4a.html


41、看看下面输出的结果:


$b=array('1','1');


foreach($b as $key=>$v){

$v=2;

}


print_r($b);


结果:

Array

(

    [0] => 1

    [1] => 1

)



echo "\n--------------------------------------\n";

$b=array('1','1');


foreach($b as $key=>$v){

$b[$key]=2;

}


print_r($b);


结果:

Array

(

    [0] => 2

    [1] => 2

)




1.函数内部 static 和 global 关键字的作用,如:


function foo()

{

    static $a = 111;

    global $b;

}

2.子类重写父类的 protected 方法有什么限制?或者说有什么要遵守的规则?


3.PHP文件末尾是否应该加 ?> 结束符号,为什么?


4.谈一谈 PHP 开源框架 CI,ThinkPHP,Laravel 的优缺点及选型依据


5.Memcache 和 Redis 的读写性能(qps)如何?两者优缺点?Redis 支持哪些数据类型?Redis 如何持久化?


memcache更加快速,在读取性能上比 Redis 快,缺点是仅支持字符串。

Redis支持丰富的数据结构类型,字符串,散列(哈希),集合,有序集合,还支持订阅发布,地理位置等等。

实际运用中可以redis,memcache结合,memcache可作为session存储的方式,session都是KV类型键值对。


6.使用 PHP 下载网络图片,有哪些方法?

file_get_contents

fopen

curl

以上三种方式和方法



7.什么是 CGI?什么是 FastCGI?php-fpm,FastCGI,Nginx 之间是什么关系?

cgi是 common gateway interface 通用网关接口,用于web服务器与应用程序的交互,定义了输入和输出的规范。

fastcgi是cgi的高级版本,是一种进程管理器,在进程处理上做了很大的改进。php-fpm是实现了fastcgi的php进程管理器,

nginx接收到请求,交给php-fpm、通过php进行处理,这既是这几种之间的联系。


8.什么是 CSRF 攻击 ?XSS 攻击?如何防范?


XSS跨站脚本攻击

XSS跨站脚本攻击指攻击者在网页中嵌入客户端脚本(例如JavaScript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的,比如获取用户的Cookie,导航到恶意网站,携带木马等。

如何防止XSS跨站脚本攻击:

原则:不相信用户输入的数据

  1. 将重要的cookie标记为http only,这样的话Javascript 中的document.cookie语句就不能获取到cookie了

  2. 只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字,而数字之外的字符都过滤掉

  3. 对数据进行Html Encode 处理。< 转化为 &lt;、> 转化为 &gt;、& 转化为 &amp;、' 转化为 '、" 转化为 &quot;、空格 转化为 &nbsp;

  4. 过滤或移除特殊的Html标签。例如:<script>、<iframe>、&lt; for <、&gt; for >、&quot for

  5. 过滤JavaScript 事件的标签。例如 “onclick=”、”onfocus” 等等 
    很多浏览器都加入了安全机制来过滤XSS

    注意:攻击代码不一定在<script></script>


CSRF跨站请求伪造

CSRF(XSRF)尽管听起来很想XSS跨站脚本攻击,但是它于XSS完全不同。XSS是利用站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的站点。与XSS相比,CSRF攻击不大流行和难以防范,所以比XSS更具危险性。

如何防止CSRF跨站请求伪造:

  1. 对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field)。

  2. “双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。如果某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。什么叫限制跨域规则呢?限制跨域规则就是:如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取cookie的。上面那个例子的受信任域就是银行网站的某个域,而Mallory发给Bob的链接不是受信任的域。

  3. 使用Post代替Get。Post方式不会在web服务器和代理服务器日志中留下数据尾巴,然而Get方式却会留下数据尾巴。

  4. 以上三点都是正对web站点的防御手段,第4点是从用户的角度的防御手段。通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie来防止CSRF攻击。




9.列举常用的设计模式并说明?单例模式,观察者模式等等


10.写一段代码,实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知。

123.png


观察者模式的应用,使用代码示例说明。

对象的一种一对多的关系,当依赖的对象状态发生改变时,所有依赖它的对象都得到通知并被自动更新。

观察者模式又称发布订阅模式。

1.抽象主体(Subject)角色:主体角色将所有对观察者对象的引用保存在一个集合中,每个主体可以有任意多个观察者。 抽象主体提供了增加和删除观察者对象的接口。主体也就是被观察者。

2.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主体发生改变时更新自己。

3.具体主体(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主体的内部状态改变时,给所有登记过的观察者发出通知。具体主体角色通常用一个具体子类实现。

4.具体观察者(ConcretedObserver)角色:存储一个具体主体对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致。



43、页面ajax请求时,设置了header头,设置  Access-Token ,问在http中怎么获取 Access-Token的值?

headers: {             
            'Access-Token':123456
         },

             

         这个header头 这样传递以后  在 PHP $_SERVER 中的值是 $_SERVER['HTTP_ACCESS_TOKEN'] 自动转换成这样了,切记





var_dump(1==="1");


// $data="23/08/2016";


// $pattern='/(\d+)/\(\d+)/\(\d+)/';


// if(preg_match($pattern,$data)){

// echo 1;

// }

// 

// 




24.你负责的模块有哪些难题?


答:在我负责的B2B电商项目中,当时我负责的是订单模块,由于客户一次选择了多家商户的商品,最终生成了一个订单,这样我们平台在给商户结算时出现了不知道这比费用应该给哪个商户,这时候我们小组经过讨论,需要涉及到订单拆分,也就是说用户点击支付后,如果有多件商品,并且不是同一家店铺那么 就要用到订单的拆分,比如如果有两件商品,并且不是同一店铺 就在原来的订单号下 在生成两个子订单号 并修改订单表中两件商品的订单号。最终实现了商品的分配管理,解决了我们的难题。


我觉得在开发过程中,遇到的难题无非是两个,一个是技术层次的,我认为,只要你有恒心,有热心,没有觉得不了的难题。另一个就是沟通问题,在任何地方任何时候沟通都是最重要的,尤其是我们做开发的,不沟通好,会影响整个项目的进度,我本人是个非常还沟通的人,所以这点上也没多大问题。



27.接口安全方面是怎么处理的?


答:我们当时是这么做的,使用HTTP的POST方式,对固定参数+附加参数进行数字签名,使用的是md5加密,比如:我想通过标题获取一个信息,在客户端使用 信息标题+日期+双方约定好的一个key通过md5加密生成一个签名(sign),然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的sign和我们通过算法算的值相同,证明是一个正常的接口请求,我们才会返回相应的接口数据。





29.在工作中遇到什么困难?


答:总体来说:在工作我主要遇到这几个问题比较难处理:


①我之前工作的时候发现经常会出现一些临时需求打乱了我的计划,搞得有时候这个任务还没完成,又得去做其他的任务,最后一天下来,大大小小的东西是很多,但是没有完成得非常好的,后面我总结了一下,我会把这些都添加优先级,遇到临时需求,按照优先级重新将已有任务和临时任务进行排版,保证在规定时间内有效率的完成优先级高的任务。


②在做项目需求时候,遇到理解能力欠佳的人,沟通时容易被气到,影响自己的情绪,最后反倒还不能到达需要的效果。后面,每次到这种时候,我一般会借助一些纸质的、更加形象的东西,让双方都认同的、都能明白的一种方式来进行沟通,后面减少了很多不必须的麻烦。大家都知道,对于程序员来说,改需求是一件很痛苦的事情,所以前期的沟通工作很重要。


③还有一件事时,我以前的领导不太懂技术,所以每次出一个新的需求出来,总是要求我们在很短的时间内完成,完不成我们就会被怀疑能力有问题。当然,每个领导都希望自己的员工能够尽快的完成任务,降低成本,提高效率。这时候我会把我们的需求细化,把其中的重点、难点都列出来,做好时间规划,耐心的跟领导沟通,项目每个点的重要性和时间的花费比例,确保在这个规划的时间点内保质保量的完成任务。慢慢的也得到了领导的认可,其实领导也不是一味的不通情理,只要把东西计划好了,以最小的代价换取最高的价值,每个人都是很容易理解得 


35.O2O用户下单,c端下单,如何保证ba端数据一致?


答:O2O为线上和线下模式,O2O模式奉行的是“线上支付+实体店消费”的消费模式,即消费者在网上下单完成支付后,凭消费凭证到实体店消费。 O2O模式是把商家信息和支付程序放在线上进行,而把商品和服务兑现放在线下,也就是说O2O模式适用于快递无法送达的有形产品。数据一致性的问题是O2O行业中最常见的问题,我们可以类似于数据库的主从复制的思路来解决这个问题.O2O有个供应商系统,类似于主服务器,在ç端(从服务器)下单时,数据同步更新到供应商系统端,b,a实时从供应商系统中拉取数据进行同步,比如利用定时任务,定时拉取数据进行同步。

 



 36.Redis如何防止高并发?


答:其实redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。我们使用的时候,可能会出现并发问题,比如获得和设定这一对。Redis的为什么 有高并发问题?Redis的的出身决定 

Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。


同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。


在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。


解决办法


在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。


服务器角度,利用setnx变向实现锁机制。









45.架构类的东西接触过吗?


有接触过,曾经自己在自己的服务器上配置过。我以前做过以下几个架构方面的配置和测试;


1、数据库的读写分离、主从复制及集群。

2、Nginx负载均衡

3、redis集群及主从



53.如何修改会话的生存时间?

一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间

二:代码实现      $ lifeTime = 24 * 3600; //保存一天

    session_set_cookie_params($ lifeTime); 

    在session_start(); 








56.魔术方法、魔术常量?


1。__construct()

实例化对象时被调用,当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。


2。__destruct()

当删除一个对象或对象操作终止时被调用。


3。__call()

对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。


4。__get()

读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。


5。__set()

设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。


6。__toString()

打印一个对象的时被调用。如echo $obj;或print $obj;


7。__clone()

克隆对象时被调用。如:$t=new Test();$t1=clone $t;


8。__sleep()

serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。


9。__wakeup()

unserialize时被调用,做些对象的初始化工作。


10。__isset()

检测一个对象的属性是否存在时被调用。如:isset($c->name)。


11。__unset()

unset一个对象的属性时被调用。如:unset($c->name)。


12。__set_state()

调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。


13。__autoload()

实例化一个对象时,如果对应的类不存在,则该方法被调用。 



魔术常量:


__LINE__

返回文件中的当前行号。


__FILE__

返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。


__FUNCTION__

返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在PHP 4 中该值总是小写字母的。


__CLasS__

返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在PHP 4 中该值总是小写字母的。


__METHOD__

返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。


__NAMESPACE__





[SYSTEMROOT] => C:\Windows



[COMSPEC] => C:\Windows\system32\cmd.exe

[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

[WINDIR] => C:\Windows

[PHP_FCGI_MAX_REQUESTS] => 1000

[PHPRC] => G:/phpstudy/php53n

[_FCGI_SHUTDOWN_EVENT_] => 1756

[FCGI_ROLE] => RESPONDER

[HTTP_HOST] => localhost

[HTTP_CONNECTION] => close

[HTTP_CACHE_CONTROL] => max-age=0

[HTTP_UPGRADE_INSECURE_REQUESTS] => 1

[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

[HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch, br

[HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8

[HTTP_COOKIE] => __guid=111872281.2329970560292131000.1510150540156.861; monitor_count=25

[SystemRoot] => C:\Windows

[SERVER_SIGNATURE] =>

[SERVER_SOFTWARE] => Apache/2.4.10 (Win32) OpenSSL/0.9.8zb mod_fcgid/2.3.9

[SERVER_NAME] => localhost

[SERVER_ADDR] => ::1

[SERVER_PORT] => 80

[REMOTE_ADDR] => ::1

[DOCUMENT_ROOT] => G:/phpstudy/WWW

[REQUEST_SCHEME] => http

[CONTEXT_PREFIX] =>

[CONTEXT_DOCUMENT_ROOT] => G:/phpstudy/WWW

[SERVER_ADMIN] => admin@phpStudy.net

[SCRIPT_FILENAME] => G:/phpstudy/WWW/test/i.php

[REMOTE_PORT] => 52349

[GATEWAY_INTERFACE] => CGI/1.1

[SERVER_PROTOCOL] => HTTP/1.1

[REQUEST_METHOD] => GET

[QUERY_STRING] =>

[REQUEST_URI] => /test/i.php

[SCRIPT_NAME] => /test/i.php

[PHP_SELF] => /test/i.php

[REQUEST_TIME] => 1516798244


问题:

    

$s = str_repeat('abcd',1);
$m=memory_get_usage(); //获取当前占用内存
echo $m."\n";

$a =  &$s;

//$s=null;

unset($a);

$mm = memory_get_usage(); //unset()后再查看当前占用内存
echo $mm . "\n";


$s 是一个变量 


$a 是一个引入$s的变量 前边有 &


如果用 unset($a) 清理掉  那么 $s 的值会变吗?   答案:不会 照样是abcd


如果 unset($s) 清理掉 那么$a 的值会变吗?  答案:不会  照样是abcd


$s = str_repeat('abcd',1);
$m=memory_get_usage(); //获取当前占用内存
echo $m."\n";

$a =  &$s;

$s=null;

$mm = memory_get_usage(); //unset()后再查看当前占用内存
echo $mm . "\n";


var_dump($a);

echo $mm-$m ;
echo "\n";



那么如果使用 $s=null  $a 的值是什么?  答案:Null


如果把 $a=null  那么$s 的值是什么?  答案:Null


以上两个问题:切记一点  直接赋值null  不管有几个指向都是 null


unset() 只要还有一个指向他,那么它的值就保留  只是删除了 一个连接地址



44、请谈谈设计模式的理解,你常用的设计模式有哪几种?



45、写一段简单的程序,抓取url以及提取出页面中所有电子邮箱地址?

//$url='https://www.163.com/';
$url='http://www.cimie.com/';
$content=file_get_contents($url);

$preg='/[\w_]+@([\w]+\.){1,}[\w]{3,4}/i';

//jubao@vip.163.com

if(preg_match($preg,$content)){

    preg_match_all($preg,$content,$result);

    //print_r($result);


    print_r(array_values(array_unique($result[0],SORT_STRING)));

}else{
    echo '没有找到';
}


46、谈谈索引的用途,索引在什么情况下创建?


索引是在检索数据时,快速定位,找到所需数据。


在以下情况创建索引:

1、在经常使用的键值上创建索引,即 where 条件后

2、在group by 后面创建索引

3、在联表查询的键值上创建索引。


47、看看下面代码的输出

$age=44;
$b=$age;
$b=33;
var_dump($age); //44

var_dump($b); //33

------------

$age=44;
$b=&$age;
$b=33;

var_dump($age); //33
var_dump($b); //33


如果换成对象实例,那么会是:

class Student{
    protected $name;
    protected $age;
    public function __construct($name,$age){
        $this->name=$name;
        $this->age=$age;
    }
    public function __set($name,$val){
        $this->$name=$val;
    }
    public function __get($name){
        return $this->$name;        
    }
}
//这是创建一个对象,那么创建原型对象,就是通过clone的方式来创建了
$stu1=new Student("job",14);
//创建原型对象
//$stu2=clone $stu1;

$stu2=$stu1;

$stu2->age=166;

var_dump($stu1);
var_dump($stu2);
var_dump($stu2->age);

/*
结果:

我们看到stu1和stu2 是一样的,没有变化。难道是地址引用,

如果我们把  $stu2=$stu1; 改成 $stu2=&$stu1; 这个更不用说了,和下面的结果是一样的。 

 D:\phpStudy\WWW\test\14.php:28:
class Student#1 (2) {
  protected $name =>
  string(3) "job"
  protected $age =>
  int(166)
}
D:\phpStudy\WWW\test\14.php:31:
class Student#1 (2) {
  protected $name =>
  string(3) "job"
  protected $age =>
  int(166)
}
D:\phpStudy\WWW\test\14.php:32:
int(166)*/




深度复制,使用 clone 这是对象的复制,也叫 原型模式





2000行的PHP学习记录

http://www.cnblogs.com/shockerli/p/2000-plus-line-php-notes.html

 

计算机网络之面试常考

http://www.cnblogs.com/zyf-zhaoyafei/p/4716297.html

http://www.cnblogs.com/zyf-zhaoyafei/p/4828358.html#tree2


常用数据结构_排序_查找练习

http://blog.csdn.net/qishouzhang/article/details/47669451    



git学习总结

http://www.cnblogs.com/zyf-zhaoyafei/p/4486220.html



PHP扩展

https://www.zhihu.com/search?type=content&q=PHP



 http://blog.sina.com.cn/s/blog_5a8b8eb80100yqux.html   


http://blog.csdn.net/xcyuzhen/article/details/4640931


http://blog.sina.com.cn/s/blog_5a8b8eb80100z42v.html





php面试题:http://www.jb51.net/article/4857.htm


php逻辑题:https://wenku.baidu.com/view/c05789c4bb4cf7ec4afed061.html


http://www.jb51.net/list/list_67_1.htm