PHP面试题大全

系统限制,只显示了2902行,请下载完整版:

https://download.csdn.net/download/qq285744011/12042373

问题:请用最简单的语言告诉我PHP是什么?

回答:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言。

问题:什么是MVC?

回答:MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。

Model:数据信息存取层。
View:view层负责将应用的数据以特定的方式展现在界面上。
Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

问题:在页面中引用CSS有几种方式?

回答:在页面中使用CSS有3中方式:
引用外部CSS文件
内部定义Style样式
内联样式

问题:PHP支持多继承吗?

回答:不可以。PHP类只能继承一个父类,并用关键字“extended”标识。

问题:请问PHP中echo和print有什么区别?

这两个看起来很相似,因为它们都是将一些值打印在屏幕上。但是echo和print的本质区别在于:echo用来输出字符串,显示多个值的时候可以用逗号隔开。只支持基本类型,print不仅可以打印字符串值,而且可以打印函数的返回值。

问题:请问GET和POST方法有什么区别?

回答:我们再网页上填写的表单信息都可以通过这两个方法将数据传递到服务器上,当我们使用GET方法是,所有的信息都会出现在URL地址中,并且使用GET方法最多只能传递1024个字符,所以如果在传输量小或者安全性不那么重要的情况下可以使用GET方法。说到POST方法,最多可以传输2MB字节的数据,而且可以根据需要调节。

问题:PHP中获取图像尺寸大小的方法是什么?

回答:getimagesize () 获取图片的尺寸
Imagesx () 获取图片的宽度
Imagesy () 获取图片的高度

问题:PHP中的PEAR是什么?

回答:PEAR也就是为PHP扩展与应用库(PHP Extension and Application Repository),它是一个PHP扩展及应用的一个代码仓库。

问题:如何用PHP和MySQL上传视频?

回答:我们可以在数据库中存放视频的地址,而不需要将真正的视频数据存在数据库中。可以将视频数据存放在服务器的指定文件夹下,上传的默认大小是2MB,但是我们也可以在php.ini文件中修改max_file size选项来改变。

问题:PHP中的错误类型有哪些?

回答:PHP中遇到的错误类型大致有3类。

提示:这都是一些非常正常的信息,而非重大的错误,有些甚至不会展示给用户。比如访问不存在的变量。
警告:这是有点严重的错误,将会把警告信息展示给用户,但不会影响代码的输出,比如包含一些不存在的文件。
错误:这是真正的严重错误,比如访问不存在的PHP类。

问题:如何在PHP中定义常量?

回答:PHP中使用Define () 来定义常量。
复制代码 代码如下:

define (“Newconstant”, 30);
问题:如何不使用submit按钮来提交表单?

如果我们不想用submit按钮来提交表单,我们也可以用超链接来提交,我们可以这样写代码:
复制代码 代码如下:

<a href=”javascript: document.myform.submit();”>Submit Me</a>


php面试题之一——PHP核心技术(高级部分)
转载 2016年04月17日 19:22:04 标签:php 15765
一、PHP核心技术
1.写出一个能创建多级目录的PHP函数(新浪网技术部)
<?php
    /**
     * 创建多级目录
     * @param $path string 要创建的目录
     * @param $mode int 创建目录的模式,在windows下可忽略
     */
    function create_dir($path,$mode = 0777)
    {
        if (is_dir($path)) {
            # 如果目录已经存在,则不创建
            echo "该目录已经存在";
        } else {
            # 不存在,创建
            if (mkdir($path,$mode,true)) {
                echo "创建目录成功";
            } else {
                echo "创建目录失败";
            }
        }
    }
?>
2.写出smarty模板的特点(新浪网技术部)
速度快,编译型,缓存技术,插件机制,强大的表现逻辑

3.打开php.ini中的safe_mode,会影响哪些函数?至少说出6个。(新浪)
safe_mode,php安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。

4.抓取远程图片到本地,你会用什么函数?(51.com笔试题)
file_get_contents或者curl

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

6.请写一段PHP代码,确保多个进程同时写入同一个文件成功(腾讯)
核心思路:加锁

<?php
    $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);
?>
7.写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1需要取出php或.php(新浪)
<?php
    // 方案一
    function getExt1($url){
        $arr = parse_url($url);
        //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )

        $file = basename($arr['path']);
        $ext = explode('.', $file);
        return $ext[count($ext)-1];
    }

    // 方案二
    function getExt2($url){
        $url = basename($url);
        $pos1 = strpos($url,'.');
        $pos2 = strpos($url,'?');

        if (strstr($url,'?')) {
            return substr($url,$pos1+1,$pos2-$pos1-1);
        } else {
            return substr($url,$pos1);
        }

    }

    $path = "http://www.sina.com.cn/abc/de/fg.php?id=1";
    echo getExt1($path);
    echo "<br />";
    echo getExt2($path);
?>
相关题目:使用五种以上方式获取一个文件的扩展名,要求:dir/upload.image.jpg,找出.jpg或者jpg,必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如get_ext1(filename),getext2(file_name)
8.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(新浪)
<?php
    function my_scandir($dir){
        $files = array();
        if(is_dir($dir)){
            if ($handle = opendir($dir)) {
                while (($flie = readdir($handle))!== false) {
                    if ($flie!="." && $file!="..") {
                        if (is_dir($dir."/".$file)) {
                            $files[$file] = my_scandir($dir."/".$file);
                        } else {
                            $files[] = $dir."/".$file;
                        }
                    }
                }
                closedir($handle);
                return $files;
            }
        }
    }
?>
[!!!]9.简述论坛中无限分类的实现原理。(新浪)
创建类别表如下:

CREATE TABLE category(
cat_id smallint unsigned not null auto_increment primary key comment'类别ID',
cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'类别名称',
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'类别父ID'
)engine=MyISAM charset=utf8;
编写一个函数,递归遍历,实现无限分类

<?php
    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;
    }
?>
10.写一个函数,算出两个文件的相对路径,如a=′/a/b/c/d/e.php′;b='/a/b/12/34/c.php';计算出b相对于a的相对路径应该是../../c/d(新浪)
<?php
    function releative_path($path1,$path2){
        $arr1 = explode("/",dirname($path1));
        $arr2 = explode("/",dirname($path2));

        for ($i=0,$len = count($arr2); $i < $len; $i++) {
            if ($arr1[$i]!=$arr2[$i]) {
                break;
            }
        }

        // 不在同一个根目录下
        if ($i==1) {
            $return_path = array();
        }

        // 在同一个根目录下
        if ($i != 1 && $i < $len) {
            $return_path = array_fill(0, $len - $i,"..");
        }

        // 在同一个目录下
        if ($i == $len) {
            $return_path = array('./');
        }

        $return_path = array_merge($return_path,array_slice($arr1,$i));
        return implode('/',$return_path);
    }

    $a = '/a/b/c/d/e.php';
    $b = '/a/b/12/34/c.php';
    $c = '/e/b/c/d/f.php';
    $d = '/a/b/c/d/g.php';

    echo releative_path($a,$b);//结果是../../c/d
    echo "<br />";
    echo releative_path($a,$c);//结果是a/b/c/d
    echo "<br />";
    echo releative_path($a,$d);//结果是./
    echo "<br />";
?>
11.mysql_fetch_row()和mysql_fetch_array()有什么分别?
mysql_fetch_row()把数据库的一列储存在一个以零为基数的数组中,第一栏在数组的索引0,第二栏在索引1,依此类推。
mysql_fetch_assoc()把数据库的一列储存在一个关联数组中,数组的索引就是字段名称,例如我的数据库查询送回“first_name”、“last_name”、“email”三个字段,数组的索引便是“first_name”、“last_name”和“email”。
mysql_fetch_array()可以同时送回mysql_fetch_row()和mysql_fetch_assoc()的值。

12.有一个网页地址,比如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");
13.谈谈对mvc的认识
由模型(model),视图(view),控制器(controller)完成的应用程序。
model层负责提供数据,和数据库有关的操作都交给模型层来处理,view层则提供交互的界面,并输出数据,而controller层则负责接收请求,并分发给相应的model来处理,然后调用view层来显示。

[!]14.What does the GD library do?(Yahoo)
GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。自从PHP 4.3.0版本后GD便内建在PHP系统中。

15.What function can you use to open a file for reading and writing?(Yahoo)
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()这不是一个PHP函数,会引致执行错误。
file_open()这不是一个PHP函数,会引致执行错误。
fopen()这是正确答案,fopen()可以用来开启档案以便读写。
open_file()这不是一个PHP函数,会引致执行错误。

[!!]16.Smarty的原理
smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编。使用了模板之后,则可以将业务逻辑都放到php文件中,而负责显示内容的模板则放到html文件中。
Smarty在执行display方法的时候,读取模板文件,并进行数据替换,生成编译文件,之后每次访问都会直接访问编译文件,读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快,编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)。
如果启用了缓存,则会根据编译文件生成缓存文件,在访问的时候如果有缓存文件并且缓存文件没有过期,则直接访问缓存文件。

相关题目1:能够使HTML和PHP分离开使用的模板
smarty,phplib等

相关题目2:您是否用过模板引擎?如果有您用的模板引擎的名字是?
Smarty

17.PHP如何实现页面跳转
方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。
header("Location:网址");//直接跳转
header("refresh:3;url=http://axgle.za.net");//三秒后跳转

方法二:利用meta
echo"<meta http-equiv=refresh content='0;url=网址'>";

18.PHP可以和sql server/oracle等数据库连接吗?
可以

19.使用哪些工具进行版本控制?
SVN或者CVS

相关题目:您是否用过版本控制软件?如果有您用的版本控制软件的名字是?
TortoiseSVN-1.2.6

20.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):
过滤javascript脚本参考:

<?php
    header("content-type:text/html;charset=utf-8");

    $script = "以下内容不显示:<script type='text/javascript'>alert('cc');</script>";
    $pattern = '/<script[^>]*?>.*?</script>/si';

    echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容
?>
21.Given a line of text $string,how would you write a regular expression to strip all the HTML tags from it?(Yahoo)
方案一,使用PHP内建函数strip_tags()除去HTML标签
方案二,自定义函数,如下:

<?php
    header("content-type:text/html;charset=utf-8");

    function strip_html_tags($str){
        $pattern = '/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>/';
        return preg_replace($pattern,'',$str);
    }

    // 实例
    $html = '<p id="">ddddd<br /></p>';
    echo strip_html_tags($html);
    echo "<br />";

    $html = '<p id=">">bb<br />aaa<br /></p>';
    echo strip_html_tags($html);
?>
22.请写一个函数验证电子邮件的格式是否正确(要求使用正则)(新浪)
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

相关题目:请用正则表达式写一个函数,验证电子邮件的格式是否正确。(鑫众人云)
23.请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进行类比说明(腾讯)
主要区别有以下三种:

preg_replace()里面的正则可以写成型如:"/.xxx/"而ereg_replace()里面的正则需写成型如 "xxx"
preg_replace()能操作数组,而ereg_replace()不可以
在逆向引用用preg_replace()可使用0-99个,而ereg_replace()最多为9个
使用Perl兼容正则表达式语法的preg_match()函数通常是比ereg()更快的替代方案。

24.请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?(腾讯)
首先进入php安装目录
php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件
php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记

25.使用正则表达式提取一段标识语言(html或xml)代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有空格等)。此处假设需提取test标签的attr属性值,请自行构建包含该标签的串(腾讯)
编写如下函数:

<?php
    header("content-type:text/html;charset=utf-8");

    function getAttrValue($str,$tagName,$attrName){
        $pattern1="/<".$tagName."(\\s+\\w+\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\9))*\\s*>/i";

        $arr=array();
        $re=preg_match($pattern1,$str,$arr);

        if($re){
            echo"<br/>\$arr[6]={$arr[6]}";
        }else{
            echo"<br/>没找到。";
        }
    }

    // 示例
    $str1="<test attr='ddd'>";
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd
    $str2="<test2 attr='ddd'attr2='ddd2't1=\"t1 value\"t2='t2 value'>";
    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value
?>
26.What does the following code do?Explain what's going on there.date=′08/26/2003′;printeregreplace(“([0−9]+)/([0−9]+)/([0−9]+)”,2/1/3,date);(Yahoo)
这是把一个日期从MM/DD/YYYY的格式转为DD/MM/YYYY格式。
输出26/08/2003

27.What function would you use to redirect the browser to a new page?(Yahoo)
A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir()这不是一个PHP函数,会引致执行错误。
header()这个是正确答案,header()函数发送头信息,可以用来使浏览器转向到另一个页面,例如:header("Location:http://www.search-this.com/")。
location()这不是一个PHP函数,会引致执行错误。
redirect()这不是一个PHP函数,会引致执行错误。

