php笔试题_明源云笔试题php - CSDN
精华内容
参与话题
  • 2018记一次面试PHP开发岗笔试题

    万次阅读 2018-04-01 14:49:46
    以下是这家公司的PHP开发岗的笔试题笔试题个人看来不是非常难,但是我做的不好。期望对大家有所帮助!!!1.列举你使用过或者接触过的常用缓存技术。 解:全页面静态化缓存、页面部分缓存、数据缓存、查询缓存、...

    面试杭州复杂美科技有限公司的PHP开发岗位。

    以下是这家公司的PHP开发岗的笔试题,笔试题个人看来不是非常难,但是我做的不好。期望对大家有所帮助!!!

    1.列举你使用过或者接触过的常用缓存技术。

     解:全页面静态化缓存、页面部分缓存、数据缓存、查询缓存、按内容变更进行缓存、内存式缓存、apache缓存模块、php APC缓存扩展、Opcode缓存。(参考链接php缓存技术总结


    2.PHP中防Sql注入,防止Xss攻击常用的解决方案。

    解:PHP中防Sql注入常用的解决方案:使用预处理语句和参数化的查询(参考链接PHP中如何防止SQL注入);

          防止Xss攻击常用的解决方案:1.直接过滤所有的JavaScript脚本;

                                                     2.系统的扩展函数库提供了XSS安全过滤的remove_xss方法;

                                                     3.转义Html元字符,使用htmlentities、htmlspecialchars等函数 


    3.“贵公司尾号1111的账户2月23日17时15分电子汇入收入人民币1.27元,余额850.23元。对方户名:测试。[建设银行]

    以上是一条银行入账短信,请使用正则解析出短信中 公司尾号 日期时间 入款数量 资金余额 以及 对方户名 短信来源银行信息


    解:

    公司尾号对应的正则表达式:'/[0-9]{4}/'
    
          日期时间:‘/\d{1,2}月\d{1,2}日\d{1,2}时\d{1,2}分/’
    
          入款数量:‘/收入人民币(\d{1}\.\d{1,2})/’
    
          资金余额: ‘/余额(\d{1,3}\.\d{1,2})/’
    
          对方户名:'/对方户名:([\u4e00-\u9fa5]+)/'
    
          短信来源银行信息:'/\[([\u4e00-\u9fa5]+)\]/'


    注:正则表达式不是很擅长,有错误希望指正讨论。参考链接(php中正则表达式详解在线正则表达式测试)。


    4.MySQL 数据库中的字段类型 varchar 和char的主要区别是什么?哪种字段的查找效率要高,为什么?


         解:

          “在mySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。

          char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索         操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录       其长度的字节(即总长度为L+1字节)。

          char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使         用char类型。

          定长的char的优势: 
         一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占1个byte用于存储信息长          度,本来打算节约存储的现在得不偿失。

         二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而      且还要占1个长度信息。

         三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有      很多的精力用于计算,而这些对于char来说是不需要的。

        总的说来:char定长,存储效率不如varchar,对于短数据的查询优于varchar”

       参考链接(mysql中char与varchar的区别 哪种字段的查找效率高



    5.从表login中选出name字段包含admin的前10条结果所有信息的sql语句。

    解:Select *from login where name like '%admin%' limit 0,10;


    6.MySQL中Innodb引擎和MyIASM引擎两种引擎的区别。


    解:

    InnoDB引擎

    InnoDB引擎提供了对数据库ACID事务的支持;
    提供了行级锁和外键约束;
    不支持FULLTEXT类型的索引(全文索引);
    没有保存表的行数,因此当SELECT COUNT(*) FROM TABLE时需要扫描全表;

    InnoDB要求表必须要有主键,如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键(这个字段长度为6个字节,类型为长整形)。

    MyIASM引擎

    不提供对数据库事务的支持,也不支持外键和行级锁;
    使用表级锁,所以写操作需要锁定整个表;
    支持FULLTEXT类型的索引(全文索引);
    MyIASM中存储了表的行数,所以当SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描;

    表不一定要有主键。

    参考链接(InnoDB和MyIASM储存引擎的区别


    7.PHP5中魔术方法函数有哪几个?请举例说明各自的用法。

    解:

    魔术方法:

    __construct() :实例化对象时被调用;

    __destuct():当删除一个对象或者对象操作终止是被执行;

    __call():调用对象不存在方法时被调用;

    __get():调用对象不存在的属性时被调用;

    __set():设置对象不存在的属性时被调用;

    __toString():打印一个对象时被调用,比如echo $obj,print($obj);

    __clone():克隆对象时被调用,比如$t = new Test();$tt = clone $t;

    __sleep():serialize之前被调用,若对象比较大,想做一些删除在序列化,可以考虑使用该方法;

    __wakeup():unserialize之前被调用,做些对象的初始化;

    __isset():检测对象是否存在属性的时候被调用,如 isset($c->name);

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

    __set_state():调用var_export时被调用,用__set_state的返回值作为 var_export的返回值;

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


    魔术常量:

    __LINE__:返回当前行号;

    __FILE__:返回文件的完整路径和文件名,如果用在包含文件里面,则返回包含文件名,自 php4.0.2后,__FILE__总是包含一个绝对路径,而在此前的版本有时候会包含一个相对路径;

    __FUNCTION__:返回函数名称(自 php4.3.0新加的)。自php5起本常量返回该函数被定义时的名称,区分大小写,在php4中该值总是小写;

    __CLASS__:返回类的名称,自 php4.3.0新加的,自php5起本常量返回该类被定义时的名称,区分大小写,在php4中该值总是小写的;

    __METHOD__:返回类的方法名。 php5新加的

    参考链接(PHP5中魔术方法函数有哪几个,请举例说明各自的用法


    8.写一个函数,计算数组中最大数和最小数的差。

    解: 这一题的前提应该是数值数组。否则要做很多前提判断。



    9.求2个日期的差数,例如2017-01-01~2017-05-06的日期差数。

    解:

    function($str1,$str2){
      $temp = explode('-',$str1);
      $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
      $temp = explode('-', $str2);
      $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
      return  ($time2-$time1)/86400;
    }


    10.有一个网页地址,比如PHP开发资源主页:http://www.phpres.com/index.html,如何得到它的内容。

       

    
    
    方法1(对于PHP5及更高版本):
    
       $readcontents = fopen("http://www.phpres.com/index.html", "rb");
       $contents = stream_get_contents($readcontents);
       fclose($readcontents);
       echo $contents;
    
    方法2:
    
       echo file_get_contents("http://www.phpres.com/index.html");

    11.实现一个函数,将字符串 “hello_world”转换成  "HelloWorld","hello_hang_zhou"转换成“HelloHangZhou”(注意:通用性)。

    function strHandle($str){
      $result='';
      if(is_string($str)){
          $arr=explode('_',$str);
          foreach( $arr as $val){
           $result.=ucfirst($val);
       }
      }else{
         $result='请输入字符串';
     }
      return $result;
    }

    12.当前系统有个名称 33/look 的目录,请采用广度优先和深度优先2种方式遍历此文件夹。

    注:可以参考二叉树的深度优先遍历和广度优先遍历。

    深度优先遍历:
    function scan_dir($dir) {
        $files = array();
        if(@$handle = opendir($dir)) { //注意这里要加一个@,不然会有warning错误提示:)
            while(($file = readdir($handle)) != = false) {
                if($file != ".." && $file != ".") { //排除根目录;
                    if(is_dir($dir."/".$file)) { //如果是子文件夹,就进行递归
                        $files[$file] = scan_dir($dir."/".$file);
                    } else { //不然就将文件的名字存入数组;
                        $files[] = $file;
                    }
                }
            }
            closedir($handle);
            return $files;
        }
    }
    
    

    广度优先遍历:

    队列实现

          function breadth_first_dir($dir) {
             $files = array();
             $queue = array();
    	 $parentDir=$dir;
    	 array_unshift($queue,$dir);
    	 while(!empty($queue)){
    	    $handle = array_pop($queue);
    	    if($handle!=$parentDir){
    		   $handle=$parentDir."/".$handle;
    		   $parentDir=$handle;
    	     }
    	   if(is_dir($handle)){
    		  if(@$handle = opendir($handle)){
    		    while($file = readdir($handle)) != = false){
    		       if($file != ".." && $file != ".") {
    			array_unshift($queue,$file);
    		       }
    		     } 
    		   }
    	     $files[]=$handle; 
    	     closedir($handle);
    	    }else{	   
    		 $files[]=$handle; 	 
    	     } 
    	   }
            return $files;	  
           }



    微信扫一扫


    展开全文
  • 最新PHP 面试、笔试题汇总(code happy)

    万次阅读 2020-06-30 17:19:26
    一、秒杀(商品超卖,高并发,同一用户多次抢购) 后端:redis+队列 redis队列实现,三个队列(库存队列,排队队列,抢购结果队列) 用户先进入排队队列,先进先出,判断是否已经在抢购结果队列,如果在,则...

    点关注,不迷路。。。。
    持续更新ing

    读在前面:
    面向对象编程和面向对象设计的五个基本原则「SOLID」
    单一职责原则(Single Responsibility Principle)
    开放封闭原则(Open Closed Principle)
    里氏替换原则(Liskov Substitution Principle)
    接口隔离原则(Interface Segregation Principle)
    依赖反转原则(Dependency Inversion Principle)
    1.单一职责原则规定一个类有且仅有一个理由使其改变。换句话说,一个类的边界和职责应当是十分狭窄且集中的。我很喜欢的一句话"在类的职责问题上,无知是福"。一个类应当做它该做的事,并且不应当被它的任何依赖的变化所影响。
    2.开放封闭原则,又称开闭原则,规定代码对扩展是开放的,对修改是封闭的。
    3.里氏替换原则规定对象可以被其子类的实例所替换,并且不会影响到程序的正确性。
    4.接口隔离原则规定,不应该强制接口的实现依赖于它不使用的方法。
    5.依赖反转原则,它规定高层次的代码不应该依赖低层级的代码。换句话说,高层次的代码应该依赖抽象接口,抽象接口就像是「中间人」一样,负责连接着高层次和低层次代码。这个原则的另一层意思是,抽象接口不应该依赖具体实现,但具体实现应该依赖抽象接口

    一、秒杀(商品超卖,高并发,同一用户多次抢购)
    后端:redis+队列
    Redis相关知识点汇总:https://blog.csdn.net/weixin_39815001/article/details/99586988
    redis队列实现,三个队列(库存队列,排队队列,抢购结果队列)
    用户先进入排队队列,先进先出,判断是否已经在抢购结果队列,如果在,则直接下一个,如果不在,将用户信息加入抢购结果队列,库存-1,等待数据库空闲时,将抢购结果写入数据库
    前端:
    面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】
    扩容:加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。
    静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。
    限流:一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。或者活动入口的时候增加游戏或者问题环节进行消峰操作。
    有损服务:在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

    二、订单模块(同一订单,多家商户结算问题)
    订单拆分:用户支付后,将订单拆分,生成子订单

    三、用户下单
    先判断有没有登录
    点击下单,生成唯一订单号,状态为未支付

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

    五、如何处理负载、高并发
    1、HTML静态化
    其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
    2、图片服务器分离
    把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛云
    3、数据库集群和库表散列及缓存
    数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
    4、镜像:
    尽量减少下载,可以把不同的请求分发到多个镜像端。
    5、负载均衡:
    Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
    负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是Nginx、LVS、HAProxy。我分别来说下三种的优缺点:
    ps: 负载均衡 Nginx、LVS、HAProxy

    六、修改会话的生存时间

    1.在php.ini中 设置 session.gc_maxlifetime = 1440 //默认时间
    2.代码实现;
    	$lifeTime = 24 * 3600; //保存一天
    	session_set_cookie_params($lifeTime); 
    	session_start();
    

    七、PHP的垃圾收集机制
    PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间

    八、正则的引擎
    正则引擎主要可以分为两大类:一种是DFA,一种是NFA。
    一般而论,DFA引擎则搜索更快一些。但是NFA以表达式为主导,更容易操纵,因此一般程序员更偏爱NFA引擎!
    可以使用是否支持忽略优先量词和分组捕获来判断引擎类型:支持 NFA,不支持 DFA

    九、对一个大文件进行逐行遍历,如下方法性能较高的是?
    写一个实现了IteratorAggregate 接口的类,通过该类使用foreach遍历。
    (使用 IteratorAggregate 可将文件打开后通过移动指针的方式逐行遍历,不受文件大小影响。使用 file_get_contents 处理大文件很容易导致PHP内存溢出;调用exec 会产生额外的进程,影响性能;其他人写的类库质量不一定高。)

    十、读取文件加锁和解锁

    $fp = fopen("lock.txt","w+");
        if (flock($fp,LOCK_EX)) {
            //获得写锁,写数据
            fwrite($fp, "write something");
            // 解除锁定
            flock($fp, LOCK_UN);
        } else {
            echo "file is locking...";
        }
        fclose($fp);
    

    十一、array_merge() 数组合并函数
    定义:array_merge() 函数把一个或多个数组合并为一个数组。(您可以向函数输入一个或者多个数组。)
    注释:如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。
    如果两个数组都是索引数组,则不会覆盖
    如果您仅向 array_merge() 函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引。
    该函数与 array_merge_recursive() 函数之间的不同是在处理两个或更多个数组元素有相同的键名的情况。array_merge_recursive() 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。
    示例;

    	 $a1=array("red","green");
        $a2=array("blue","yellow");
        $a3=array("CC","DD");
    
        $b1=array("a"=>"sa","b"=>"sb");
        $b2=array("a"=>"qa","b"=>"qb");
        $b3=array("a"=>"wa","c"=>"ww");
        
        print_r(array_merge($a1,$a2)); //Array ( [0] => red [1] => green [2] => blue [3] => yellow )
        print_r(array_merge($a1,$a2,$a3));  //Array ( [0] => red [1] => green [2] => blue [3] => yellow [4] => CC [5] => DD )
        print_r(array_merge($b1,$b2));  //Array ( [a] => qa [b] => qb )
        print_r(array_merge($b1,$b2,$a3));  // Array ( [a] => qa [b] => qb [0] => CC [1] => DD )
        print_r(array_merge($b1,$b2,$b3));  // Array ( [a] => wa [b] => qb [c] => ww )
    

    十二、获取文件扩展名

    //plan A
    function  get_ext(string $url){
    	//$url = 'http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj';
    	$a = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.html [query] => id=1&ajksfg&aakzsdfj )
    	$file = basename($a['path']);  //fg.html
    	$b = explode('.',$file);
    	return array_pop($b);
    }
    //plan B
    function  get_ext(string $url){
    	//$url = 'http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj';
    	$a = basename($url); //fg.html?id=1&ajksfg&aakzsdfj
    	$b = explode('?',$a);;  //Array ( [0] => fg.html [1] => id=1&ajksfg&aakzsdfj )
    	$ext = explode('.',$b[0]);
    	return array_pop($ext);
    }
    

    十三、遍历一个文件夹下的所有文件和子文件夹

    function my_scandir($dir){
    	$files = array();
    	if(is_dir($dir)){
    		if ($handle = opendir($dir)){
    			while (($file = readdir($handle))!= false){
    				if ($file != "." && $file != "..") {
    					if (is_dir($dir."/".$file)){
    						$files[$file] = my_scandir($dir."/".$file);
    					} else{
    						$files[] = $dir."/".$file;
    					}
    				}
    			}
    			closedir($handle);
    			return $files;
    		}
    	}
    }
    

    十四、编写一个函数,递归遍历,实现无限分类

    function tree($arr,$pid=0,$level=0){
    		static $list = array();
    		foreach ($arr as $v) {
    			//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
    			if ($v['parent_id'] == $pid) {
    				$v['level'] = $level;
    				$list[] = $v;
    				tree($arr,$v['cat_id'],$level+1);
    			}
    		}
    		return $list;
    	}
    

    十五、获取上月的最后一天

    function get_last_month_last_day($date = ''){
    		if ($date != '') {
    			$time = strtotime($date);
    		} else {
    			$time = time();
    		}
    		$day = date('j',$time);//获取该日期是当前月的第几天
    		return date('Y-m-d',strtotime("-{$day} days",$time));
    	}
    

    十六、php中WEB上传文件的原理是什么,如何限制上传文件的大小?
    上传文件的表单使用post方式,并且要在form中添加enctype=‘multipart/form-data’。
    一般可以加上隐藏域:,位置在file域前面。
    value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。
    使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。
    限制上传文件大小的因素有:
    客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。
    服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。
    自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。

    十七、双引号和单引号的区别
    双引号解释变量,单引号不解释变量
    双引号里插入单引号,其中单引号里如果有变量的话,变量解释
    双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
    双引号解释转义字符,单引号不解释转义字符,但是解释’\和\
    能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)

    十八、常用的超全局变量
    $_GET ----->get传送方式
    $_POST ----->post传送方式
    $_REQUEST ----->可以接收到get和post两种方式的值
    $GLOBALS ----->所有的变量都放在里面
    $_FILES ----->上传文件使用
    $_SERVER ----->系统环境变量
    $_SESSION ----->会话控制的时候会用到
    $_COOKIE ----->会话控制的时候会用到

    十九、echo、print_r、print、var_dump之间的区别
    * echo、print是php语句,var_dump和print_r是函数
    * echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,因此不能作为表达式的一部分使用
    * print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),如果字符串显示成功则返回true,否则返回false
    * print_r 可以打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,因为都是打印"\n",因此var_dump()函数更适合调试
    * var_dump() 判断一个变量的类型和长度,并输出变量的数值

    二十、对于大流量网站,采用什么方法来解决访问量的问题
    确认服务器硬件是否能够支持当前的流量
    数据库读写分离,优化数据表
    优化SQL语句
    禁止外部盗链
    控制大文件的下载
    使用不同主机分流主要流量
    使用流量分析统计

    二十一、语句include和require的区别
    require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行
    include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去
    注意:包含文件不存在或者语法错误的时候require是致命的,而include不是
    require_once,include_once表示了只包含一次,避免了重复包含

    二十二、php中传值与传引用的区别,并说明传值什么时候传引用
    变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量
    php也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。
    使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)
    对象默认是传引用
    对于较大的数据,可以考虑传引用,这样可以节省内存的开销

    二十三、PHP 不使用第三个变量实现交换两个变量的值

    //方法一
    $a.=$b;
    $b=str_replace($b,"",$a);
    $a=str_replace($b,"",$a);
    
    //方法二
    list($b,$a)=array($a,$b);
    var_dump($a,$b);
    

    二十四、mysql优化
    MySQL查询SQL优化

    二十五、redis 和 memache 缓存的区别
    1.数据类型
    redis支持多种数据类型(5种):hash string list set zset
    memcache 只支持key-value
    2.持久性
    redis 支持两种持久化方式 RDB、AOF
    memcache 不支持持久化
    3.分布式存储
    redis支持master-slave复制模式
    memcache可以使用一致性hash做分布式
    4.value大小不同
    memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
    5.线程模型
    memcache是master+worker的线程模型,其中master完成网络监听后投递到worker线程,由worker线程处理
    redis是单进程单线程模型,即单个线程完成所有的事情
    这两种实现造成下面的差异,即redis更容易实现多种数据结构,类似列表,集合,hash,有序集合等,由于是单线程的,如果单实例部署redis,不能全面用到服务器多核的优势,通常部署时,都会通过多实例的方式去部署
    6.内存管理
    redis:redis没有自己得内存池,而是直接使用时分配,即什么时候需要什么时候分配,内存管理的事交给内核,自己只负责取和释放,直接malloc和free即可。内存管理没有什么特殊的算法,通过使用google的jmalloc库来做内存管理(申请,释放)
    memcache:memcached是有自己得内存池的,即预先分配一大块内存,然后接下来分配内存就从内存池中分配,这样可以减少内存分配的次数,提高效率,这也是大部分网络服务器的实现方式,只不过各个内存池的管理方式根据具体情况而不同。使用了类似linux的内存管理,即slab内存管理方式。
    7.其他
    redis支持事务,频道(发布-订阅),集群;memcache不支持
    ps:https://cloud.tencent.com/developer/article/1004377

    二十六、apche 和 nginx 的优缺
    nginx轻量级,比apache占用更少的内存及资源,抗并发
    nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。
    apache 相对于nginx 的优点:
    rewrite比nginx 的rewrite 强大,少bug,稳定。(需要性能用nginx,求稳定就apache)。

    二十七、一个函数的参数不能是对变量的引用,除非在php.ini中把 allow_call_time_pass_reference 设为on。
    在PHP函数调用的时候,基本数据类型默认会使用值传递,而不是引用传递。allow_call_time_pass_reference 选项的作用为是否启用在函数调用时强制参数被按照引用传递。如果把allow_call_time_pass_reference 配置为on,那么在函数调用的时候会默认使用引用传值。但是不推荐使用这种方法,原因是该方法在未来的版本中很可能不再支持。如果想使用引用传递,那么推荐在函数调用的时候显式地使用&进行引用传递。

    二十八、什么是内存管理?
    内存管理主要是指程序运行时对计算机内存资源的分配、使用和释放等技术,内存管理的目标是高效、快速地分配内存同时及时地释放和回收内存资源。内存管理主要包括是否有足够的内存供程序使用,从内存池中获取可用内存,使用后及时销毁并重新分配给其他程序使用。
    在PHP开发过程中,如果遇到大数组等操作,那么可能会造成内存溢出等问题。一些常见的处理方法如下:
    1)通过ini_set(‘memory_limit’,‘64M’)方法重置php可以使用的内存大小,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置。注:在safe_mode(安全模式)下,ini_set会失效。
    2)另一方面可以对数组进行分批处理,及时销毁无用的变量,尽量减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。同时对于数据库、文件操作完要及时关闭,对象使用完要及时调用析构函数等。
    3)及时使用unset()函数释放变量,使用时需要注意以下两点:
    ① unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。
    ② 只有当指向该变量的所有变量都销毁后,才能成功释放内存。

    二十九、Memcache的特征和特性
    1)协议简单。
    2)基于libevent的事件处理。
    3)内置内存存储方式。
    4)Memcached不互相通信的分布式。
    (1)单个item 最大的数据为1MB。
    (2)单进程最大的使用内存为2GB,需要更多内存时可开多个端口。
    (3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。
    (4)键长最大为250字节。

    三十、共享Session的方式
    1)基于NFS的Session共享。NFS(Network File System)最早由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其他服务器的本地session目录即可。
    2)基于数据库的Session共享。
    3)基于Cookie的Session共享。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。
    4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的key + value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前能达到2000/s平均查询,并且服务器CPU消耗依然不到10%。

    三十一、memcache或redis雪崩如何解决?
    造成原因:通常,在一个网站里,mysql数据库处理的请求比较少(20%),负载80%,缓存技术处理大多数请求(80%)
    如果memcache或redis挂掉,所有请求都会在mysql处理,数据库的处理能力不足会直接宕机。这时候就算重启缓存和mysql也是无济于事的,因为缓存重启后,数据已经丢失,数据请求还是会走mysql,mysql还是会死掉(死循环)
    解决方法:
    缓存预热
    1:先启动缓存,再启动数据库。(但是此时不提供对外服务)
    2:通过一个PHP脚本把常用的key写入缓存中
    3:开放对外服务【热点数据已经缓存,请求会被缓存处理,减轻mysql压力】

    三十二、Redis持久化的方式?
    1.Aof(append only file)
    redis执行命令时,会把我们执行的命令通过日志形式进行追加。安全性高,但是影响性能。
    2.Rdb
    按照制定规则进行持久化
    save 900 1 (900s内1次redis操作 会做一次持久化)
    save 300 10 (300s内10次redis操作 会做一次持久化)
    save 60 10000 (60s内10000次redis操作 会做一次持久化)
    但是可能会存在数据丢失,比如:12:00做过一次持久化,正常的话,12:15会再做持久化,如果12:14缓存死掉,那么14分钟的数据会丢失。不大安全,但是性能比aof好很多

    三十三、Linux系统中,进程间通信的方式。
    管道:
    管道分为有名管道和无名管道
    无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
    有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    消息队列:
    消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.
    信号:
    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.
    信号量:
    信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.
    共享内存:
    共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.
    socket:
    可用于不同及其间的进程通信
    文件,互斥量等,不过我在swoole源码中看到了通过eventfd这种方式做进程通信的

    三十四、HTTP Header 详解

    三十五、TCP 三次握手和四次挥手

    三十六、 Select、Poll、Epoll
    大话 Select、Poll、Epoll

    三十七、海量数据处理相关总结
    1、海量日志数据,提取出某日访问百度次数最多的那个IP。
    算法思想:分而治之+Hash
    IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理
    可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址
    对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址
    可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP
    2… PS:https://blog.csdn.net/v_JULY_v/article/details/6279498

    三十八、两台mysql服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的
    不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
    如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。
    备机的数据不一致怎么办?
    你要勇敢怼回去,你们每秒多少写入操作。按照百万级表,每秒1000的写入效率,正常的设计是,分布在2台机器上每台500。这个级别的数据同步,出现差异的概率 可以忽略不计的。有一台出现问题,另一台也可以抗住。

    三十九、redis是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办
    redis 集群主从同步的简单原理
    Redis的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生
      当Slave启动并连接到Master之后,它将主动发送一个SYNC命令( 首先Master会启动一个后台进程,将数据快照保存到文件中[rdb文件] Master 会给Slave 发送一个
    Ping命令来判断Slave的存活状态 当存活时 Master会将数据文件发送给Slave 并将所有写命令发送到Slave )。Slave首先会将数据文件保存到本地之后再将数据加载到内存中。
      当第一次链接或者是故障后,重新连接都会先判断Slave的存活状态再做全部数据的同步,之后只会同步Master的写操作(将命令发送给Slave)
    问题:
      当 Master 同步数据时 若数据量较大 而Master本身只会启用一个后台进程 来对多个Slave进行同步 , 这样Master就会压力过大 , 而且Slave 恢复的时间也会很慢!
    redis 主从复制的优点:
    (1)在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供
    读服务从而提高了响应和读取速度。
      (2)在一个Redis集群中,如果master宕机,slave可以介入并取代master的位置,因此对于整个Redis服务来说不至于提供不了服务,这样使得整个Redis服务足够安全。
      (3)水平增加Slave机器可以提高性能

    四十、如何解决跨域
    JSONP
    添加响应头,允许跨域
    代理的方式

    四十一、写出以下输出

    Q: "aa" == 1, "aa" == 0, 1 == "1", 1==="1", "12asdsad" + 1, "asdjkfgj12"+1
    A: false, true, true, false, 13, 1
    

    why:
    php中 字符串==0 恒成立
    php中 字符串和数字相加,如果字符串开头是数字,则等于字符串开头的数字(字符串第一个位置开始,到第一个非数字和.的位置截止)+数字

    四十二、什么是服务容器、控制反转(IoC)、依赖注入(DI)
    服务容器是用来管理类依赖与运行依赖注入的工具。Laravel框架中就是使用服务容器来实现 控制反转 和 依赖注入 。
    控制反转(IoC) 就是说把创建对象的 控制权 进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,也就是 Laravel 中的容器。
    依赖注入(DI)则是帮助容器实现在运行中动态的为对象提供提依赖的资源。

    四十三、Composer自动加载原理
    composer加载核心思想是通过composer的配置文件在引用入口文件(autoload.php)时,将类和路径的对应关系加载到内存中,最后将具体加载的实现注册到spl_autoload_register函数中.最后将需要的文件包含进来.

    四十四、一个请求到PHP,Nginx的主要过程。完整描述整个网络请求过程,原理。
    1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的连接。
    2)、当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。
    3)FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。
    4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
    5)、FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。

    四十五、PHP的魔术方法
    __set() // 在给不可访问属性赋值时,__set()会被调用
    __get() // 读取不可访问属性的值时,__get()会被调用
    __isset() //当对不可访问属性调用isset()或empty(),__isset()会被调用
    __unset() // 当对不可访问属性调用unset()时,__unset()会被调用
    __call() // 在对象中调用一个不可访问方法时,__call()会被调用
    __callStatic() // 在静态上下文中调用一个不可访问的方法时,__callStatic会被调用
    __construct() // 构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
    __destruct() // 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
    __sleep() // serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会先被调用,然后再执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
    __wakeup() // unserialize()函数会检查是否存在一个__wakeup()方法,如果存在,则会先调用该方法,然后再执行反序列化操作。__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

    四十六、字符编码UTF8、GBK、GB2312的区别。
    utf8是国际编码。通用性较好。
    gbk是国内编码。通用型较utf8差,但是占用数据库比utf8小。
    gb2312是一个简体中文字符集的中国国家标准,共收录6763个汉字。

    四十七、MySQL默认的排序方式是什么
    MyIsam存储引擎:在没有任何删除,修改的操作下,执行select不带order by那么会按照插入的顺序下进行排序。
    InnDB存储引擎:在相同的情况下,select不带order by会根据主键来排序,从小到大。

    四十八、OSI七层网络模型
    物理层:建立、维护、断开物理连接
    数据链路层:建立逻辑链接、进行硬件地址寻址、差错校验等功能(SDLC、HDLC、PPP、STP)
    网络层:进行逻辑地址寻址,实现不同网络之间的路径选择(IP、IPX、OSPF)
    传输层:定义传输数据的协议端口号,以及流程和差错校验(TCP,UDP)数据包一旦离开网卡即进入网络传输层
    会话层:建立、管理、终止会话
    表示层:数据的表示、安全、压缩
    应用层:网络服务与最终用户的一个接口;协议有:HTTP、FTP、TFTP、SMTP、DNS、TELNET、HTTPS、POP3、DHCP

    四十九、找出数组中出现一次的元素。10 10 11 11 12 13 12 13 16 只出现一次的数字。要求时间复杂度尽可能低

    // 方法一
    function onlyOne($arr) {
    	$res = 0;
    	for ($i = 0; $i < count($arr); $i++) {
    		$res ^= $arr[$i];
    	}
    	
       return $res;
    }
    // 方法二
    function onlyOne2($arr) {
    	$m = array_count_values($arr);
    	foreach ($m as $k => $v) {
    	  if ($v == 1) {
    		return $k;
    	  }
    	}
    	return 0;
    }
    

    五十、LRU算法
    如果一个 数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小(https://www.twblogs.net/a/5b7f0b662b717767c6ad6c42/zh-cn)

    五十一、PHP如何设置错误级别

    1.通过修改 php.ini文件。

    	error_reporting = E_ALL  //全部错误显示
    	error_reporting = 0 //全部错误显示
    
    	error_reporting = E_ALL & ~E_NOTICE //显示除了notice类型错误之外的全部错误
    
    ps:
    	display_errors = On //是否显示错误
    

    2.通过error_reporting()函数设置

    	echo error_reporting(); //输出当前位掩码
    	error_reporting(E_ALL); //显示所有错误
    	error_reporting(-1); //显示所有错误
    	error_reporting(0); //不显示所有错误,解析错误(syntax error)除外
    	error_reporting(E_ALL & ~E_NOTICE); //显示除了notice类型错误之外的全部错误
    

    3.通过运行时设置 ini_set()

    	ini_set('error_reporting',0); //不显示所有错误
    
    	ini_set('display_errors',0); //关闭错误显示
    	ini_set('error_reporting',1); //打开错误显示
    

    PS:
    php错误常量 和 位掩码 的对应关系
    在这里插入图片描述
    PHP配置文件中于错误相关的配置项
    在这里插入图片描述

    五十二、手动抛出错误 trigger_error()
    例如:
    在这里插入图片描述
    输出:(如果抛出致命错误 E_USER_ERROR ,则程序停止)
    在这里插入图片描述
    五十三、自定义错误处理机制 set_error_handler() ,取消自定义 restore_error_handler()
    官方文档:https://www.php.net/manual/zh/function.set-error-handler.php
    视频资料:自定义错误处理器

    杂项:

    获取客户端IP
    没有使用代理
    $_SERVER[‘REMOTE_ADDR’] 或者 getenv(‘REMOTE_ADDR’)
    使用透明代理
    $_SERVER[‘HTTP_X_FORWARDED_FOR’];

    获取服务端IP
    $_SERVER[‘SERVER_ADDR’] 或者 gethostbyname(‘www.baidu.com’);

    将IP地址转换成int

    ip2long($ip);  
    

    好处:存储时可以直接存有符号int型,只需要4字节(节约空间)
    存char类型需要15个字节
    int转换成ip

    long2ip($int);
    

    获取当前时间戳

    time()
    

    打印前一天的时间

    date('Y-m-d H:i:s',strtotime('-1 day'))
    

    GB2312格式的字符串装换成UTF-8格式

    iconv('GB2312','UTF-8','悄悄是别离的笙箫');
    

    字符串转数组

    explode(',',$str)
    

    创建一个每周三01:00~04:00每3分钟执行执行一次的crontab指令

    */3 1-4 * * 3 /bin/bash /home/sijiaomao/ok.sh
    

    php两数组相加
    两个数组相加,若数组中存在相同键值的元素,则只保留第一个数组的元素

    设置时区

    	date_default_timezone_set("Asia/Shanghai");
    

    在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
    urlencode() 解码用urldecode()

    PHP常用扩展
    curl、iconv、json、mbstring、mysqli、PDO、hash、openssl、sockets、redis

    php八种数据类型
    数据类型分为三种:
    标量数据类型:boolean、string、integer、double
    复合数据类型:array、object
    特殊数据类型:resource、null

    php进程模型,php怎么支持多个并发
    守护进程模型:https://www.jianshu.com/p/542935a3bfa8

    nginx的进程模型,怎么支持多个并发
    https://www.zhihu.com/question/22062795

    php-fpm各配置含义,fpm的daemonize模式
    http://www.4wei.cn/archives/1002061

    查看PHP进程当前使用的内存
    memory_get_usage()

    查看系统分配的内存
    memory_get_peak_usage()
    unset()可以释放内存,当处理完数据后 unset 掉,只能释放当前使用的内存,系统分配的内存并不会变小
    内存被分划为, “已使用” 和 “空闲”, unset 只会把 “已使用” 变为 “空闲”, 下次内存请求时会先去"空闲"里取,
    程序结束, GC 才会释放全部内存

    参数绑定可以避免 SQL 注入攻击

    		例如:$users = DB::select('select * from users where username = ? and passwd = ?', [$username,$passwd]);
    

    除了使用 ? 占位符来代表参数绑定外,还可以使用命名绑定来执行查询:

    		$results = DB::select('select * from users where id = :id', ['id' => 1]);
    

    thinkphp5.0链接数据库
    使用db助手函数默认每次都会重新连接数据库,而使用Db::name或者Db::table方法的话都是单例的
    db函数如果需要采用相同的链接,可以传入第三个参数,例如:
    db(‘user’,[],false)->where(‘id’,1)->find();
    db(‘user’,[],false)->where(‘status’,1)->select();
    上面的方式会使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的配置。

    PHP预定义变量(详见:https://www.php.net/manual/zh/reserved.variables.php)

       超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
    	$GLOBALS — 引用全局作用域中可用的全部变量
    	$_SERVER — 服务器和执行环境信息
    	$_GET — HTTP GET 变量
    	$_POST — HTTP POST 变量
    	$_FILES — HTTP 文件上传变量
    	$_REQUEST — HTTP Request 变量
    	$_SESSION — Session 变量
    	$_ENV — 环境变量
    	$_COOKIE — HTTP Cookies
    	$php_errormsg — 前一个错误信息
    	$HTTP_RAW_POST_DATA — 原生POST数据
    	$http_response_header — HTTP 响应头
    	$argc — 传递给脚本的参数数目
    	$argv — 传递给脚本的参数数组
    

    count()和sizeof()的区别
    两个函数都是用于获取数组的长度,sizeof()用法和count()完全一致
    在这里插入图片描述
    没有区别,count()是sizeof()的别名

    mysql中INT和BIGINT的区别?
    如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。
    mysql聚合函数返回值?
    如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL
    SELECT AVG(score) average FROM students WHERE gender = ‘X’;
    总共十条记录,每页3条记录,如何通过聚合查询获得总页数?
    SELECT CEILING(COUNT(*) / 3) FROM students; //CEILING()向上取整
    使用一条SELECT查询查出每个班级的平均分(四舍五入取整): ceiling(),四舍五入取整
    SELECT class_id,ceiling(AVG(score)) from students GROUP BY class_id;
    请使用一条SELECT查询查出每个班级男生和女生的平均分:
    select class_id,gender,AVG(score) as avgr from students GROUP BY class_id,gender ORDER BY avgr;

    相关优秀文章:
    从B树、B+树、B*树谈MySQL索引
    排序——读《数据结构与算法分析》有感
    Redis知识点(redis面试,一文足矣)
    MySQL优化之——查询优化
    PHP MYSQL 优秀文章 汇总

    未完待续…

    展开全文
  • php中include和require的区别 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。 include:包含一个不存在的文件...

    php中include和require的区别

    在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

    include:包含一个不存在的文件,会提示警告程序会继续执行

    include()语句将在其被调用的位置处包含一个文件。包含一个文件与在该语句所在位置复制制定文件的数据具有相同内容的效果。

    include_once():函数的作用与include相同,不过它会首先验证是否已经包含了该文件。如果已经包含,则不再执行include_once。否则,则必须包含该文件。除了这一点与include完全相同。

    require:出现错误后直接终止退出,程序不再执行

    require_once 只会加载同一个文件一次,require会加载多次。 

    php单引号和双引号的区别

    (双引号内部变量会解析,单引号则不解析.)
    "" 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。
    ''单引号里面的不进行解释,直接输出。

    http协议的数据传输方式有哪些

    http协议的传输方式有很多种,处于安全考虑,常用的一般都是GET和POST两种,先来介绍下这两种

    1)GET:获取资源
    GET方法用来请求访问已被URL识别的资源

    2)POST:传输实体主体
    POST方法用来请求服务器传输信息实体的主体

    GET和POST的区别:

    首先,使用目标不同:GET方法只是用来查询,不会对浏览器上的信息产生影响,每次GET的方法都是相同的
    其次,大小不同:GET是放在URL首部,因此大小随着浏览器而定,而POST则是在报文中,只要没有具体限制,文件的大小是没限制的
    然后,安全性不同:GET采用的是明文传输,而POST是放在报文内部,无法看到
    从使用场景的角度来说,一般像用户注册登录这种信息都是私密的,采用POST,而针对查询等,为了快速,大多采用GET传输。
    (关于关于GET和POST的区别,最近重新看了很多别人写的博客啊资料什么的,发现上面的解释比较模糊,我就在下面的评论区里面将区别清晰的描述一下,当然,后面的博客也会详细的解释)

    接下来介绍其他几种数据传输方式:

    3)PUT:传输文件
    PUT要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置
    处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法

    4)HEAD:获得报文首部
    HEAD和GET方法一样,只不过不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等

    5)DELETE:删除文件
    DELETE是与PUT相反的方法,是按请求URI删除指定的资源
    处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法

    6)OPTIONS:询问支持的方法
    用来查询针对请求URI指定的资源支持的方法

    7)TRACE:追踪路径
    是让web服务器端将之前的请求通信还回给客户端的方法
    发送请求时,在Max-Frowards首部字段中填入数值,每经过一个服务器端就-1,当数值为0时,停止传输,最后收到服务器返回状态码200 OK的响应
    但是,这种方法基本很少使用,而且很容易引起XST(跨站追踪)攻击,就更不会用到了。

    8)CONNECT:要求采用隧道协议连接代理
    该方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网络传输。

     

    安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
    ①防远程提交;②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;

    在程序的开发中,如何提高程序的运行效率?
    ①优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询;②数据表中创建索引;③对程序中经常用到的数据生成缓存;

    session与cookie的区别?

    ①存储位置:session存储于服务器,cookie存储于浏览器
    ②安全性:session安全性比cookie高
    ③session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用

    SQL语句优化有哪些方法?

    (1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。
    (2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
    (3) 避免在索引列上使用计算
    (4)避免在索引列上使用IS NULL和IS NOT NULL
    (5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。  
    (6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
    (7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描 

    Mysql 的存储引擎,myisam和innodb的区别。

    MyISAM 是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;适合小数据,小并发
    innodb是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。

     

    MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
    a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
    b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
    c. mysql库主从读写分离。
    d. 找规律分表,减少单表中的数据量提高查询速度。
    e。添加缓存机制,比如memcached,apc等。
    f. 不经常改动的页面,生成静态页面。
    g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

    对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?
    a. 确认服务器是否能支撑当前访问量。
    b. 优化数据库访问。
    c. 禁止外部访问链接(盗链), 比如图片盗链。
    d. 控制文件下载。
    e. 使用不同主机分流。
    f. 使用浏览统计软件,了解访问量,有针对性的进行优化。

    简述 private、 protected、 public修饰符的访问权限。
    private : 私有成员, 在类的内部才可以访问。
    protected : 保护成员,该类内部和继承类中可以访问。
    public : 公共成员,完全公开,没有访问限制。

    常见的HTTP状态码:
    200 - 请求成功
    301 - 资源(网页等)被永久转义到其他URL
    404 - 请求的资源(网页等)不存在
    505 - 内部服务器错误

    HTTP状态码分类:
    1** - 信息,服务器收到的请求,需要请求者继续执行操作
    2** - 成功,操作被成功接收并处理
    3** - 重定向,需要进一步的操作以完成请求
    4** - 客户端错误,请求包含语法错误或者无法完成请求
    5** 服务器错误,服务器在处理请求的过程 中发生了错误

    git和svn的区别

    GIT是分布式的,SVN不是
    GIT把内容按元数据方式存储,而SVN是按文件
    GIT分支和SVN的分支不同
    GIT没有一个全局的版本号,而SVN有
    GIT的内容完整性要优于SVN

    索引有几种?

    主键索引:数据记录里面不能有null,数据内容不能重复,在一张表里面不能有多个主键索引。
    普通索引:使用字段关键字建立的索引,主要是提高查询速度
    唯一索引:字段数据是唯一的,数据内容里面能否为null,在一张表里面,是可以添加多个唯一索引。
    全文索引:在比较老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引不支持中文。我们一般使用sphinx集合coreseek来实现中文的全文索引。

    常见的设计模式

    工厂模式:是一种类,它具有为您创建对象的某些方法。
    单元素模式:某些应用程序资源是独占的,因为有且只有一个此类型的资源。
    观察者模式:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。
    命令链模式:以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。
    策略模式:算法是从复杂类提取的,因而可以方便地替换。

     

    用PHP打印出前一天的时间,格式是2006-5-10 22:21:21

    echo date('Y-m-d H:i:s',time()-60*60*24);
    或者echo date('Y-m-d H:i:s',strtotime('-1 day'));
    

      

    echo(),print(),print_r()的区别

    echo是语言结构,无返回值;

    print功能和echo基本相同,不同的是print是函数,有返回值;

    print_r是递归打印,用于输出数组或对象。

     

    用PHP写出显示客户端IP与服务器IP的代码

    echo '客户端IP:'.$_SERVER['REMOTE_ADDR'].'<br />';
    echo '服务器端IP:'.gethostbyname($_SERVER['SERVER_NAME']);
    

    什么是闭包

    闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

    php魔术变量

    __LINE__  文件中的当前行号。

    __FILE__  文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

    __DIR__  文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

    __FUNCTION__  常量返回该函数被定义时的名字

    __CLASS__  常量返回该类被定义时的名字(区分大小写)。

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

    __NAMESPACE__  当前命名空间的名称(区分大小写)。

    php 7 新特性

    • 改进的性能 - 将PHPNG代码合并到PHP7中,速度是PHP 5的两倍。
    • 降低内存消耗 - 优化的PHP 7使用较少的资源。
    • 标量类型声明 - 现在可以强制执行参数和返回类型。
    • 一致的64位支持 - 对64位体系结构机器的一致支持。
    • 改进了异常层次 - 异常层次得到了改进
    • 许多致命的错误转换为例外 - 例外范围增加,涵盖许多致命的错误转换为例外。
    • 安全随机数发生器 - 增加新的安全随机数发生器API。
    • 已弃用的SAPI和扩展已删除 - 各种旧的和不受支持的SAPI和扩展从最新版本中删除。
    • 空合并运算符(?) - 添加了新的空合并运算符。
    • 返回和标量类型声明 - 支持所添加的返回类型和参数类型。
    • 匿名类 - 支持匿名添加。
    • 零成本断言 - 支持零成本断言增加。

    面向对象和面向过程区别

    面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

    面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

    TCP的三次握手

    TCP(Transmission Control Protocol) 传输控制协议

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

    位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
      第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 

      第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

      第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据.

     

    展开全文
  • PHP笔试面试精选

    2019-08-30 13:58:33
    本次课程主要围绕 PHP 面试和笔试中经常会出现的一些知识点,但是面试官会在笔试题基础上深入扩展,那么你知道如何更好的回答让面试官满意吗?题目收集自腾讯,迅雷,美图等公司的笔试面试题,以及本人面试经历中...

    本次课程主要围绕 PHP 面试和笔试中经常会出现的一些知识点,但是面试官会在笔试题基础上深入扩展,那么你知道如何更好的回答让面试官满意吗?题目收集自腾讯,迅雷,美图等公司的笔试面试题,以及本人面试经历中印象中的知识点,同时也分享一些面试的经验,相信对你一定有很大的参考价值。

    本期题目重点涉及基础知识,安全,跨域,及两个简单的设计模式,预告下期重点是:计算机网络,WebSocket,http协议,tcp协议相关

    讲座地址:https://segmentfault.com/l/15...

    一、PHP部分

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

    static 是静态变量,在局部函数中存在且只初始化一次,使用过后再次使用会使用上次执行的结果; 作为计数,程序内部缓存,单例模式中都有用到。

    global 关键字,引用全局变量,wordpress中大量用到,如面向过程开发。

    static 静态方法,是类的成员方法,但不需要实例化类可直接使用

    $GLOBAL 在函数内使用具有全局作用域的变量,如$GLOBAL['a']

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

    用例子说明,以 Laravel 框架中的控制器作为说明

    ①final修饰的类方法不可被子类重写

    ②PHP是否重写父类方法只会根据方法名是否一致判断(5.3以后重写父类方法参数个数必须一致)

    ③重写时访问级别只可以等于或者宽松于父类 不可提升访问级别

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

    主要防止 include,require 引用文件,把文件末尾可能的回车和空格等字符引用进来,还有一些函数必须在没有任何输出之前调用,就会造成不是期望的结果。PHP文件的编码不包含BOM的UTF8. 这也是PSR-2中的规范:纯PHP代码文件必须省略最后的 ?> 结束标签。

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

    CI非常轻量级,是一个简单的MVC框架,性能也很快。

    ThinkPHP3.2国内使用比较多,优点是文档非常多,各种问题解决方案比较多,缺点是代码不够规范,理念落后。

    Laravel 是一个现代化的PHP开发框架,代码优雅,使用 composer 方式扩展功能,社区活跃,缺点是比较重,比较适合做后台管理或者应用型WEB系统。

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

    读写性能:

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

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

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

    Redis 提供了多种不同级别的持久化方式:

    RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

    AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

    Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

    你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

    参见:http://doc.redisfans.com/topi...

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

    1.file_get_contents

    2.readfile读取内容

    3.fopen系列函数

    4.curl

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

    CGI,通用网关接口,用于WEB服务器和应用程序间的交互,定义输入输出规范,用户的请求通过WEB服务器转发给FastCGI进程,FastCGI进程再调用应用程序进行处理,如php解析器,应用程序的处理结果如html返回给FastCGI,FastCGI返回给Nginx 进行输出。假设这里WEB服务器是Nginx,应用程序是 PHP,而 php-fpm 是管理 FastCGI 的,这也就是 php-fpm,FastCGI,和 Nginx 之间的关系。

    FastCGI 用来提高 cgi 程序性能,启动一个master,再启动多个 worker,不需要每次解析 php.ini. 而 php-fpm 实现了 FastCGI 协议,是 FastCGI 的进程管理器,支持平滑重启,可以启动的时候预先生成多个进程。

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

    CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。

    讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。

    CSRF防范:

    1.合理规范api请求方式,GET,POST

    2.对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。

    XSS,跨站脚本攻击。

    防范:不相信任何输入,过滤输入。

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

    看示例代码。

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

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

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

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

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

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

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

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

    二、前端部分

    1.$(“#content .abc”) 和 $(“#content”).find(“.abc”) 哪个效率更高?

    后者,后者使用原生的document.getElementByN ame,ID>Tag>Class.

    $(“#content”).find(“.abc”) .find()方法会调用浏览器的原生方法(getElementById,getElementByName,getElementByTagName等等),所以速度较快。比$(“#content .abc”) 效率快很多。

    第一种慢的原因:在于 jQuery 内部使用各种选择器链条的选择顺序是从右到左,所以这条语句是先选.abc,然后再一个个过滤出父元素#content,这导致它慢很多。

    2.ajax 中如何执行跨域访问?同子域的情况如何处理?不同子域的情况如何处理?

    跨域的存在是因为浏览器的同源策略,一个源表示协议,端口,域名都相同,否则就形成了跨域。

    ①jsonp,非官方协议,简单实用

    通过JavaScript的callback方式调用,jQuery封装了jsonp方式的请求。

    callback({“result”:0,”msg”:”ok”,”data”:{xxx}})

    ②服务器响应头

    header("Access-Control-Allow-Origin:*");

    /星号表示所有的域都可以接受,/

    header(“Access-Control-Allow-Methods:GET,POST");

    ③iframe实现跨域

    3.$(document).ready()函数作用域是什么?

    片段1:

    var MyProject = {};
    $(document).ready(function() {
        MyProject.intro = "";
        MyProject.intro = "something";
    });
    console.log(MyProject.intro); // "something"

    片段2:

    $(document).ready(function() {
        var1 = 12;      // no var =global
        var var2 = 24;  // local
    });
    
    alert(var1)
    alert(var2)

    4.$(this) 和 this 关键字在 jQuery 中有何不同?

    一个是jquery对象,一个是js的属性

    5.jsonp 和 iframe 跨域访问原理是什么?

    一个jsonp的例子,js代码:

    //JAVASCRIPT
    $.getJSON('http://www.example.com/jsonp.php?callback=?','firstname=Jeff',function(res){
        alert('Your name is '+res.fullname);
    });
    
    //SERVER SIDE
      <?php
     $fname = $_GET['firstname'];
          if($fname=='Jeff'){
              //header("Content-Type: application/json");
             echo $_GET['callback'] . '(' . "{'fullname' : 'Jeff Hansen'}" . ')';
          }
    ?>

    Ajax发jsonp请求:

    $.ajax({
            url: "http://api.flickr.com/services/rest/?method=flickr.interestingness.getList ",
            dataType: "jsonp",
            jsonp: 'jsoncallback',
            success: function(data) {
                alert(data);
            }
        });

    注意:对于上面第二个ajax示例,url中不必带有callback参数,jquery会自动添加。

    Jsonp参数是callback名称,指的就是服务端$_GET[‘callback’]里的callback的名称。

    实际发的请求就是http://api.flickr.com/service... 1471419449018

    dataType: 'jsonp',用于表示这是一个 JSONP 请求。
    jsonp: 'callback',用于告知服务器根据这个参数获取回调函数的名称,通常约定就叫 callback。
    jsonpCallback: 'dosomething',回调函数的名称,也是前面callback参数的值,可省略,jquery会自动生成。
    JSONP 的原理

    AJAX 无法跨域是受到“同源政策”的限制,但是带有src属性的标签(例如<script>、<img>、<iframe>)是不受该政策限制的,因此我们可以通过向页面中动态添加<script>标签来完成对跨域资源的访问,这也是 JSONP 方案最核心的原理。

    缺点:防止xss注入

    Iframe跨域

    如果两个窗口一级域名相同,只是二级域名不同,document.domain设置为同一个主域

    展开全文
  • PHP笔试题

    2019-11-04 08:12:13
    1、不用新变量直接交换现有两个变量的值 ...2、PHP数字金额转大小格式,同时说明思路  function daxie($num){  $da_num = array('零','一','二','三','四','五','六','七','八','九');  ...
  • PHP笔试题20道

    千次阅读 2016-03-18 09:46:27
    一、单选 1、PHP 指的是? A、Private Home Page B、Personal Hypertext Processor C、PHP: Hypertext Preprocessor D、Personal Home Page 答案:B 2、PHP 服务器脚本由哪个分隔符包围? A、.....
  • 常见的php笔试题(附答案)搜集整理 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在哪个预定义变量中?而链接到当前页面的URL又记录在哪个预定义变量中? 答:echo $_SERVER['PHP_SELF']; echo $_...
  • php echo -10%3; ?&gt; 答案:-1。 考查:优先级。 因为-的优先级比%求余的优先级低, 也就是-(10%3)。     2 题目二: print (int...
  • 2017秋招笔试题php)部分题

    千次阅读 2017-08-27 17:25:34
    1.下列代码输出结果是<?php $a = "www"; settype($a,'array'); (string)$a; floatval($a); echo gettype($a); ?>【答案】:array【解析】:对于这些强制类型转换,甚至是自动类型转换,这并没有改变这些操作数本身的...
  • 各大IT公司笔试真题

    万次阅读 2010-09-17 12:37:00
      各大IT公司笔试真题汇总!...百度笔试题 http://www.coderarea.net/bbs/read.php?tid=811<br /><br />百度2010校招运维部门笔试 http://www.coderarea.net/bbs/read.php?tid=779
  • 各大IT公司笔试真题汇总

    万次阅读 2010-01-27 20:37:00
    巨人网络java笔试基础题分享 ...百度笔试题 http://www.coderarea.net/bbs/read.php?tid=811 百度2010校招运维部门笔试 http://www.coderarea.net/bbs/read.php?tid=779 百度2010年校园招聘软件测试笔试题 http:/
  • 各大it公司笔试题分享

    万次阅读 2010-11-11 23:21:00
    各大it公司笔试题分享这个太多啦,就没办法一一转载了谢谢大家:)  巨人网络java笔试基础题分享  http://bbs.ldci.com.cn/read.php?tid-6590.html  百度笔试题  ...
  • 历年企业招聘笔试

    万次阅读 2010-03-12 21:00:00
  • 面对目前全球金融危机,国内动荡的互联网环境,那冬天就要到来,大家也在积极的寻找一个过冬的窝,所以估计辞职跳槽的人很多,特别为大家分享一些各个著名公司的PHP笔试题,为大家求职就业打好坚实基础,希望大家都...
  • 名企招聘案例集锦社区里有许多面试方面的贴子,有介绍面试技巧、名企面试,面试大全,面试题,笔试题大全等等,为了方便方大网友查看,现做一期专题:本期专题将系统,全面,集中的向大家介绍去名企面试的成功技巧。...
  • 各大it公司面试真题

    千次阅读 2011-04-22 11:45:00
    百度笔试题 http://www.coderarea.net/bbs/read.php?tid=811 百度2010校招运维部门笔试 http://www.coderarea.net/bbs/read.php?tid=779 百度2010年校园招聘软件测试笔试题 ...
  • 2018校招笔试真题汇总

    万次阅读 2018-06-06 16:32:48
    2018校招笔试真题汇总最近看好多牛油贡献了很多考试的真题,我把他们汇总在一起给到大家,也感谢这些牛油的贡献,只要进这个汇总贴的,你们都将每人获得一份牛客送出的礼物一份~~~科大讯飞: 2018秋招笔试科大讯飞...
  • java面试题目

    千次阅读 2010-03-11 00:34:00
    巨人网络java笔试基础题分享 ...百度笔试题 http://www.coderarea.net/bbs/read.php?tid=811 百度2010校招运维部门笔试 http://www.coderarea.net/bbs/read.php?tid=779 百度2010年校园招聘软件测试笔试
  • 名企招聘案例集锦

    千次阅读 2006-08-21 19:14:00
    社区里有许多面试方面的贴子,有介绍面试技巧、名企面试,面试大全,面试题,笔试题大全等等,为了方便方大网友查看,现做一期专题:本期专题将系统,全面,集中的向大家介绍去名企面试的成功技巧。本期专题有100...
  • 恒生电子笔试题集锦(不断更新)

    万次阅读 多人点赞 2019-03-18 19:14:00
    恒生20xx校园招聘笔试题(问卷) 试卷类型(A/B/…/F) 答题须知: 请将您的手机调成关机或者是无声状态,并独立完成所有试题; 请将您的答案写在答卷中; 笔试时间为120分钟,请控制好时间; ...
1 2 3 4 5 ... 20
收藏数 6,319
精华内容 2,527
关键字:

php笔试题