28.When turned on____________will_________your script with different variables from
HTML forms and cookies.(腾讯)
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C

29.一个函数的参数不能是对变量的引用,除非在php.ini中把____设为on。
allow_call_time_pass_reference
是否启用在函数调用时强制参数被按照引用传递

30.在HTML语言中,页面头部的meta标记可以用来输出文件的编码格式,以下是一个标准的meta语句<META http-equiv='Content-Type'content='text/html;charset=gbk'>,请使用PHP语言写一个函数,把一个标准HTML页面���的类似meta标记中的charset部分值改为big5。(新浪)
请注意:
(1)需要处理完整的html页面,即不光此meta语句
(2)忽略大小写
(3)'和"在此处是可以互换的
(4)'Content-Type'两侧的引号是可以忽略的,但'text/html;charset=gbk'两侧的不行
(5)注意处理多余空格
编写正则表达式如下:
$reg1="/(<meta\\s*http-equiv\\s*=\\s*(['\"]?)Content-Type(\\2)\\s*content\\s*=\\s*(['\"])text\/html;charset=)(UTF-8)(\\4)(\\s*\/?>)/i";

31.PHP中如何判断一个字符串是否是合法的日期模式:2007-03-13 13:13:13。要求代码不超过5行。(酷讯)
<?php
    function checkDateTime($data){
        if (date('Y-m-d H:i:s',strtotime($data)) == $data) {
            return true;
        } else {
            return false;
        }
    }

    // 示例
    $data = '2015-06-20 13:35:42';
    var_dump(checkDateTime($data));//bool(true)

    $data = '2015-06-36 13:35:42';
    var_dump(checkDateTime($data));//bool(false)
?>
32.PHP中,如何获得一个数组的键值?(酷讯)
使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。
使用array_keys()则可以得到数组中所有的键名。
使用foreach结构foreach($arr as key=>value)可以通过key和value分别获取键名和值。

33.如果模板是用smarty模板。怎样用section语句来显示一个名为$data的组。比如:
$data=array(
0=>array('id'=>8,'name'=>'name1'),
1=>array('id'=>10,'name'=>'name2'),
2=>array('id'=>15,'name'=>'name3')
);
写出在模板页的代码?若用foreach语句又要怎样显示呢?

用section语句:

<{section name=test loop=$data start=0 step=1}>
id:<{$data[test].id}><br/>
name:<{$data[test].name}><br/><br/>
<{sectionelse}>
数组为空
<{/section}>
用foreach语句:

<{foreach from=$data item=test}>
id:<{$test.id}><br/>
name:<{$test.name}><br/><br/>
<{foreachelse}>
数组为空
<{/foreach}>
34.哪个选项会匹配下边的这个正则表达式?(/.*xyz\d/)
A.*****xyz
B.*****xyz1
C.******xyz2
D.*xyz
答案:C

35.以下哪个错误无法被标准的错误控制器获取?
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:B

36.以下哪种错误类型无法被自定义的错误处理器捕捉到?(奇矩互动)
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:C

37.(^\s)|(\s$)这个正则表达式作用是:__________;
匹配以0个或多个空白符开头或者0个或多个空白符结尾的字符串

38.编写函数取得上一月的最后一天
<?php
    date_default_timezone_set('PRC');

    /**
     * 获取给定月份的上一月最后一天
     * @param $date string 给定日期
     * @return string 上一月最后一天
     */
    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));
    }

    // 测试
    echo get_last_month_last_day();
    echo "<br />";
    echo get_last_month_last_day("2013-3-21");
?>
39.在很多时候,我们可以通过apache的主配置文件来设置对test目录的访问权限控制,如http://IP/test请问如果需设置test下的一个子目录的访问控制权限,是否可以在主配置文件中修改,如果不可以应如何解决。
可以,还可以在需要控制的子目录下创建.htaccess文件,写入访问控制。

40.如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方?
从以下几个方面考虑:

数据库中库和表都用utf8编码
php连接mysql,指定数据库编码为utf8 mysql_query(“set names utf8”);
php文件指定头部编码为utf-8header(“content-type:text/html;charset=utf-8”);
网站下所有文件的编码为utf8
html文件指定编码为utf-8<meta http-equiv="Content-Type"content="text/html;charset=utf-8"/>
41.在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
urlencode()

42.写出两种对变量加密的函数?
md5(str);sha1(str);

43.如何把2009-9-2 10:30:25变成unix时间戳?
<?php
    date_default_timezone_set("PRC");

    // 将字符串转成Unix时间戳
    $unix_time = strtotime("2009-9-2 10:30:45");
    echo $unix_time;
    echo "<br />";

    // 格式化Unix时间戳为正常时间格式
    echo date("Y-m-d H:i:s",$unix_time);
?>
44.如何把一个GB2312格式的字符串装换成UTF-8格式?
<?php
    iconv('GB2312','UTF-8','悄悄是别离的笙箫');
?>
45.如果需要原样输出用户输入的内容,在数据入库前,要用哪个函数处理?
htmlspecialchars或者htmlentities

46.写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等

47.了解MVC模式吗?请写出三种以上目前PHP流行的MVC框架名称(不区分大小写)
FleaPHP、Zend Framework、CakePHP、Symfony、ThinkPHP、YII、CodeIgniter等

48.php中WEB上传文件的原理是什么,如何限制上传文件的大小?
上传文件的表单使用post方式,并且要在form中添加enctype='multipart/form-data'。
一般可以加上隐藏域:<input type=hidden name='MAX_FILE_SIZE' value=dddddd>,位置在file域前面。
value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。
使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。

限制上传文件大小的因素有:

客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。
服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。
自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。
49.简述UBB code的实现原理。(YG)
UBB代码是HTML的一个变种,通过程序自定义我们的标签,比如“[a]PHP中UBB的使用[/a]”这样的标签,其实质就是查找[a][/a]标签,将其替换成的标准html,说白了,就是将标准的html标记通过技术手段使其简化,其输出出来的结果还是标准的html。
明白了ubb的原理,那么再制作一个简单的ubb编辑器就不难了,和fck之类的编辑器比较起来,ubb代码最大的优点就是代码简单,功能很少,简单的ubb只需要一个文件,而且ubb标签可以自己来定义,更改起来很方便,在php中就是利用替换函数就可以将
html进行标签化,输出时进行标签的转化。

50.怎么把文件保存到指定目录?怎么避免上传文件重名问题?
可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成将文件保存到指定目录。
可以通过上传的文件名获取到文件后缀,然后使用时间戳+随机数+文件后缀的方式为文件重新命名,这样就避免了重名。

51._____函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。(奇矩互动)
debug_print_backtrace()

52.在Smarty模板语法中怎么能遍历数组a=array(array(′id′=>0),array(′id′=>1),array(′id′=>2),……)id=>0−10000,怎么判断当id=>500,让输出的值在HTML里变为红色?(亿邮)设数组分配过来的数组名为ids
{section name=temp loop=$ids}
    {if $ids[temp].id==500}
        <span style=‘color:#f00;’>{$ids[temp].id}</span>
    {esle}
        {$ids[temp].id}
    {/if}
{/section}
53.在Smarty模板语法中如何获取当前时间,并且使用Y-m-d H:i:s的格式输出?(亿邮)
使用{$smarty.now}来获取当前时间,得到的是unix系统时间戳
使用变量调节器进行格式化,如下:
{$smarty.now|date_format:“%Y-%m-%d%H:%M:%S”}

54.在Smarty模板语法中如何获取php的全局环境变量(亿邮)
$smarty.get.变量 #显示通过get方式传过来的指定变量的值
$smarty.post.变量 #显示通过post方式传过来的指定变量的值
$smarty.cookies.变量 #显示通过cookie中指定变量的值
$smarty.server.SERVER_NAME #显示server变量值,$_SERVER系列变量
$smarty.env.PATH #显示系统环境变量值,$_ENV系列变量
$smarty.session.变量 #显示session中指定变量的值
$smarty.request.变量 #显示通过post、get、cookie中指定变量的值

55.在Smarty模板中如何用自定义函数(亿邮)
使用模板分隔符包含,传递参数则使用HTML属性的方式,例如:
{html_image file="pumpkin.jpg"}

56.列举出你所知道的php系统函数库例如,数学函数库(亿邮)
mysql,gd,pdo,XML,zip,filesystem,mail等

57.假如让你来写一个函数实现Utf-8转gb2312,那么函数的名称应该怎么命名?(亿邮)
utf8_to_gb2312或者utf8togb2312

58.请描述如下URL重写规则的用意。(卓望)
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteBase/
RewriteRule./index.php[L]
</IfModule>
如果REQUEST_FILENAME文件存在,就直接访问文件,不进行下面的rewrite规则,
如果REQUEST_FILENAME目录存在,就直接访问目录,不进行下面的rewrite规则,
RewriteRule./index.php[L]的意思是把所有的请求都给index.php处理。

59.Warning:Cannot modify header information-headers already sent by(output started at D:\src\init.php:7)in D:\src\init.php on line10通常什么情况下php会报该警告信息?(卓望)
一般是在header、set_cookie以及session_start函数前面有输出(包括空格)的情况下,会报该警告信息

高级php面试题
在网上看到一些高级php 的面试题目。。

最近接连面试了几家公司,有些重要问题记录一下,督促自己学习提高,同时希望给朋友们一些帮助。
内容很多,一点点完善,一步步学习。。
有些是面试被问,有些是招聘要求,有些是自己整理加的。


一、mysql相关知识
    1、 mysql优化方式
            MYSQL 优化常用方法
            mysql 性能优化方案
  
    2、如何分库分表
           参考:
   http://blog.sina.com.cn/s/blog_6e322ce70100zs9a.html
           http://www.jb51.net/article/29771.htm

   3、 Mysql+如何做双机热备和负载均衡
http://www.dewen.org/q/51/Mysql+如何做双机热备和负载均衡
    
   4、数据表类型有哪些
       MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等
       MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。
       InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。

       myisam和Innodb引擎的主要特点
       MySQL的存储引擎MyISAM与InnoDB有什么区别?

   5、防sql注入方法
      mysql_escape_string(strip_tags($arr["$val"]));

/**
* 函数名称:post_check() 
* 函数作用:对提交的编辑内容进行处理 
* 参  数:$post: 要提交的内容 
* 返 回 值:$post: 返回过滤后的内容 
*/
function post_check($post){
if(!get_magic_quotes_gpc()){// 判断magic_quotes_gpc是否为打开 
$post = addslashes($post);// 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 
}
$post = str_replace("_","\_", $post);// 把 '_'过滤掉
$post = str_replace("%","\%", $post);// 把 '%'过滤掉
$post = nl2br($post);// 回车转换 
$post = htmlspecialchars($post);// html标记转换 

return $post;
}
 

   6、mysql把一个大表拆分多个表后,如何解决跨表查询效率问题
   7、索引应用
         什么情况下考虑索引
         什么情况不适合索引
         一个语句是否用到索引如何判断
        经常发生的用不到索引的场景:
                like '%.....'
                数据类型隐式转换
                or 关键字加其它条件约束
       全文索引:
                只能用于MYIsAM表,在CHAR,VARCHAR,TEXT类型的列上创建。
       

   8、mysql对于大表(千万级),要怎么优化呢?
        参考http://www.zhihu.com/question/19719997

   9、mysql的慢查询问题
  其实通过慢查询日志来分析是一种比较简单的方式,如果不想看日志,可以借助工具来完成,

如mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter等,感觉自己来分析一个需要丰富的经验,一个浪费时间。

10、关于用户登录状态存session,cookie还是数据库或者memcache的优劣 http://www.dewen.org/q/11504/

关于用户登录状态存session%2Ccookie还是数据库或者memcache的优劣

  11、事务应用极端情况处理
  12、sql语言分4大类请列举
        DDL--CREATE,DROP,ALTER
        DML--INSERT,UPDATE,DELETE
        DQL-SELECT
        DCL--GRANT,REVOKE,COMMIT,ROLLBACK
         

二、php基础

  session的跨域共享
    php连接mysql数据库的几种方式及区别
mysql:面向过程
mysqli:面向对象
pdo:可移植性高  
请参考:php基础系列:PHP连接MySQL数据库用到的三种API

三、php高级

长连接和短连接的使用
socket的使用
支付安全问题

面向对象
三大特性:封装、继承、多态(方法重写)。
抽象类:abstract,至少有一个方法是抽象方法,不能被实例化,为子类定义公共接口。
接口:interface,解决php的单继承问题,所有方法都是public访问权限的抽象方法,不能声明变量只能声明常量。
继承一个类的同时实现多个接口
class A  extends B implements 接口1,接口2...,接口n(){
      //实现所有接口中的方法
}
lamp 和 lnmp 网站架构性能差异的原因分析
解释性语言和编译性语言的性能分析,举例。
四、正则

      email,html,js等匹配

五、开发基础

      进程和线程定义,区别和联系。
       进程的状态:运行run、就绪ready、等待wait
六、Nosql数据库
       memcached、redis、mongodb的区别联系
       3个场景完全不同的东西。1.memcached:单一键值对内存缓存的,做对象缓存无可替代的分布式缓存;2.redis:是算法和数据结构的集合,快速的数据结构操作是他最大的特点,支持数据持久化;3.mongodb是bson结构、介于rdb和nosql之间的,更松散更灵活的,但是不支持事务,只用作非重要数据存储。
     参考 MongoDB 或者 redis 可以替代 memcached 吗?

七、常用linux命令
      比如软链接

八、架构相关

       项目上线前的压力测试,单台服务器支持的并发数,pv数。
 

       服务器资源合理分配问题
             CPU:Apache
                   MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然会CPU占用过高。
             内存:内存库,数据库软件
                
             硬盘:文件

       web2.0架构选择
              MongoDB+redis 或者 MySQL+Memcached 比较好的组合,逻辑简单的就用NOSQL

       当前流行主要网站架构
LAMP、LNMP、LLMP
现在网络上还有一种LNAMP构架,也就是综合了nginx和Apache的优点,使用Apache负载PHP,nginx负责解析其他Web请求,使用nginx的rewrite模块,但是Apache端口不对外开放,Apache的许多模块都可以不加载减少资源。

其它:
数据挖掘经验、熟悉hadoop/lucene/mahout;

闲来无事,搞了一些答案。。。可能不是很全面,留这以后备用吧。

一. 基本知识点
1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。
200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求需要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。一般服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。

1.2 Include require include_once require_once 的区别.
处理失败方式不同:
require 失败时会产生一个致命级别错误,并停止程序运行。
include 失败时只产生一个警告级别错误,程序继续运行。

include_once/require_once和include/require 处理错误方式一样,
唯一区别在于当所包含的文件代码已经存在时候,不在包含。

1.3 PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。


1.4 HEREDOC介绍
一种定义字符串的方法。
结构:
<<<。在该提示符后面,要定义个标识符(单独一行),
然后是一个新行。接下来是字符串 本身,
最后要用前面定义的标识符作为结束标志(单独一行)
注意:
标识符的命名也要像其它标签一样遵守PHP的规则:
只能包含字母、数字和下划线,并且必须以字母和下划线作为开头


1.5 写出一些php魔幻(术)方法;
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

1.6 一些编译php时的configure 参数
–prefix=/usr/local/php php安装目录
–with-config-file-path=/usr/local/php/etc 指定php.ini位置
–with-mysql=/usr/local/mysql mysql安装目录,对mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持

更多可以使用 ./configure help 查看

1.7 向php传入参数的三种方法。

方法一 使用$argc $argv

方法二 使用getopt函数()

方法三 提示用户输入,然后获取输入的参数。有点像C语言


1.8 (mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
int : 数值类型
char : 固定长度字符串类型
varchar : 可变长度字符串类型
datetime : 时期时间类型
text : 文本类型

varchar和char有什么区别:
a. char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。
而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。

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


1.9 error_reporting 等调试函数使用
error_reporting() 函数能够在运行时设置php.ini中 error_reporting 指令。
所以可以再程序中随时调节显示的错误级别。
使用此函数时 display_errors必须是打开状态。

1.10 您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?
 

1.11 posix和perl标准的正则表达式区别;

1.12 Safe_mode 打开后哪些地方受限.
启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数.
所有操作文件的函数将只能操作与脚本UID相同的文件.


1.13 写代码来解决多进程/线程同时读写一个文件的问题。
PHP是不支持多线程的,可以使用php的flock加锁函数实现。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);


1.14 写一段上传文件的代码。
upload.html
<form enctype="multipart/form-data" method="POST" action="upload.php">
Send this file: <input name="name" type="file" />
<input type="submit" value="Send File" />
</form>

upload.php
$uploads_dir = '/uploads';
foreach ($_FILES["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["tmp_name"][$key];
$name = $_FILES["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}


1.15 Mysql 的存储引擎,myisam和innodb的区别。
a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
c. InnoDB不支持FULLTEXT类型的索引.
d. InnoDB 中不保存表的具体行数,也就是说,
执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可.
e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
f. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
g. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,
但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
h. MyISAM支持表锁,InnoDB支持行锁。

二. web 架构,安全,项目经验
2.1 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。


2.2 使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
首先,打开mod_rewrite模块。

其次,http.conf找到以下代码段:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
将其中的:AllowOverride None 改为 AllowOverride All ,重启httpd服务即可。

然后,在项目根目录下简历 .htaccess 文件,填写规则。
2.3 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.


2.4 写出一种排序算法(原理),并说出优化它的方法。


2.5 请简单阐述您最得意的开发之作


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


2.7 您是否用过模板引擎? 如果有您用的模板引擎的名字是?
Smarty

2.8 请介绍Session的原理,大型网站中Session方面应注意什么?


2.9 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。


2.10 正则提出一个网页中的所有链接.


2.11 介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。


2.12 您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。


2.13 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?


2.14 相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。


三. unix/linux 基本使用
3.1 linux下查看当前系统负载信息的一些方法。


3.2 vim的基本快捷键。


3.3 ssh 安全增强方法;密码方式和rsa key 方式的配置。


3.4 rpm/apt/yum/ports 装包,查询,删除的基本命令。


3.5 Makefile的基本格式,gcc 编译,连接的命令,-O0 和-O3区别。


3.6 gdb,strace,valgrind的基本使用.


四. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this对象的作用域。
IE和firefox事件冒泡的不同。
什么是怪异模式,标准模式,近标准模式。
DTD的定义
IE/firefox常用hack.
firefox,IE下的前端js/css调试工具。

五.如何理解 ThinkPHP 3.0 架构三(核心 + 行为 + 驱动)中的行为?
核心 + 行为 + 驱动 
TP官方简称为:CBD
这个问题,在TP手册中已经有委详细地阐述了。。
核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。
行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。
驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。
最好就是下载一份文档下来看,基本上TP里面所有的功能,都会有很详细的描述和范例讲解。

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
为什么要用框架?

因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

框架一般处在低层应用平台(如java 里的 J2EE)和高层业务逻辑之间的中间层。

ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的

原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。早期的思想架构来源于Struts,后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(标签库)、RoR的ORM映射和 ActiveRecord模式,封装了CURD和一些常用操作,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现

使用ThinkPHP,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何PHP应用开发都可以从ThinkPHP的简单、兼容和快速的特性中受益。简洁、快速和实用是ThinkPHP发展秉承的宗旨,为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应用开发的最佳实践!
作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。


在网上看到一些高级php 的面试题目。。

最近接连面试了几家公司,有些重要问题记录一下,督促自己学习提高,同时希望给朋友们一些帮助。
内容很多,一点点完善,一步步学习。。
有些是面试被问,有些是招聘要求,有些是自己整理加的。


一、mysql相关知识
    1、 mysql优化方式
            MYSQL 优化常用方法
            mysql 性能优化方案
  
    2、如何分库分表
           参考:
   http://blog.sina.com.cn/s/blog_6e322ce70100zs9a.html
           http://www.jb51.net/article/29771.htm

   3、 Mysql+如何做双机热备和负载均衡
http://www.dewen.org/q/51/Mysql+如何做双机热备和负载均衡
    
   4、数据表类型有哪些
       MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等
       MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。
       InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。

       myisam和Innodb引擎的主要特点
       MySQL的存储引擎MyISAM与InnoDB有什么区别?

   5、防sql注入方法
      mysql_escape_string(strip_tags($arr["$val"]));

/**
* 函数名称:post_check() 
* 函数作用:对提交的编辑内容进行处理 
* 参  数:$post: 要提交的内容 
* 返 回 值:$post: 返回过滤后的内容 
*/
function post_check($post){
if(!get_magic_quotes_gpc()){// 判断magic_quotes_gpc是否为打开 
$post = addslashes($post);// 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 
}
$post = str_replace("_","\_",$post);// 把 '_'过滤掉
$post = str_replace("%","\%",$post);// 把 '%'过滤掉
$post = nl2br($post);// 回车转换 
$post =htmlspecialchars($post);// html标记转换 
 
return $post;
}
 

   6、mysql把一个大表拆分多个表后,如何解决跨表查询效率问题
   7、索引应用
         什么情况下考虑索引
         什么情况不适合索引
         一个语句是否用到索引如何判断
        经常发生的用不到索引的场景:
                like '%.....'
                数据类型隐式转换
                or 关键字加其它条件约束
       全文索引:
                只能用于MYIsAM表,在CHAR,VARCHAR,TEXT类型的列上创建。
       

   8、mysql对于大表(千万级),要怎么优化呢?
        参考http://www.zhihu.com/question/19719997

   9、mysql的慢查询问题
  其实通过慢查询日志来分析是一种比较简单的方式,如果不想看日志,可以借助工具来完成,

如mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter等,感觉自己来分析一个需要丰富的经验,一个浪费时间。

10、关于用户登录状态存session,cookie还是数据库或者memcache的优劣 http://www.dewen.org/q/11504/

关于用户登录状态存session%2Ccookie还是数据库或者memcache的优劣

  11、事务应用极端情况处理
  12、sql语言分4大类请列举
        DDL--CREATE,DROP,ALTER
        DML--INSERT,UPDATE,DELETE
        DQL-SELECT
        DCL--GRANT,REVOKE,COMMIT,ROLLBACK
         

二、php基础

  session的跨域共享
    php连接mysql数据库的几种方式及区别
mysql:面向过程
mysqli:面向对象
pdo:可移植性高  
请参考:php基础系列:PHP连接MySQL数据库用到的三种API

三、php高级

长连接和短连接的使用
socket的使用
支付安全问题

面向对象
三大特性:封装、继承、多态(方法重写)。
抽象类:abstract,至少有一个方法是抽象方法,不能被实例化,为子类定义公共接口。
接口:interface,解决php的单继承问题,所有方法都是public访问权限的抽象方法,不能声明变量只能声明常量。
继承一个类的同时实现多个接口
class A  extends B implements 接口1,接口2...,接口n(){
      //实现所有接口中的方法
}
lamp 和 lnmp 网站架构性能差异的原因分析
解释性语言和编译性语言的性能分析,举例。
四、正则

      email,html,js等匹配

五、开发基础

      进程和线程定义,区别和联系。
       进程的状态:运行run、就绪ready、等待wait
六、Nosql数据库
       memcached、redis、mongodb的区别联系
       3个场景完全不同的东西。1.memcached:单一键值对内存缓存的,做对象缓存无可替代的分布式缓存;2.redis:是算法和数据结构的集合,快速的数据结构操作是他最大的特点,支持数据持久化;3.mongodb是bson结构、介于rdb和nosql之间的,更松散更灵活的,但是不支持事务,只用作非重要数据存储。
     参考 MongoDB 或者 redis 可以替代 memcached 吗?

七、常用linux命令
      比如软链接

八、架构相关

       项目上线前的压力测试,单台服务器支持的并发数,pv数。
 

       服务器资源合理分配问题
             CPU:Apache
                   MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然会CPU占用过高。
             内存:内存库,数据库软件
                
             硬盘:文件

       web2.0架构选择
              MongoDB+redis 或者 MySQL+Memcached 比较好的组合,逻辑简单的就用NOSQL

       当前流行主要网站架构
LAMP、LNMP、LLMP
现在网络上还有一种LNAMP构架,也就是综合了nginx和Apache的优点,使用Apache负载PHP,nginx负责解析其他Web请求,使用nginx的rewrite模块,但是Apache端口不对外开放,Apache的许多模块都可以不加载减少资源。

其它:
数据挖掘经验、熟悉hadoop/lucene/mahout;

闲来无事,搞了一些答案。。。可能不是很全面,留这以后备用吧。

一. 基本知识点
1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。
200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求需要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。一般服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。

1.2 Include require include_once require_once 的区别.
处理失败方式不同:
require 失败时会产生一个致命级别错误,并停止程序运行。
include 失败时只产生一个警告级别错误,程序继续运行。

include_once/require_once和include/require 处理错误方式一样,
唯一区别在于当所包含的文件代码已经存在时候,不在包含。

1.3 PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。


1.4 HEREDOC介绍
一种定义字符串的方法。
结构:
<<<。在该提示符后面,要定义个标识符(单独一行),
然后是一个新行。接下来是字符串 本身,
最后要用前面定义的标识符作为结束标志(单独一行)
注意:
标识符的命名也要像其它标签一样遵守PHP的规则:
只能包含字母、数字和下划线,并且必须以字母和下划线作为开头


1.5 写出一些php魔幻(术)方法;
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

1.6 一些编译php时的configure 参数
–prefix=/usr/local/php php安装目录
–with-config-file-path=/usr/local/php/etc 指定php.ini位置
–with-mysql=/usr/local/mysql mysql安装目录,对mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持

更多可以使用 ./configure help 查看

1.7 向php传入参数的三种方法。

方法一 使用$argc $argv

方法二 使用getopt函数()

方法三 提示用户输入,然后获取输入的参数。有点像C语言


1.8 (mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
int : 数值类型
char : 固定长度字符串类型
varchar : 可变长度字符串类型
datetime : 时期时间类型
text : 文本类型

varchar和char有什么区别:
a. char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。
而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。

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


1.9 error_reporting 等调试函数使用
error_reporting() 函数能够在运行时设置php.ini中 error_reporting 指令。
所以可以再程序中随时调节显示的错误级别。
使用此函数时 display_errors必须是打开状态。

1.10 您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?

1.11 posix和perl标准的正则表达式区别;

1.12 Safe_mode 打开后哪些地方受限.
启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数.
所有操作文件的函数将只能操作与脚本UID相同的文件.


1.13 写代码来解决多进程/线程同时读写一个文件的问题。
PHP是不支持多线程的,可以使用php的flock加锁函数实现。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);


1.14 写一段上传文件的代码。
upload.html
<form enctype="multipart/form-data" method="POST" action="upload.php">
Send this file: <input name="name" type="file" />
<input type="submit" value="Send File" />
</form>

upload.php
$uploads_dir = '/uploads';
foreach ($_FILES["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["tmp_name"][$key];
$name = $_FILES["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}


1.15 Mysql 的存储引擎,myisam和innodb的区别。
a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
c. InnoDB不支持FULLTEXT类型的索引.
d. InnoDB 中不保存表的具体行数,也就是说,
执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可.
e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
f. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
g. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,
但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
h. MyISAM支持表锁,InnoDB支持行锁。


二. web 架构,安全,项目经验
2.1 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。


2.2 使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
首先,打开mod_rewrite模块。

其次,http.conf找到以下代码段:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
将其中的:AllowOverride None 改为 AllowOverride All ,重启httpd服务即可。

然后,在项目根目录下简历 .htaccess 文件,填写规则。

2.3 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.


2.4 写出一种排序算法(原理),并说出优化它的方法。


2.5 请简单阐述您最得意的开发之作


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


2.7 您是否用过模板引擎? 如果有您用的模板引擎的名字是?
Smarty

2.8 请介绍Session的原理,大型网站中Session方面应注意什么?


2.9 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。


2.10 正则提出一个网页中的所有链接.


2.11 介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。


2.12 您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。


2.13 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?


2.14 相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。


三. unix/linux 基本使用
3.1 linux下查看当前系统负载信息的一些方法。


3.2 vim的基本快捷键。


3.3 ssh 安全增强方法;密码方式和rsa key 方式的配置。


3.4 rpm/apt/yum/ports 装包,查询,删除的基本命令。


3.5 Makefile的基本格式,gcc 编译,连接的命令,-O0 和-O3区别。


3.6 gdb,strace,valgrind的基本使用.


四. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this对象的作用域。
IE和firefox事件冒泡的不同。
什么是怪异模式,标准模式,近标准模式。
DTD的定义
IE/firefox常用hack.
firefox,IE下的前端js/css调试工具。

五.如何理解 ThinkPHP 3.0 架构三(核心 + 行为 + 驱动)中的行为?
核心 + 行为 + 驱动  
TP官方简称为:CBD
这个问题,在TP手册中已经有委详细地阐述了。。
核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。
行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。
驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。
最好就是下载一份文档下来看,基本上TP里面所有的功能,都会有很详细的描述和范例讲解。

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
为什么要用框架?

因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

框架一般处在低层应用平台(如java 里的 J2EE)和高层业务逻辑之间的中间层。

ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的

原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。早期的思想架构来源于Struts,后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(标签库)、RoR的ORM映射和 ActiveRecord模式,封装了CURD和一些常用操作,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现

使用ThinkPHP,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何PHP应用开发都可以从ThinkPHP的简单、兼容和快速的特性中受益。简洁、快速和实用是ThinkPHP发展秉承的宗旨,为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应用开发的最佳实践!
作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。


php面试题之一——PHP核心技术(高级部分)
一、PHP核心技术
1.写出一个能创建多级目录的PHP函数(新浪网技术部)
<?php
    /**
     * 创建多级目录
     * @param $path string 要创建的目录
     * @param $mode int 创建目录的模式,在windows下可忽略
     */
    function create_dir($path,$mode = 0777)
    {
        if (is_dir($path)) {
            # 如果目录已经存在,则不创建
            echo "该目录已经存在";
        } else {
            # 不存在,创建
            if (mkdir($path,$mode,true)) {
                echo "创建目录成功";
            } else {
                echo "创建目录失败";
            }
        }
    }
?>
2.写出smarty模板的特点(新浪网技术部)
速度快,编译型,缓存技术,插件机制,强大的表现逻辑

3.打开php.ini中的safe_mode,会影响哪些函数?至少说出6个。(新浪)
safe_mode,php安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。

4.抓取远程图片到本地,你会用什么函数?(51.com笔试题)
file_get_contents或者curl

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

6.请写一段PHP代码,确保多个进程同时写入同一个文件成功(腾讯)
核心思路:加锁

<?php
    $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);
?>
7.写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1需要取出php或.php(新浪)
<?php
    // 方案一
    function getExt1($url){
        $arr = parse_url($url);
        //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )

        $file = basename($arr['path']);
        $ext = explode('.', $file);
        return $ext[count($ext)-1];
    }

    // 方案二
    function getExt2($url){
        $url = basename($url);
        $pos1 = strpos($url,'.');
        $pos2 = strpos($url,'?');

        if (strstr($url,'?')) {
            return substr($url,$pos1+1,$pos2-$pos1-1);
        } else {
            return substr($url,$pos1);
        }

    }

    $path = "http://www.sina.com.cn/abc/de/fg.php?id=1";
    echo getExt1($path);
    echo "<br />";
    echo getExt2($path);
?>
相关题目:使用五种以上方式获取一个文件的扩展名,要求:dir/upload.image.jpg,找出.jpg或者jpg,必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如get_ext1($file_name),get_ext2($file_name)
8.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(新浪)
<?php
    function my_scandir($dir){
        $files = array();
        if(is_dir($dir)){
            if ($handle = opendir($dir)) {
                while (($flie = readdir($handle))!== false) {
                    if ($flie!="." && $file!="..") {
                        if (is_dir($dir."/".$file)) {
                            $files[$file] = my_scandir($dir."/".$file);
                        } else {
                            $files[] = $dir."/".$file;
                        }
                    }
                }
                closedir($handle);
                return $files;
            }
        }
    }
?>
[!!!]9.简述论坛中无限分类的实现原理。(新浪)
创建类别表如下:

CREATE TABLE category(
cat_id smallint unsigned not null auto_increment primary key comment'类别ID',
cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'类别名称',
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'类别父ID'
)engine=MyISAM charset=utf8;
编写一个函数,递归遍历,实现无限分类

<?php
    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;
    }
?>
10.写一个函数,算出两个文件的相对路径,如$a='/a/b/c/d/e.php';$b='/a/b/12/34/c.php';计算出$b相对于$a的相对路径应该是../../c/d(新浪)
<?php
    function releative_path($path1,$path2){
        $arr1 = explode("/",dirname($path1));
        $arr2 = explode("/",dirname($path2));

        for ($i=0,$len = count($arr2); $i < $len; $i++) {
            if ($arr1[$i]!=$arr2[$i]) {
                break;
            }
        }

        // 不在同一个根目录下
        if ($i==1) {
            $return_path = array();
        }

        // 在同一个根目录下
        if ($i != 1 && $i < $len) {
            $return_path = array_fill(0, $len - $i,"..");
        }

        // 在同一个目录下
        if ($i == $len) {
            $return_path = array('./');
        }

        $return_path = array_merge($return_path,array_slice($arr1,$i));
        return implode('/',$return_path);
    }

    $a = '/a/b/c/d/e.php';
    $b = '/a/b/12/34/c.php';
    $c = '/e/b/c/d/f.php';
    $d = '/a/b/c/d/g.php';

    echo releative_path($a,$b);//结果是../../c/d
    echo "<br />";
    echo releative_path($a,$c);//结果是a/b/c/d
    echo "<br />";
    echo releative_path($a,$d);//结果是./
    echo "<br />";
?>
11.mysql_fetch_row()和mysql_fetch_array()有什么分别?
mysql_fetch_row()把数据库的一列储存在一个以零为基数的数组中,第一栏在数组的索引0,第二栏在索引1,依此类推。
mysql_fetch_assoc()把数据库的一列储存在一个关联数组中,数组的索引就是字段名称,例如我的数据库查询送回“first_name”、“last_name”、“email”三个字段,数组的索引便是“first_name”、“last_name”和“email”。
mysql_fetch_array()可以同时送回mysql_fetch_row()和mysql_fetch_assoc()的值。

12.有一个网页地址,比如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");
13.谈谈对mvc的认识
由模型(model),视图(view),控制器(controller)完成的应用程序。
model层负责提供数据,和数据库有关的操作都交给模型层来处理,view层则提供交互的界面,并输出数据,而controller层则负责接收请求,并分发给相应的model来处理,然后调用view层来显示。

[!]14.What does the GD library do?(Yahoo)
GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。自从PHP 4.3.0版本后GD便内建在PHP系统中。

15.What function can you use to open a file for reading and writing?(Yahoo)
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()这不是一个PHP函数,会引致执行错误。
file_open()这不是一个PHP函数,会引致执行错误。
fopen()这是正确答案,fopen()可以用来开启档案以便读写。
open_file()这不是一个PHP函数,会引致执行错误。

[!!]16.Smarty的原理
smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编。使用了模板之后,则可以将业务逻辑都放到php文件中,而负责显示内容的模板则放到html文件中。
Smarty在执行display方法的时候,读取模板文件,并进行数据替换,生成编译文件,之后每次访问都会直接访问编译文件,读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快,编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)。
如果启用了缓存,则会根据编译文件生成缓存文件,在访问的时候如果有缓存文件并且缓存文件没有过期,则直接访问缓存文件。

相关题目1:能够使HTML和PHP分离开使用的模板
smarty,phplib等

相关题目2:您是否用过模板引擎?如果有您用的模板引擎的名字是?
Smarty

17.PHP如何实现页面跳转
方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。
header("Location:网址");//直接跳转
header("refresh:3;url=http://axgle.za.net");//三秒后跳转

方法二:利用meta
echo"<meta http-equiv=refresh content='0;url=网址'>";

18.PHP可以和sql server/oracle等数据库连接吗?
可以

19.使用哪些工具进行版本控制?
SVN或者CVS

相关题目:您是否用过版本控制软件?如果有您用的版本控制软件的名字是?
TortoiseSVN-1.2.6

20.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):
过滤javascript脚本参考:

<?php
    header("content-type:text/html;charset=utf-8");

    $script = "以下内容不显示:<script type='text/javascript'>alert('cc');</script>";
    $pattern = '/<script[^>]*?>.*?</script>/si';

    echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容
?>
21.Given a line of text $string,how would you write a regular expression to strip all the HTML tags from it?(Yahoo)
方案一,使用PHP内建函数strip_tags()除去HTML标签
方案二,自定义函数,如下:

<?php
    header("content-type:text/html;charset=utf-8");

    function strip_html_tags($str){
        $pattern = '/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>/';
        return preg_replace($pattern,'',$str);
    }

    // 实例
    $html = '<p id="">ddddd<br /></p>';
    echo strip_html_tags($html);
    echo "<br />";

    $html = '<p id=">">bb<br />aaa<br /></p>';
    echo strip_html_tags($html);
?>
22.请写一个函数验证电子邮件的格式是否正确(要求使用正则)(新浪)
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

相关题目:请用正则表达式写一个函数,验证电子邮件的格式是否正确。(鑫众人云)
23.请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进行类比说明(腾讯)
主要区别有以下三种:

preg_replace()里面的正则可以写成型如:"/.xxx/"而ereg_replace()里面的正则需写成型如 "xxx"
preg_replace()能操作数组,而ereg_replace()不可以
在逆向引用用preg_replace()可使用0-99个,而ereg_replace()最多为9个
使用Perl兼容正则表达式语法的preg_match()函数通常是比ereg()更快的替代方案。

24.请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?(腾讯)
首先进入php安装目录
php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件
php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记

25.使用正则表达式提取一段标识语言(html或xml)代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有空格等)。此处假设需提取test标签的attr属性值,请自行构建包含该标签的串(腾讯)
编写如下函数:

<?php
    header("content-type:text/html;charset=utf-8");

    function getAttrValue($str,$tagName,$attrName){
        $pattern1="/<".$tagName."(\\s+\\w+\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\9))*\\s*>/i";

        $arr=array();
        $re=preg_match($pattern1,$str,$arr);

        if($re){
            echo"<br/>\$arr[6]={$arr[6]}";
        }else{
            echo"<br/>没找到。";
        }
    }

    // 示例
    $str1="<test attr='ddd'>";
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd
    $str2="<test2 attr='ddd'attr2='ddd2't1=\"t1 value\"t2='t2 value'>";
    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value
?>
26.What does the following code do?Explain what's going on there.$date='08/26/2003';print ereg_replace(“([0-9]+)/([0-9]+)/([0-9]+)”,\2/\1/\3,$date);(Yahoo)
这是把一个日期从MM/DD/YYYY的格式转为DD/MM/YYYY格式。
输出26/08/2003

27.What function would you use to redirect the browser to a new page?(Yahoo)
A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir()这不是一个PHP函数,会引致执行错误。
header()这个是正确答案,header()函数发送头信息,可以用来使浏览器转向到另一个页面,例如:header("Location:http://www.search-this.com/")。
location()这不是一个PHP函数,会引致执行错误。
redirect()这不是一个PHP函数,会引致执行错误。

28.When turned on____________will_________your script with different variables from
HTML forms and cookies.(腾讯)
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C

29.一个函数的参数不能是对变量的引用,除非在php.ini中把____设为on。
allow_call_time_pass_reference
是否启用在函数调用时强制参数被按照引用传递

30.在HTML语言中,页面头部的meta标记可以用来输出文件的编码格式,以下是一个标准的meta语句<META http-equiv='Content-Type'content='text/html;charset=gbk'>,请使用PHP语言写一个函数,把一个标准HTML页面中的类似meta标记中的charset部分值改为big5。(新浪)
请注意:
(1)需要处理完整的html页面,即不光此meta语句
(2)忽略大小写
(3)'和"在此处是可以互换的
(4)'Content-Type'两侧的引号是可以忽略的,但'text/html;charset=gbk'两侧的不行
(5)注意处理多余空格
编写正则表达式如下:
$reg1="/(<meta\\s*http-equiv\\s*=\\s*(['\"]?)Content-Type(\\2)\\s*content\\s*=\\s*(['\"])text\/html;charset=)(UTF-8)(\\4)(\\s*\/?>)/i";

31.PHP中如何判断一个字符串是否是合法的日期模式:2007-03-13 13:13:13。要求代码不超过5行。(酷讯)
<?php
    function checkDateTime($data){
        if (date('Y-m-d H:i:s',strtotime($data)) == $data) {
            return true;
        } else {
            return false;
        }
    }

    // 示例
    $data = '2015-06-20 13:35:42';
    var_dump(checkDateTime($data));//bool(true)

    $data = '2015-06-36 13:35:42';
    var_dump(checkDateTime($data));//bool(false)
?>
32.PHP中,如何获得一个数组的键值?(酷讯)
使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。
使用array_keys()则可以得到数组中所有的键名。
使用foreach结构foreach($arr as $key=>$value)可以通过$key和$value分别获取键名和值。

33.如果模板是用smarty模板。怎样用section语句来显示一个名为$data的组。比如:
$data=array(
0=>array('id'=>8,'name'=>'name1'),
1=>array('id'=>10,'name'=>'name2'),
2=>array('id'=>15,'name'=>'name3')
);
写出在模板页的代码?若用foreach语句又要怎样显示呢?

用section语句:

<{section name=test loop=$data start=0 step=1}>
id:<{$data[test].id}><br/>
name:<{$data[test].name}><br/><br/>
<{sectionelse}>
数组为空
<{/section}>
用foreach语句:

<{foreach from=$data item=test}>
id:<{$test.id}><br/>
name:<{$test.name}><br/><br/>
<{foreachelse}>
数组为空
<{/foreach}>
34.哪个选项会匹配下边的这个正则表达式?(/.*xyz\d/)
A.*****xyz
B.*****xyz1
C.******xyz2
D.*xyz
答案:C

35.以下哪个错误无法被标准的错误控制器获取?
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:B

36.以下哪种错误类型无法被自定义的错误处理器捕捉到?(奇矩互动)
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:C

37.(^\s)|(\s$)这个正则表达式作用是:__________;
匹配以0个或多个空白符开头或者0个或多个空白符结尾的字符串

38.编写函数取得上一月的最后一天
<?php
    date_default_timezone_set('PRC');

    /**
     * 获取给定月份的上一月最后一天
     * @param $date string 给定日期
     * @return string 上一月最后一天
     */
    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));
    }

    // 测试
    echo get_last_month_last_day();
    echo "<br />";
    echo get_last_month_last_day("2013-3-21");
?>
39.在很多时候,我们可以通过apache的主配置文件来设置对test目录的访问权限控制,如http://IP/test请问如果需设置test下的一个子目录的访问控制权限,是否可以在主配置文件中修改,如果不可以应如何解决。
可以,还可以在需要控制的子目录下创建.htaccess文件,写入访问控制。

40.如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方?
从以下几个方面考虑:

数据库中库和表都用utf8编码
php连接mysql,指定数据库编码为utf8 mysql_query(“set names utf8”);
php文件指定头部编码为utf-8header(“content-type:text/html;charset=utf-8”);
网站下所有文件的编码为utf8
html文件指定编码为utf-8<meta http-equiv="Content-Type"content="text/html;charset=utf-8"/>
41.在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
urlencode()

42.写出两种对变量加密的函数?
md5($str);
sha1($str);

43.如何把2009-9-2 10:30:25变成unix时间戳?
<?php
    date_default_timezone_set("PRC");

    // 将字符串转成Unix时间戳
    $unix_time = strtotime("2009-9-2 10:30:45");
    echo $unix_time;
    echo "<br />";

    // 格式化Unix时间戳为正常时间格式
    echo date("Y-m-d H:i:s",$unix_time);
?>
44.如何把一个GB2312格式的字符串装换成UTF-8格式?
<?php
    iconv('GB2312','UTF-8','悄悄是别离的笙箫');
?>
45.如果需要原样输出用户输入的内容,在数据入库前,要用哪个函数处理?
htmlspecialchars或者htmlentities

46.写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等

47.了解MVC模式吗?请写出三种以上目前PHP流行的MVC框架名称(不区分大小写)
FleaPHP、Zend Framework、CakePHP、Symfony、ThinkPHP、YII、CodeIgniter等

48.php中WEB上传文件的原理是什么,如何限制上传文件的大小?
上传文件的表单使用post方式,并且要在form中添加enctype='multipart/form-data'。
一般可以加上隐藏域:<input type=hidden name='MAX_FILE_SIZE' value=dddddd>,位置在file域前面。
value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。
使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。

限制上传文件大小的因素有:

客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。
服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。
自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。
49.简述UBB code的实现原理。(YG)
UBB代码是HTML的一个变种,通过程序自定义我们的标签,比如“[a]PHP中UBB的使用[/a]”这样的标签,其实质就是查找[a][/a]标签,将其替换成的标准html,说白了,就是将标准的html标记通过技术手段使其简化,其输出出来的结果还是标准的html。
明白了ubb的原理,那么再制作一个简单的ubb编辑器就不难了,和fck之类的编辑器比较起来,ubb代码最大的优点就是代码简单,功能很少,简单的ubb只需要一个文件,而且ubb标签可以自己来定义,更改起来很方便,在php中就是利用替换函数就可以将
html进行标签化,输出时进行标签的转化。

50.怎么把文件保存到指定目录?怎么避免上传文件重名问题?
可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成将文件保存到指定目录。
可以通过上传的文件名获取到文件后缀,然后使用时间戳+随机数+文件后缀的方式为文件重新命名,这样就避免了重名。

51._____函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。(奇矩互动)
debug_print_backtrace()

52.在Smarty模板语法中怎么能遍历数组$a=array(array('id'=>0),array('id'=>1),array('id'=>2),……)id=>0-10000,怎么判断当id=>500,让输出的值在HTML里变为红色?(亿邮)
设数组分配过来的数组名为$ids

{section name=temp loop=$ids}
    {if $ids[temp].id==500}
        <span style=‘color:#f00;’>{$ids[temp].id}</span>
    {esle}
        {$ids[temp].id}
    {/if}
{/section}
53.在Smarty模板语法中如何获取当前时间,并且使用Y-m-d H:i:s的格式输出?(亿邮)
使用{$smarty.now}来获取当前时间,得到的是unix系统时间戳
使用变量调节器进行格式化,如下:
{$smarty.now|date_format:“%Y-%m-%d%H:%M:%S”}

54.在Smarty模板语法中如何获取php的全局环境变量(亿邮)
$smarty.get.变量 #显示通过get方式传过来的指定变量的值
$smarty.post.变量 #显示通过post方式传过来的指定变量的值
$smarty.cookies.变量 #显示通过cookie中指定变量的值
$smarty.server.SERVER_NAME #显示server变量值,$_SERVER系列变量
$smarty.env.PATH #显示系统环境变量值,$_ENV系列变量
$smarty.session.变量 #显示session中指定变量的值
$smarty.request.变量 #显示通过post、get、cookie中指定变量的值

55.在Smarty模板中如何用自定义函数(亿邮)
使用模板分隔符包含,传递参数则使用HTML属性的方式,例如:
{html_image file="pumpkin.jpg"}

56.列举出你所知道的php系统函数库例如,数学函数库(亿邮)
mysql,gd,pdo,XML,zip,filesystem,mail等

57.假如让你来写一个函数实现Utf-8转gb2312,那么函数的名称应该怎么命名?(亿邮)
utf8_to_gb2312或者utf8togb2312

58.请描述如下URL重写规则的用意。(卓望)
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteBase/
RewriteRule./index.php[L]
</IfModule>
如果REQUEST_FILENAME文件存在,就直接访问文件,不进行下面的rewrite规则,
如果REQUEST_FILENAME目录存在,就直接访问目录,不进行下面的rewrite规则,
RewriteRule./index.php[L]的意思是把所有的请求都给index.php处理。

59.Warning:Cannot modify header information-headers already sent by(output started at D:\src\init.php:7)in D:\src\init.php on line10通常什么情况下php会报该警告信息?(卓望)
一般是在header、set_cookie以及session_start函数前面有输出(包括空格)的情况下,会报该警告信息。

【面试】php面试题之五——PHP综合应用(高级部分)
转载 2016年04月17日 18:56:52 标签:php /面试 5058
五、PHP综合应用
1.写出下列服务的用途和默认端口(新浪网技术部)
ftp、ssh、http、telnet、https

ftp:File Transfer Protocol,文件传输协议,是应用层的协议,它基于传输层,为用户服务,它们负责进行文件的传输,其默认端口是21。
ssh:Secure Shell,安全外壳协议,建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,其默端口是22。
http:hypertext transport protocol,超文本传送协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议,其默认端口是80。
telnet:Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力,其默认端口是23。
https:Hypertext Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,用于安全的HTTP数据传输,它的主要作用可以分为两种:
一种是建立一个信息安全通道,来保证数据传输的安全;
另一种就是确认网站的真实性,其默认端口是443。
2.你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?(腾讯)
脚本执行时间,启用xdebug,使用WinCacheGrind分析。
数据库查询,mysql使用EXPLAIN分析查询,启用slow query log记录慢查询。

[!!!]3.对于大流量的网站,您采用什么样的方法来解决访问量问题?
确认服务器硬件能否支持当前的流量
对于普通的pc server来说,它能够独立支持每天10万个独立ip访问,如果访问量过大,最好更好性能更高的专用服务器。
优化数据库的访问服务器的负载过大,一个重要的原因就是CPU和内存负载过高,而读写数据在这块占据较多的资源。可以从页面静态化、memcache缓存和mysql优化几个方面着手。
禁止外部盗链
占用较大的流量,防盗链,使用reference来判断一下。如果是图片的话,使用添加水印即可很好的防止。
控制大文件的下载
最好把文件下载的容量控制为相对较小的一个值,如果有大文件下载,最好使用专用的服务器。
使用多台主机实现分流,集群
使用流量分析软件进行分析统计谷歌和百度
4.请简单阐述您最得意的开发之作
根据实际情况自由发挥

5.谈谈asp,php,jsp的优缺点
ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和运行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script作为自己的开发语言。
PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C、Java和Perl语言的语法,并结合自己的特性,使WEB开发者能够快速地写出动态生成页面。它支持目前绝大多数数据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。
JSP是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP和PHP的一个通病-----脚本级执行(据说PHP4也已经在Zend的支持下,实现编译运行)。Sun公司借助自己在上的不凡造诣,将Java从Java应用程序和Java Applet之外,又有新的硕果,就是Java Server Page。JSP可以在Serverlet和JavaBean的支持下,完成功能强大的站点。
三者都提供在HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但JSP代码被编译成Servlet并由Java虚拟机解释执行,这种编译操作仅在对JSP页面的第一次请求时发生。
在ASP、PHP、JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的HTML页面只依赖于Web服务器,而ASP、PHP、JSP页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。
ASP、PHP、JSP三者都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。

6.请举例说明在你的开发过程中用什么方法来加快页面的加载速度。
要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器,使用代码优化工具等。

7.Is PHP better than Perl?–Discuss.(Yahoo)
我们不要为一个简单的问题引发一场舌战,为工作选择适合的语言,不要为工作迁就语言。Perl十分适合用作命令行工具,虽然它在网页应用上也有不错的表现,但是它的真正实力在命令行上才能充分发挥。同样地,PHP虽然可以在控制台的环境中使用,但是它在网页应用上有更好的表现,PHP有大量专门为网页应用而设计的函数,Perl则似乎以命令行为设计之本。

8.What's the difference between the way PHP and Perl distinguish between arrays and hashes?(Yahoo)
这正是为何我老是告诉别人选择适当的编程语言,若果你只用一种语言的话你怎么能回答这道问题?这道问题很简单,Perl所变量都是以@开头,例如@myArray,PHP则沿用作为所有变量的开头,例如myArray。
至于Perl表示散列表则用%,例如%myHash,PHP则没有分别,仍是使用,例如myHash。

9.How do you debug a PHP application?(Yahoo)
使用Xdebug或者Advanced PHP Debugger

10.PEAR中的数据库连接字符串格式是____。
$dsn='mysql://username:password@localhost/test'
$options=array(
    'debug'=>2,
    'portability'=>DB_PORTABILITY_ALL,
)
DB::connect($dsn,$options)//其中options参数是可选的。
PEAR是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写。它是一个PHP扩展及应用的一个代码仓库,PEAR处理数据库的模块是PEAR DB。

11.如何实现PHP、JSP交互?
题目有点含糊不清,SOAP,XML_RPC,Socket function,CURL都可以实现这些,如果是考虑PHP和Java的整合,PHP内置了这种机制(如果考PHP和.NET的整合,也可以这么回答)。
PHP提供了支持JAVA的类库文件,或者通过HTTP协议来交互数据。

[!!!]12.apache+mysql+php实现最大负载的方法
问的太笼统,生成静态html页面,squid反向代理,apache,mysql的负载均衡。
可以采取数据缓存的方法,我们通常在统计数据的时候,需要在原始数据的基础上经过计算等一系列操作,才会得到最终的结果,如果每做一个查询都需要这样一系列操作,当数据量大时,势必会带来很多问题。可以建立一个结果表,写一个脚本,用crontab定时触发脚本去原始表取数据,计算,写入到结果表,前端查询从结果表取数据,这也是比较常用的一种做法。
采用分布式,多个apache,多个mysql,其实就是dns负载均衡,dns根据当前用户解析几个ip的ping值,将用户转移到某一台最快的服务器,或者平均分配。
money不是问题的话,可以考虑F5硬件负载均衡!
可以使用Microsoft Windows Server系统的负载均衡设置
13.已知姓名A,姓名B,给一个求他们缘份的算法(51.com)
开放性题目,没有固定的算法,可以通过计算两个名字的笔画差来确定缘分指数。

14.你觉得在PV10W的时候,同等配置下,LUNIX比WIN快多少?(51.com)
不做优化的情况下一样。

[!!]15.Ajax,数据库触发器,GUI,中断机制的共同思想。谈一谈该种思想(机制)(百度)
主要就是异步,主进程不会被一个异步任务阻塞,当进程发出命令之后,继续执行主任务,不用等待子任务执行完,这样效率更高。
数据库触发器和中断机制是数据库自动完成的,而ajax触发器是用户激发的。ajax把GUI和数据库异步优化。

16.把一篇英文文档中所有单词的首字母转为大写,文档存在doc.txt中。可以在多种编程语言中选择(C\C++,JAVA,PHP...)写出你的思路,尽量优化你的程序。(百度)
$str=file_get_contents('doc.txt');
$str=ucwords($str);
file_put_contents('doc.txt',$str);
17.防止SQL注射漏洞一般用_____函数
addslashes

18.综合运用,PHP+MySQL编程,文件操作(CBSI)以下请用PHPMYADMIN完成
(1).创建新闻发布系统,表名为message有如下字段

字段名 描述
id  文章id
title   文章标题
content 文章内容
category_id 文章分类id
hits    点击量
创建表语句如下:

CREATE TABLE message(
id iNT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200)NOT NULL DEFAULT‘’,
content TEXT,
category_id INT UNSIGNED NOT NULL DEFAULT 0,
hits INT UNSIGNED NOT NULL DEFAULT 0
)engine=InnoDB default charset=utf8
(2).同样上述新闻发布系统:表comment记录用户回复内容,字段如下

字段名 描述
comment_id  回复id
id  文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
文章id文章标题点击量回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
查询语句如下:

SELECT message.id AS id,title,hits,IF(comment.id is NULL,0,count(*))AS number
FROM message
LEFT JOIN comment
ON message.id=comment.id
GROUP BY message.id
(3).上述内容管理系统,表category保存分类信息,字段如下

字段名 描述
category_id int(4)not null auto_increment;
categroy_name   varchar(40)not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单

function categoryList(){
    $result=mysql_query("select category_id,category_name from category")or die("Invalid
    query:".mysql_error());
    echo"<select name='category'value=''>";
    while($row=mysql_fetch_array($result)){
        echo"<option value='".$row['category_id']."'>".$row['category_name']."</option>";
    }
    echo"</select>";
}
文件操作部分:上述内容管理系统,用户提交内容后,系统生成静态HTML页面,写出实现的基本思路。
要生成静态HTML页面,需要使用输出缓冲output buffering及文件操作,首先使用ob_start()函数开启输出缓冲,在页面内容执行完成时,使用ob_get_contents()函数获取保存在输出缓冲区中的内容,然后使用file_put_contents()函数,生成静态HTML页面即可。

19.请问cgi和fastcgi有什么不同,你在什么情况下会选择哪个?(酷讯)
原理一样,都是利用标准输入输出流处理HTTP之类的文本协议,都是通过多进程模式处理多请求。不同之处在于FastCGI的一个进程处理完一个请求之后重置状态并挂起,待下一个请求来时继续处理;而CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。

20.zend optimizer是什么?(酷讯)
Zend Optimizer可以加速PHP脚本的执行,提高PHP应用程序的执行速度。实现的原
理是对那些程序在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。
一般情况下,执行使用Zend Optimizer的PHP程序比不使用的要快40%到100%。这意
味着网站的访问者可以更快的浏览网页,从而完成更多的事务,创造更好的客户满意度。
Zend Optimizer还可以给用Zend加密的文件解密。

[!!]21.列举web开发中的安全性问题
sql注入攻击。
数据库操作安全,UPDATE、DELETE、INSERT的操作没有限制用户操作权限,这将是一件很危险的事情。
没有验证用户http请求的方式POST或者GET,GET请求被合法通过。
没有验证表单来源的唯一性,不能识别是合法的表单提交还是黑客伪造的表单提交。
XSS攻击。

[!]22.如何通过php程序防止外部页面提交表单?编写一段代码
<?php
    session_start();
    if(isset($_POST['name'])&&!empty($_POST['name'])){
        if($_POST['check']==$_SESSION['check']){
            echo'正常访问';
            }else{
            echo'外部访问';
        }
    }
    $token=md5(uniqid(rand(),true));
    $_SESSION['check']=$token;
?>
<form method="post"action="">
<input type="text"name="name">
<input type="hidden"name="check"value="<?php echo$token;?>">
<input type="submit">
</form>
[!]23.如果某段与数据库交互的程序运行较慢你将如何处理?
一是首先提高数据库的查询速度,比如增加索引,优化表的结构。
二是优化程序代码,如果查询比较多,可以尽量用条件查询,减少查询语句,比如能用一条查询语句就不用两条。
三就是提高服务器的速度,优化服务器,把不必要的进程关掉。

24.以下代码会产生什么问题,如何解决?

<?php
$dir=$_POST['dir'];
include("/usr/local/apache/htdoc/inc/$dir");
?>
不安全,必须对用户的输入进行验证和过滤。

[!!]25.请简述操作系统的线程与进程的区别。列举LINUX下面你使用过的软件?
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的���同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
Linux下常用软件,vim,emacs,tar,openoffice,putty,wget,links,ssh等。

26.用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);</script>),php端接收数据的时候,应该如何处理?
可以对用户输入数据进行转义,如htmlspecialchars($_POST[‘title’]);

[!!!]27.使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce是把所有的数据保存在内存当中,采用hash表的方式,每条数据由key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。

28.一个Web开发团队开发中,大致说说你所了解的所有成员的分工合作情况
每个公司的分工合作情况各不相同,一般会有策划,美工,前端开发,后台开发,维护,优化和推广等。

[!!!]29.假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV 300万左右的中型网站?
参考结构:
3台Web服务器,两台MySQL数据库服务器,采用Master/Slave同步的方式减轻数据库负载,Web服务器可以结合Memcache缓存来减少负载,同时三台Web服务器内容一致,
可以采用DNS轮询的方式来进行负载平衡。

30.谈谈对你PHP认识或你擅长的技术?
自由发挥

[!!!]31.什么是Ajax?Ajax的原理是什么?Ajax的核心技术是什么?Ajax的优缺点是什么?
Ajax是Asynchronous JavaScript and XML的缩写,是JavaScript、XML、CSS、DOM等多个技术的组合。
Ajax的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以Ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
Ajax的核心技术是XMLHttpRequest,它是JavaScript中的一个对象。
Ajax的优点是:
(1).减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;
(2).在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。
Ajax的缺点是不利于SEO推广优化,因为搜索引擎无法直接访问到Ajax请求的内容。

32.请用PHP实现一个函数,将一个2进制数的无符号非负电位字符串非浮点字符串转成一个10进制数,返回该10进制数。不许使用BIN等系统内置函数(嘀嗒团)
题目意思有些模糊,题目本意可能是将一个无符号的2进制字符串转成10进制数,如'10100010',应该得到10100010的十进制表示162。

<?php
    function bin2dec($bin){
        $temp = strrev($bin);
        $result = 0;
        for ($i=0,$len = strlen($temp); $i < $len; $i++) {
            $result += pow(2,$i) * $temp[$i];
        }
        return $result;
    }

    $a = '10100010';
    echo bin2dec($a);//结果162
?>
33.请使用PHP设计一个函数,对学生英语考试得分从高到低排序,输入时所有学生的学号和考试得分,返回排好序的考试得分和对应学生的学号。考试满分为100,得分可能会有小数,由于考试评分要求,小数位只会是0或0.5
要求:
请不要使用qsort等系统内置排序函数
请使用你认为最快最优的方法实现该函数并使排序的性能最高。(嘀嗒团)

<?php
    // 快速排序实现
    function array_sort(&$arr,$left,$right){
        if ($left < $right) {
            $pivot = $arr[$left];
            $low = $left;
            $high = $right;

            while ($low < $high) {
                while ($low < $high && $arr[$high]['score'] >= $pivot['score']) {
                    $high--;
                }
                $arr[$low] = $arr[$high];
                while ($low < $high && $arr[$low]['score'] <= $pivot['score']) {
                    $low++;
                }
            }
            $arr[$low] = $pivot;
            array_sort($arr,$left,$low-1);
            array_sort($arr,$low+1,$right);
        }
    }

    $english = array(
            array('sid'=>1,'score'=>76),
            array('sid'=>2,'score'=>93),
            array('sid'=>3,'score'=>68.5),
            array('sid'=>4,'score'=>82.5),

        );
    $left = 0;
    $right = count($english) - 1;
    array_sort($english,$left,$right);

    print_r($english);
?>
34.需要设置一个有效期为31天,的memcach值,请补充下面的代码(奇矩互动)
<?php
    $memcache_obj=new memcache
    $memcache_obj->connect(‘memcache_host,11211’);
    $memcache_obj->set(‘varKey’,’varValue’,0,____);
?>
time()+36002431

35.你从_____时候开启接触PHP的?从可以写出链接mysql数据库查询更改数据到现在大约有____时间?(奇矩互动)
根据自身情况填写
36.现在请你设计一个留言板系统,请简要的写出你设计的其中分页算法的思路。(奇矩互动)
主要是数据库的设计系统的架构思想
分页算法的原理是limit offset,pagesize其中,pagesize是设定好的,而offset则要通过计算得到,不同的页数对应的offset也不同,设当前页为currentpage,则offset=(currentpage-1)*pagesize。

37.假设有"123abc456def789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。(小米)
要求:
(1).和标记不得计算在长度之内。
(2).截取后的字符串,要保留原有标签,不过如果最后有一个标签没有闭合,则
去掉其开始标签。
示例:题中的字符串,要截取长度5,则返回的字符串应该为123ab,要截取长度8,
应返回123abc45。

 <?php
    function cut($str,$len=null){
        $last=0;
        $str_len=strlen($str);
        $result='';
        $result_len=0;
        do{
            $pattern='/<em>(.*?)<\/em>/i';
            $num=preg_match($pattern,$str,$m,PREG_OFFSET_CAPTURE,$last);
            if($num){
                $result.=substr($str,$last,
                $add_len=($m[0][1]-$last<$len-$result_len)?$m[0][1]-$last:$len-$result_len);
                $result_len+=$add_len;
                $last=$m[0][1]+strlen($m[0][0]);

                if($result_len<$len){
                    if($len-$result_len>=strlen($m[1][0])){
                        $result.=$m[0][0];
                        $result_len+=strlen($m[1][0]);
                    }else{
                        $result.=substr($m[1][0],0,$len-$result_len);
                        break;
                    }
                }
            }else{
                $result.=substr($str,$last,$len-$result_len);
                break;
            }
        }while($last<$str_len&&$result_len<$len);
        return$result;
    }
?>
38.请仅使用一次正则替换,将下面内容
private long contract_id;
private string contract_number;
private string customer_name;
替换为
private long contractId;
private string contractNumber;
private string customerName;(鑫众人云)

<?php
    $str = "private long contract_id;
    private string contract_number;
    private string customer_name;";

    $pattern = '/_(\w)/em';
    $result = preg_replace($pattern,"strtoupper('\\1')",$str);
    echo $result;
?>
[!!]39.列举流行的Ajax框架?说明Ajax实现原理是什么及json在Ajax中起什么作用?(鑫众人云)
流行的Ajax框架有jQuery,Prototype,Dojo,MooTools。
Ajax的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以Ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
在使用Ajax时,涉及到数据传输,即将数据从服务器返回到客户端,服务器端和客户端分别使用不同的脚步语言来处理数据,这就需要一种通用的数据格式,XML和json就是最常用的两种,而json比XML更简单。

40.在UNIX或windows系统内以()为单位分配资源以()单位分配时间调度(亿邮)
进程,时间片

41.正则表达式中?+的作用分别是什么(亿邮)
?+都有用来匹配数量的,*表示0或多个,?表示0个或1个,+表示1个或多个。
42.写出你所知道的XML解析器(亿邮)
DOM,SAX,SimpleXML,其中前两种是通用的解析器,和具体语言无关,而SimpleXML则是PHP提供的解析器。

43.在程序中表示时间可以使用哪几种变量类型(亿邮)
在PHP中可以使用int或字符串来表示(php中没有日期时间类型),在MySQL中,可以使用int,date,datetime,timestamp。

44.使用Utf-8编码存储中文姓名,一般会分配多少个字节的存储空间(亿邮)
UTF-8编码是可变长编码,对于中文而言,一个字符使用3个字节来存储。

45.用正则表达式判断$a是否是一个以半角逗号分隔的多个手机号码组成的字符串,是输出yes(卓望)
<?php
    $pattern = '/^1[358]\d{9}(,1[358]\d{9})*$/';
    $subject = '13507224985,13833103237';

    if (preg_match($pattern,$subject)) {
        echo "yes";
    }
?>
46.如果要求每隔5分钟执行一次脚本five.php,如何实现?(卓望)
用到的函数ignore_user_abort(),set_time_limit(0),sleep($interval),此代码只要运行一次后关闭浏览器即可。

<?php
    ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
    set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去

    $interval=60*5;//每隔5分钟运行
    do{
        //这里是你要执行的代码
        sleep($interval);//等待5分钟
    }while(true);

?>
47.假设有一个博客系统,数据库存储采用mysql,用户数量为1000万,预计文章总数为10亿,每天有至少10万的更新量,每天访问量为5000万,对数据库的读写操作的比例超过10:1,你如何设计该系统,以确保其系统高效,稳定的运行?提示:可以从数据库设计,系统框架,及网络架构方面进行描述,可以自由发挥(新浪网技术部)
相关题目:我们希望开发一个门户系统,数据存储采用MySQL,用户数量为1000万,预计文章总数为10亿,日更新量至少为10万,日访问量为5000万,对数据库的读写操作比例超过10:1,你如何设计该系统,以确保其高效,稳定的运行?(提示:可以从数据库设计,系统框架及网络架构方面进行描述,自由发挥)(鑫众人云)
项目设计:假设有一个包含Tag功能的博客系统,数据库存储采用mysql,用户数量为1000万,预计文章总数为10亿,每天有至少10万的更新量,每天访问量为5000万,对数据库的读写操作的比例超过10:1。你如何设计该系统,以确保其系统高效,稳定的运行?提示:可以从数据库设计,系统框架,及网络架构方面进行描述,可以写代码/伪代码辅助说明,可以自由发挥(小米)


php面试题之三——PHP网络编程(高级部分)
转载 2016年04月17日 19:26:13 标签:php 2138
三、PHP网络编程
[!!!]1.禁用COOKIE后SEESION还能用吗?(51.com笔试题)
可以,COOKIE和SESSION都是用来实现会话机制的,由于http协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有这么一个机制----会话机制。
COOKIE:将会话信息的保存到浏览器端。
SESSION:将会话信息保存到服务器端。

SESSION默认情况下是基于COOKIE的,对于SESSION来说,每生成一个SESSIONID,都会将其发送到浏览器端,让后将其保存到cookie当中。
如果禁用了COOKIE,则基于COOKIE的SESSION不好使了,我们可以使用get,传递SID,或者直接开启透明的SID(此时需要关闭基于cookie的SESSION配置项)。

[!!!]相关题目:SESSION与COOKIE的区别?
COOKIE保存在客户端,而SESSION则保存服务器端。
从安全性的角度来讲,SESSION的安全性要高。
从保存内容的类型的角度来讲,COOKIE只保存字符串(及能够自动转换成字符串),而session则可以保存所有的数据类型。
从保存内容的大小的角度来讲,COOKIE保存的内容是有限制的,比较小,而SESSION基本上没有这个限制。
从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些。
2.请使用socket相关函数(非curl)实现如下功能:构造一个post请求,发送到指定httpserver的指定端口的指定请求路径(如http://www.example.com:8080/test)。请求中包含以下变量:
用户名(username):温柔一刀
密码(pwd):&123=321&321=123&
个人简介(intro):Hello world!
且该http server需要以下cookie来进行简单的用户动作跟踪:
cur_query:you&me
last_tm:...(上次请求的unix时间戳,定为当前请求时间前10分钟)
cur_tm:...(当前请求的unix时间戳)
设置超时为10秒,发出请求后,将http server的响应内容输出(腾讯)

参考代码:

<?php
    if($fp = fsockopen('localhost','80')){
        //连接成功
        $request_data="POST/2.php HTTP/1.1"."\r\n";//请求行
        $request_data.="Host:localhost"."\r\n";//host头信息
        $request_data.="User-Agent:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)"."\r\n";//host头信息

        $request_content="username=".urlencode('温柔一刀')
        ."&pwd=".urlencode('&123=321&321=123&')
        ."&intro=".urlencode("Hello world!");

        $request_data.="Content-Type:application/x-www-form-urlencoded"."\r\n";
        $request_data.="Content-Length:".strlen($request_content)."\r\n";
        $cur_query=urlencode("you&me");

        $last_tm=time()-10*60;
        $cur_tm=time();
        $request_data.="Cookie:cur_query=$cur_query;last_tm=$last_tm;cur_tm=$cur_tm"."\r\n";
        $request_data.="\r\n";//请求头信息结束时的空行

        //请求主体数据部分
        $request_data.=$request_content;
        //利用建立好的通道,将数据发送过去
        fwrite($fp,$request_data);//写入数据(发送数据)

        //读取数据
        while(!feof($fp)){//判断是否没有到文件末尾
            $resp_data=fgets($fp);
            echo$resp_data.'<br>';
        }
    }
?>
3.在HTTP 1.0中,状态码401的含义是________;如果返回“找不到文件”的提示,则可用header函数,其语句为__________;
未经授权:访问由于凭据无效被拒绝
header("HTTP/1.0 404 Not Found")

[!!]4.如何修改SESSION的生存时间?
要注意这里的生存时间指的是什么?
由于session默认是基于cookie的,也就是说使用session会话技术,首先是将session数据保存到服务器端,其次会将sessionID保存到浏览器端,保存在服务器端的session文件生命周期由php.ini中的session.gc_maxlifetime、gc_probability和gc_divisor来决定,而保存在客户端的sessionID由客户端cookie来决定。
默认其生存周期直到浏览器关闭,它也可以通过php.ini中的设置session.cookie_lifetime来控制,二者共同来决定session的生存时间,二者中的其中任意一个失效了,就会造成session失效,要根据自己的需求来决定是要从哪方面来修改其生存时间。

参考1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
参考2:

$savePath="./session_save_dir/";
$lifeTime=小时*秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
参考3:

session_start();
$lifeTime=24*3600;//保存一天
setcookie(session_name(),session_id(),time()+$lifeTime,"/");
5.How can you get round the stateless nature of HTTP using PHP?(Yahoo)
最主要的两个选择是SESSION和COOKIE。使用SESSION的方法是在每一页的开始加session_start(),然后利用SESSION来存取SESSION变量。至于COOKIE你只需记着一个原则:在输出任何文字之前调用setcookie()函数设置COOKIE,使用_COOKIE获取COOKIE变量。

6.PHP程序中如何设置当前页面的编码为utf-8?
header(“content-type:text/html;charset=utf-8”);

7.如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?
setcookie(‘username’,’jack’,time()+7243600);

[!!]8.一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少?
cookie的总数量没有限制,但是每个域名的COOKIE数量和每个COOKIE的大小是有限制的!
IE每个域名限制为50个。
Firefox每个域名cookie限制为50个。
Opera每个域名cookie限制为30个。
Safari/webkit貌似没有cookie限制。但是假如cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

不同浏览器间每个cookie文件大小也不同
Firefox和safari是4097个字节,包括名(name)、值(value)和等号。
Opera是4096个字节,包括:名(name)、值(value)和等号。
IE是4095个字节,包括:名(name)、值(value)和等号。

9.设置或读取session之前,需要做什么?
session_start()前面不能有任何输出,包括空行。

相关题目:使用setcookie函数前,需要注意什么?
前面不能有任何输出,包括空行。

10.请描述出七层网络模型的名称,由下到上(可以使用中文描述)
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

11.说说下面这些这些协议的全称和中文解释(提示:都是工作在应用层)SMTP、POP3、HTTP、FTP、DNS(小米)
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议
POP3(Post Office Protocol 3)邮局协议第3版
HTTP(Hypertext Transfer Protocol)超文本传输协议
FTP(File Transfer Protocol)文件传输协议
DNS(Domain Name System and Domain Name Service protocol)域名系统(服务)协议

[!!]12.COOKIE、SESSION的联系和区别,多台web服务器如何共享SESSION?
COOKIE和SESSION都是用于会话机制,COOKIE保存在客户端,而SESSION则保存在服务器端。
在默认情况下,SESSION机制是基于COOKIE的,每生成一个SESSIONID,都会将其发送到浏览器端,让后将其保存到COOKIE当中,在下次请求的时候,由浏览器携带这个COOKIE。
要想多台web服务器共享SESSION,可以利用MySQL数据库存储SESSION数据。

13.HTTP/1.0中,状态码200 301 304 403 404 500的含义(小米)
200 OK服务器成功处理了请求
301 Moved Permanently(重定向)请求的URL已移走
304 Not Modified(未修改)客户的缓存资源是最新的,要客户端使用缓存
403 Forbidden(禁止)请求被服务器拒绝了
404 Not Found未找到资源
Internal Server Error(内部服务器错误)服务器遇到一个错误,使其无法为请求提供服务

[!!!]14.请描述PHP(或其他语言)Session的运行机制,大型网站中Session方面应注意什么?(小米)
session机制是一种服务器端的机制,它将数据保存到服务器端。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端以cookie的形式保存。

session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时。另外就是小文件的效率问题,一般我们的session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差,我们可以采用改写session存储机制,比如存放到数据库中。

15.在子网掩码为255.255.255.248的局域网中能够同时使用的IP有多少个?(亿邮)
6个,255.255.255.248换算成二进制就是11111111.11111111.11111111.11111000
后面的三位用来表示主机,前面的29位用来表示网络。
三位表示主机,就是可以用来表示2^3=8个,再减去网络地址和广播地址,就是6个了。

16.简述Tcp协议的三次握手过程。(亿邮)
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状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。

17.你会用哪个函数设置当前内容的Content-Type?(卓望)
header函数

18.通过页面输入用户名abc和密码123登录到www.10086.cn,请写出该次请求的HTTP协议报文(包括请求行、消息报头、请求正文)。(卓望)
POST www.10086.cn HTTP/1.1
Accept:text/html,application/xhtml+xml,*/*
Referer:http://localhost/a.html
Accept-Language:zh-CN
User-Agent:Mozilla/5.0(compatible;MSIE 10.0;Windows NT 6.1;WOW64;Trident/6.0;
KB974487)
Content-Type:application/x-www-form-urlencoded
Accept-Encoding:gzip,deflate
Host:localhost
Content-Length:25
Connection:Keep-Alive


username=abc&password=123


1、SESSION 保存在服务器的哪里?
答:通过php.ini指定,可存在指定目录的文件中或内存中,或数据库中!

2、服务端是如何获取客户端的cookie?
答:服务器每次处理请求的进候都可以抓取头信息的cookie并设置返回,

3、如何实现SESSION共享,共享的原理是什么?
答:配置主从数据库,将SESSION存入主数据库中,常见的做法还有在各服务器端安装MEMCAHCE,将SESSION存入各MEMCACHE中,

4、请大致说出LVS搭建的过程,文件共享原理是什么?
5、网络共享服务器上传数据是向一台服务器上传?还是多台?如何实现同步?

6、说出你所知道的数据库设计范式?常用的建模工具是什么?(mysql建模工具)
答:1NF:每一条满足原子性,不可以分割;2NF:每一条记录要满足唯一性,3NF:字段不冗余,有时我们还需要反三范式,常用的建模工具:phpMyAdmin,navicat for mysql,DOS命令行;

7、如果你是项目经理,你如何管理你的项目团队的日常事宜?

8、主从数据库的配置,都需要哪些基本的条件,需要配置什么内容?
答:基本条件:二台以上数据库服务器,
配置流程:1.分别打开主从服务器的bin-log;从服务器+relaylog
2.在主服务器根据需求建立相应的帐号并授权;
3.从服务器使用己创建好的帐号连接主服务器读取二进制文件并分析后同步
配置项:主:log-bin=mysql-bin;server-id=num(int);binlog-format=mixd/statement/row/
从:log_bin=mysql-bin;server-id=num(int)//唯一;relay_log=mysql-relay-bin;log_slave_updates=1;relay_only=1;

9、说出你常用的版本控制器,SVN中需要配置哪几个配置文件
答:SVN,GIT,CVS;配置文件:mod_authz_svn.so mod_dav_svn.so移至服务器模块中并加载,配置权限,分配用户;

10、LVS 在项目运行之前需要注意哪些事项,或者说会出现什么问题?

11、ecshop为何出现字段冗余违犯设计模式,请说出为何这么做?
答:在某些环境下反三范式反而增加了效率,因此这么做!

12、常用mysql优化方式,尽可能多的说?
答:SQL语句优化;存储优化;数据库配置;服务器配置

13、memcache原理是什么?是否能存入2M的value?
答:采用C/S模式,协义是普通文本,基于libevent机制处理数据放在内存中;memcache最大只能存入1MB数据,memcache并非为存储大数据而生,但可以考虑在存储前将值先压缩或拆分成多值分配到多个key中!

14、什么是队列?排它锁,Myisam 死锁如何解决?
答:在默认情况下MYisam是表级锁,所以同时操作单张表的多个动作只能以队列的方式进行;
排它锁又名写锁,在SQL执行过程中为排除其它请求而写锁,在执行完毕后会自动释放;
死锁解决:先找到死锁的线程号,然后杀掉线程ID
       
15、请说出mysql常用存储引擎?memory存储引擎的特点?
答:Myisam、InnoDB、memory,memory的特点是将表存到内存中,数度快,重启后数据丢失!


16、如何最快速的插入5000条以上的数据?

答:先生成数据文件,在用sql语句导入


17、你用过多少开源框架?
答:TP/CI/ZF/YII


18、ecshop 购物车信息存放在哪里?
答:order_info;order_goods;order_action;

19、PHP生成页面缓存的原理
答:将缓存内容放入OB缓存中,在OB缓存结束或脚本执行完毕后放入到程序缓存未尾并返回!

20、你所知道的缓存技术有哪些,分别做下简单介绍
答:ob缓存,通过模板技术写入文件类缓存;memcache;redis;redis和memcache最显著的区别在于数据不仅并于内存中,同时还会在磁盘中生成文件,即使重启,数据亦可被加载;

21、HTTP 协议的原理,什么是全双工,什么是半双工?
答:HTTP协议是一种无状态的协义,直白的讲就是请求和响应,全双工是指请求和响应同时进行,半双工指单个执行;

22、ucenter通信原理?

答:就是某个应用登陆后,然后后台轮询发送给同步登陆的应用的回调文件 ,回调文件接收到用户ID之后,生成cookie或者session然后进入登陆模式。

23、Memcached的原理

答:memcached 是以守护程序方式运行于一个或多个服务器中,等待接收客户端的连接操作,客户端可以由各种语言编写(例如PHP)。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。

24、你用过多少种JS框架?举例说明优缺点
答:jQuery、prototype、dojo、ext、YUI;
jQuery:强大的DOM节点查询无人能出其左右,动画操方便; DOM封装的很好!高低版本兼容非常好
prototype:较早的jS库,对ajax支持较好,基于原型链面向对象很强大
dojo:更容易俣WEB页面具有动态能力;
ext:强大的UI操作高居榜首;
YUI:强大的类库,提供很多方法;

25、如何衡量AJAX的使用(何时使用AJAX)
答:AJAX既称无刷新技术,常用见的使用场景:表单验证,用户评分、点击;只要需要实时的与服务器交互时即可使用;
26、什么是推技术,实现原理是什么?
答:推技术又称COMET,即在客户请求时在服务器挂起长连接,一旦服务器有了新数据,它降立即反回给客户端,实时性好;

27、什么是垂直搜索,斯芬克斯中分词原理?
答:垂直搜索是指在特定的范围内搜索的上下文,搜索面只会越来越精细,而非越来越广泛;sphinx分词的原理:将文本拆分为多个单词从数据源的各个文档对像创建索引并将索引表存储于内存中!

28、sphinx中无法ha_sphinx.so是用来做什么的?
答:一个sphinx的存储模块;

29、PHP常用的合并数组的方式?
答:array_mergn;array_mergn_recursive;

30、回答PHP读取文件速度快,还是读取mysql的数据快?为何?
答:一般情况下读文件》读数据库;不同情况速度也会反向,如:数据库数据量很小,而同目录文件又非常多的情况下,读数据库大于读文件;

1 字符串”\r”,”\n”,”\t”,”\x20”分别代表什么

答案: “\r”代表的含义是: 
在Linux、unix 中表示返回到当行的最开始位置,在Mac OS 中表示换行且返回到下一行的最开始位置,相当于Windows 里的 \n 的效果。 
“\n”代表的含义是: 
在Windows 中表示换行且回到下一行的最开始位置。相当于Mac OS 里的 \r 的效果,在Linux、unix 中只表示换行,但不会回到下一行的开始位置。 
“\t”所代表的含义是: 
键盘上的“TAB”键,跳格(移至下一列)。 
“\x20”所代表的含义是:是32在ASCII表中16进制的表示。

2 以下语句输出的结果是什么

$a = 3;
echo "$a",'$a',"\\\$a","${a}","$a"."$a","$a"+"$a";
1
2
得到的结果是: 
3$a\$a3336

3 以下语句输出的结果是什么

setcookie("a","value");
print $_COOKIE['a'];
1
2
得到的结果是: 
value(若只是这两段编码运行,则会提示PHP Notice: Undefined index: a)

4 php中将当前页面重定向到另一个页面怎么写?

header();

5 什么是魔术引号(magic_quotes_gpc)? 
魔术引号(Magic Quotes)是一个自动将进入 PHP 脚本的数据进行转义的过程。提示:最好在编码时不要转义而在运行时根据需要而转义。

6 在类的方法中,如何调用其父类的同名方法? 
parent::方法名

7 php中如何取得get,post参数,和上传的文件

$_GET,$_POST,$_FILES
1
8 如何取得客户端的ip(要求取得一个int)

$_SERVER["REMOTE_ADDR"];ip2long进行转换
1
9 include和require的区别

require:出现错误后直接终止退出,程序不再执行 
include:包含一个不存在的文件,会提示警告程序会继续执行

10 extends的作用是什么 
类的继承

11 @test()和&test()的区别

@test()的作用是屏蔽test()方法中警告的作用 
&test()引用test()方法

12 array+array与array_merge()的区别 
二者之间的区别是: 
1 键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖) 
2 键名为字符时,+仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉,但array_merge()此时会覆盖掉前面相同键名的值

13 请列举最少3个php对象的魔术方法和说明它们的用途 
构造方法: __construct() 
析构方法__destruct() 
__get() 控制私有的受保护的未定义的成员属性的访问 
__set() 对私有的受保护的未定义的成员属性进行赋值控制 
__isset() 对私有的受保护的未定义成员属性进行isset和empty的判断控制 
等等

14 什么是fpm 
FastCGI Process Manager:FastCGI进程管理器

15 描述一下php开发中常见的几种攻击以及解决方案 
SQL注入: 
解决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。 
跨站点脚本攻击(XSS): 
strip_tags() 函数,这个函数可以清除任何包围在 HTML 标记中的内容 
或者使用htmlspecialchars() 函数。

16 echo intval(0.58*100) 输出的结果是57,试分析这是为什么? 
原因就是浮点数精度的问题。 
简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999…。这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333…。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数


PHP命名空间(Namespace)的使用详解
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结。

命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。

例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment。之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量。这时候调用它们Comment提供的方法是很好的做法,但是同时引入各自的Comment类显然是不行的,代码会出错,在另一个地方重写任何一个Comment也会降低维护性。那这时只能重构类名,我约定了一个命名规则,在类名前面加上模块名,像这样:Article_Comment、MessageBoard_Comment

可以看到,名字变得很长,那意味着以后使用Comment的时候会写上更多的代码(至少字符多了)。并且,以后如果要对各个模块增加更多的一些整合功能,或者是互相调用,发生重名的时候就需要重构名字。当然在项目开始的时候就注意到这个问题,并规定命名规则就能很好的避免这个问题。另一个解决方法可以考虑使用命名空间。


注明:

本文提到的常量:PHP5.3开始const关键字可以用在类的外部。const和define都是用来声明常量的(它们的区别不详述),但是在命名空间里,define的作用是全局的,而const则作用于当前空间。我在文中提到的常量是指使用const声明的常量。


基础
命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。

创建一个命名空间需要使用namespace关键字,这样:

复制代码代码如下:

<?php
 

//创建一个名为'Article'的命名空间
namespace Article;

?>


要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:

复制代码代码如下:

//例一
//在脚本前面写了一些逻辑代码
 

<?php

$path = "/";

class Comment { }

namespace Article;

?>

//例二
//在脚本前面输出了一些字符

<html></html>

发布了166 篇原创文章 · 获赞 58 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/qq285744011/article/details/103627367