php面试题之一——PHP核心技术(高级部分)
一、PHP核心技术
4.抓取远程图片到本地,你会用什么函数?(51.com笔试题)
file_get_contents或者curl
5.PHP的垃圾收集机制是怎样的(腾讯)
PHP可以自动进行内存管理,清除不再需要的对象。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
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,如何得到它的内容?
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系统中。
17.PHP如何实现页面跳转
方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。
header("Location:网址");//直接跳转
header("refresh:3;url=http://axgle.za.net");//三秒后跳转
32.PHP中,如何获得一个数组的键值?(酷讯)
使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。
使用array_keys()则可以得到数组中所有的键名。
使用foreach结构foreach($arr as $key=>$value)可以通过$key和$value分别获取键名和值。
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);
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(),就可以完成将文件保存到指定目录。
可以通过上传的文件名获取到文件后缀,然后使用时间戳+随机数+文件后缀的方式为文件重新命名,这样就避免了重名。
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面试题之二——Javascript(基础部分)
二、JavaScript部分
1. JS 表单弹出对话框函数是?获得输入焦点函数是?
弹出对话框函数:alert(), prompt(), confirm()
获得输入焦点函数:focus()
2. JS 的转向函数是?怎么引入一个外部 JS 文件?
转向使用window.location.href = ""
引入外部 js 使用<script src=""></script>
12. 如何添加 html 元素的事件,有几种方法,举例
(1).直接作为元素的属性,如<img onclick="alert( 'hello' );" src="hello.jpg">
(2).使用 DOM 0 级事件,简单,兼容性好,如 img.onclick = function(){}
(3).使用 DOM 2 级事件,功能更强大,在非 IE 等标准浏览其中,使用 addEventListener,在IE 浏览器中则使用 attachEvent 来实现。
13. JavaScript 能否定义二维数组,如果不能你如何解决?
JavaScript 不支持二维数组定义,可以用 arr[0] = new array()来解决。
16. js 中网页前进和后退的代码
前进: history.forward();或者 history.go(1);
后退: history.back ();或者history.go(-1);
17. 请写出一条至少 3 个节点的 DOM 树 (YG)
<script type="text/javascript">
var div = document.createElement("div");
var a = document.createElement("a");
a.href = "http://www.baidu.com";
var span = document.createElement("span");
span.innerHTML = "百度";
a.appendChild(span);
div.appendChild(a);
document.body.appendChild(div);
</script>
结果 HTML:
<div><a href="http://www.baidu.com"><span>百度</span></a></div>
18. 实现点击按钮弹出窗口的代码 (YG)
document.getElementById( 'button' ).onclick = function(){
window.open ('page.html');
}
其中,button 是按钮的 id,page.html 是要弹出的窗口页面。
19. JavaScript 包括那些基本数据类型?(小米)
JavaScript 中包括 5 种基本数据类型,分别是 Number,String,Boolean,Null 和 Undefined。
php面试题之三——PHP语言基础(基础部分)
三、PHP语言基础
1. strlen( )与 mb_strlen( )的作用分别是什么(新浪网技术部)
strlen和mb_strlen都是用于获取字符串长度。
strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数。如果是多字节编码,如 gbk 和 utf-8,使用 strlen 得到是该字符的总字节数;
可以使用mb_strlen获取其字符个数,使用mb_strlen 要注意两点,一是要开启 mbstring 扩展,二是要指定字符集。
总结:
strlen函数不管是字符串是单字节编码还是多字节编码,函数返回的结果都是字符串的总字节数。
mb_strlen函数当字符串是单字节编码时,函数返回的结果是字符串的总字节数。当字符串是多字节编码时,函数返回的结果是字符串的个数。
mb_strlen函数在没有指定字符编码时,表示使用默认字符编码,即单字节编码,函数返回的是字符串的总字节数。
PHP默认是单字节编码(内部字符编码),多字节编码方式有gbk、utf-8等。
相关题目 1:实现中文字串截取无乱码的方法。
方法一,使用 php 内置函数 mb_substr()
4. 写出下列几个预定义全局变量的作用 (新浪网技术部)
$_SERVER['DOCUMENT_ROOT']//当前运行脚本所在的文档根目录
$_SERVER['HTTP_HOST ']//当前请求的 Host: 头部的内容
$_SERVER['REMOTE_ADDR']//正在浏览当前页面用户的 IP 地址
$_SERVER['HTTP_REFERER']//链接到当前页面的前一页面的 URL 地址
$_SERVER['SERVER_NAME']//当前运行脚本所在服务器主机的名称
$_FILES //包含有所有上传的文件信息
S_FILES['userfile']['name']//客户端机器文件的原名称
$_FILES['userfile']['type']//文件 MIME 类型,如果浏览器提供此信息的话,如“image/gif”。
$_FILES['userfile']['size']//已上传文件的大小,单位为字节
$_FILES['userfile']['tmp_name']//文件被上传后在服务端储存的临时文件名
$_FILES['userfile']['error']//和该文件上传相关的错误代码
5. include 和 require 都能把另外一个文件包含到当前文件中,他们有什么区别?Include 和include_once 又有什么区别?(新浪网技术部)
二者区别只有一个,那就是对包含文件的需求程度。include 就是包含,如果被包含的文件不存在的话,那么则会提示一个错误,但是程序会继续执行下去。而 require 意思是需要,如果被包含文件不存在或者无法打开的时候,则会提示错误,并且会终止程序的执行。
这两种结构除了在如何处理失败之外完全一样。
once 的意思是一次,那么 include_once 和 require_once 表示只包含一次,避免重复包含。
相关题目 1:What is the difference between include & include_once? include & require?(Yahoo)
相关题目 2:语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区
别是_;为了避免多次包含同一文件,可以用语句_来代替它们。
在如何处理失败时,include()产生一个警告而require()则导致一个致命错误;require_once()/include_once()
相关题目 3:What functions can you use to add library code to the currently running script?(Yahoo)
include、require
7. 简述 POST 和 GET 传输的最大容量分别是多少? (51.com 笔试题)
POST 根据你 php.ini 文件配置(默认是 8M)
GET 的话大小限制在 2KB
相关题目:表单中 get 与 post 提交方法的区别?
get 是发送请求 HTTP 协议通过 url 参数传递进行接收,而 post 是实体数据,可以通过表单提交大量信息。
9. echo(),print(),print_r()的区别?(新浪)
echo, print是PHP语句print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
print只能打印出简单类型变量的值(如int,string)
print_r可以打印出复杂类型变量的值(如数组,对象)
echo -- 输出一个或者多个字符串
print --输出一个字符串
print_r -- 打印关于变量的易于理解的信息。
在实际使用中, print 和 echo 两者的功能几乎是完全一样。
可以这么说,凡是有一个可以使用的地方,另一个也可以使用。但是,两者之间也还是一个非常重要的区别:
在 echo 函数中,可以同时输出多个字符串,而在 print 函数中则只可以同时输出一个字符串。同时,echo函数并不需要圆括号,所以echo函数更像是语句而不像是函数。
echo 和 print 都不是函数,而是语言结构,所以圆括号都不是必需的。他们的区别在于:
请说明 php 中传值与传引用的区别。什么时候传值什么时候传引用?
变量默认总是传值赋值。
那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
PHP 也提供了另外一种方式给变量赋值:引用赋值。
这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)。
对象默认是传引用。
对于较大的数据,传引用比较好,这样可以节省内存的开销。
相关题目 1:What would the following code print to the browser? Why?
<?php
$num = 10;
function multipy($num){
$num = $num +10;
}
multipy($num);
echo $num;
?>
输出 10
14. 用 PHP 写出显示客户端 IP 与服务器 IP 的代码。
客户端 IP:$_SERVER["REMOTE_ADDR"]
服务器端 IP:$_SERVER["SERVER_ADDR"]
15. 简述如何得到当前执行脚本路径,包括所得到参数。
获取当前执行脚本路径使用$_SERVER["SCRIPT_FILENAME"]或__FILE__
获取参数,使用$_SERVER["QUERY_STRING"]
16. What is the difference between foo() & @foo()?(Yahoo)
foo() 会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。
@foo() 在执行这个函式时,会隐藏所有上述的错误讯息。
很多应用程序都使用 @mysql_connect() 和 @mysql_query 来隐藏 mysql 的错误信息,这是不对的,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。
18. 检测一个变量是否有设置的函数?是否为空的函数是?
isset 检测一个变量是否设置
empty 检测是否为空
注意二者的区别,如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array() 以及没有任何属性的对象都将被认为是空的。
isset是检测变量是否设置/定义,empty是检测已定义的变量的值是否为空。
19. 在 PHP 中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量______中;而链接到当前页面的的前一页面 URL 记录在预定义变量______中。
当前脚本名称:$_SERVER["PHP_SELF"]或者 $_SERVER["SCRIPT_NAME"];
链接到当前页面的前一页面的 URL 地址:$_SERVER["HTTP_REFERER"]。
20. sort()、assort()、和 ksort() 有什么分别?它们分别在什么情况下使用?
sort(),根据数组中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当数组索引键的值无关紧要时用来把数组排序。
assort(),PHP 没有 assort() 函式,所以可能是 asort() 的笔误。
asort(),对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。
ksort(),根据数组中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的关联数组。
21. 在 PHP 中 error_reporting 这个函数有什么作用?
打开或者关闭错误报告,如:
error_reporting(0);
error_reporting(E_ALL & ~ E_NOTICE);
error_reporting(E_ALL);
相关题目:error_reporting(2047) 什么作用?(新浪)
2047 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024
其中:
1 对应 E_ERROR,2 对应 E_WARNING,4 对应 E_PARSE,
8 对应 E_NOTICE,16 对应 E_CORE_ERROR,32 对应 E_CORE_WARNING
,64 对应 E_COMPILE_ERROR,128对应 E_COMPILE_WARNING,256 对应 E_USER_ERROR,
512 对应 E_USER_WARNING,1024 对应 E_USER_NOTICE。
error_reporting(2047)意味着上述错误都会显示出来。
写出以下程序的输出结果 (CBSI)
<?php
$str = 'cd';
$$str = 'hotdog';//$cd = 'hotdog';
$$str .= 'ok';//$cd .= 'ok';
echo $cd;
?>
hotdogok
相关题目:什么是可变变量?
获取一个普通变量的值作为这个可变变量的变量名。
23. 常量如何定义? 如何检测一个常量是否被定义?
定义常量:define()
检测常量是否定义:defined()
如:
define("TEST","happy new year!");
if( defined("TEST")){
echo TEST;
}
执行程序段<?php echo 8%(-2) ?>将输出
%为取模运算,输出 0
$a % $b其结果的正负取决于 $a 的符号。
echo ((-8)%3)."<br />";//输出 -2
echo (8%(-3))."<br />";//输出 2
25. 数组函数 arsort 的作用是_;语句 error_reporting(2047)的作用是_。
arsort:对数组进行逆向排序并保持索引关系
error_reporting(2047)的作用 report All errors and warnings,见 21 题中相关题目。
26. 以 Apache 模块的方式安装 PHP,在文件 http.conf 中首先要用语句_动态装载 PHP模块,然后再用语句_使得 Apache 把所有扩展名为 php 的文件都作为 PHP 脚本处理。
LoadModule php5_module "c:/php/php5apache2.dll";
AddType application/x-httpd-php .php
27. 一个函数的参数不能是对变量的引用,除非在 php.ini 中把____设为 on.
allow_call_time_pass_reference :是否启用在函数调用时强制参数被按照引用传递,默认关闭。
28. 在 PHP 中,heredoc 是一种特殊的字符串,它的结束标志必须____顶格写,并且不能包含任何其它字符除";"
29.echo count("abc"); 输出什么?(新浪?)
输出 1
count :计算数组中的单元数目或对象中的属性个数,通常是一个 array,任何其它类型都只有一个单元。
对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。
如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。
相关题目:What will be the output of the following PHP code:(腾讯)
<?php
echo count(strlen("http://php.net"));
?>
answer: 1
30. 写个函数用来对二维数组排序(新浪)
<?php
/**
* 根据某列对二维数组进行排序
* @param $arr array 要排序的二维数组
* @param $row string 排序依据的某列
* @param $type string asc表示正序,为默认值;desc表示逆序
* @param array 返回排序后的二维数组
*/
function array_sort($arr,$row,$type ='asc')
{
$arr_temp = array();
// 将排序依据作为数组的键名
foreach ($arr as $v) {
$arr_temp[$v[$row]] = $v;
}
// print_r($arr_temp);
// 按照键名对二维数组进行排序,并保持索引关系
if ($type == 'asc') {
ksort($arr_temp);
} elseif($type == 'desc') {
krsort($arr_temp);
}
// 返回排序结果
return $arr_temp;
}
// 实例
$person = array(
array('id'=>2,'name'=>'zhangsan','age'=>23),
array('id'=>5,'name'=>'lisi','age'=>28),
array('id'=>3,'name'=>'apple','age'=>17)
);
echo "<pre>before:<br />";
print_r($person);
echo "</pre>";
echo "<hr />";
$person2 = array_sort($person,'name');
echo "<pre>after:<br />";
print_r($person2);
echo "</pre>";
?>
31. 写 5 个不同的自己的函数,来获取一个全路径的文件的扩展名,允许封装 php 库中已有的函数。(新浪)
<?php
/*
写 5 个不同的自己的函数,来获取一个全路径的文件的扩展名,允许封装 php 库中已有的函数。(新浪)
*/
// 方法一
function ext_name1($path){
$path_info = strrchr($path, '.');//.php
return ltrim($path_info,'.');
}
// 方法二
function ext_name2($path){
$path_info = substr($path,strrpos($path, '.'));
return ltrim($path_info,'.');
}
// 方法三
function ext_name3($path){
$path_info = pathinfo($path);
return $path_info['extension'];
}
// 方法四
function ext_name4($path){
$arr = explode('.', $path);
return $arr[count($arr)-1];
}
// 方法五
function ext_name5($path){
$pattern = '/^[^\.]+\.([\w]+)$/';
return preg_replace($pattern, '${1}', basename($path));
}
// 实例
$path = str_replace('\\', '/', __FILE__);
echo "$path<br />";
echo ext_name1($path);echo "<br />";
echo ext_name2($path);echo "<br />";
echo ext_name3($path);echo "<br />";
echo ext_name4($path);echo "<br />";
echo ext_name5($path);echo "<br />";
?>
32. PHP 的意思,它能干些什么?
PHP( Hypertext Preprocessor,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
PHP 主要是用于服务端的脚本程序,因此可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作,例如收集表单数据,生成动态网页,或者发送/接收Cookies。但 PHP 的功能远不局限于此。
PHP 脚本主要用于以下三个领域:
服务端脚本。这是 PHP 最传统,也是最主要的目标领域。
命令行脚本。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅只需要 PHP 解析器来执行。
52. 简述单引号和双引号的用法
双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。
53. Switch 完整语法和注意事项
使用 Switch 语句可以避免冗长的 if..elseif..else 代码块,case只能处理整数,或者能像整数一样运算的类型,比如char,使用时case 后用'',注意 break不能少,default是为了处理一些之前没有包含到的情况,这样更为安全。
54. 用 PHP 编写代码在页面输出当前的北京时间,格式为 “2007-01-18 09:22:03”
date_default_timezone_set('PRC');
echo date("Y-m-d H:i:s",time());
55. 简述 GBK、GB2312、BIG5 、GB18030
GB2312 支持的汉字较少,GBK 是相比 GB2312 汉字更为丰富,包括全部中日韩汉字,GB18030 相比 GBK 增加了一些少数名族汉字汉字库更为多样,但是常人很难用到,一般简体中文使用 GBK 而繁体中文使用 BIG5。
56. 计算某段字符串中某个字符出现的次数(例如 : gdfgfdgd59gmkblg 中 g 的次数)
$text = 'gdfgfdgd59gmkblg';
echo substr_count ( $text,'g');
69. PHP 中的注释的写法,要列出三种?
// 注释内容 C 风格的单行注释
# 注释内容 unix 风格的单行注释
/* 注释内容 */ C 风格的多行注释
70. 如何在一个 php 函数中使用具有全局属性的变量,说出两种方式?
global $a 或者 $GLOBALS['a']
71. 若$aa='aa';则 print('aa is 'aa''."
")会输出什么?
aa is 'aa'
72. 如何把$a = ‘123’转化成 123,列出两种方式?
<?php
$a = '123';
$a = (int)$a; //第一种方式
$a = intval($a); //第二种方式
settype($a,'int'); //第三种方式
?>
相关题目:字符串怎么转成整数,有几种方法?怎么实现?
强制类型转换: (整型)字符串变量名;
直接转换:settype(字符串变量,整型);
intval(字符串变量);
73. 说说 break 和 continue 可以用在哪些语句里,并且列出二者的区别?
break 和 continue 可以用在 switch 语句中,或是循环结构中
它们的区别主要是体现在循环语句中,break 表示 跳出整个循环,不再执行,循环将终止,而 continue 则表示跳出本次循环,继续下一次的循环,不会终止循环。
74. 函数中的默认参数位置如何放置?
当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。
75. 如何往一个数组后面添加一个值?列出两种方式?
$arr[ ] = $value;
array_push($arr, $value);
[!!!]76. 说出数组涉及到的常用函数。
array --声明一个数组
count -- 计算数组中的单元数目或对象中的属性个数
foreach -- 遍历数组
list -- 将数组中元素的值赋值给变量,批量声明变量
explode -- 将字符串转成数组
implode -- 将数组转成一个新字符串
array_merge -- 合并一个或多个数组
is_array -- 检查是否是数组
print_r -- 输出数组
sort -- 数组排序
array_keys -- 返回数组中所有的键名
array_values -- 返回数组中所有的值
key -- 从关联数组中取得键名
[!!!]77. 字符串的常用函数?
trim()-- 去除字符串首尾处的空白字符(或者其他字符)
strlen()-- 字符串长度
substr()-- 截取字符串
str_replace()-- 替换字符串函数
strstr()-- 查找字符串的首次出现位置,返回 第一次出现的位置开始到结尾的字符串
explode()-- 将字符串分割成数组
implode()-- 将数组分割成字符串
str_repeat() -- 重复一个字符串
addslashes() -- 转义字符串
htmlspecialchars() -- HTML 实体转义
78. 以下代码的执行后是,$result 值为:(奇矩互动)
<?php
$srcArray=array('a','b','c','d');
$randValue=array_rand($srcArray);
$result=is_string($randValue);
?>
A. a
B. false
C. true
D. b
E. c
答案:B
mixed array_rand( array $input [, int $num_req ] )
从数组中随机取出一个或多个单元,它接受 input 作为输入数组和一个可选的参数num_req,指明了你想取出多少个单元 - 如果没有指定,默认为 1。
如果你只取出一个,array_rand() 返回一个随机单元的键名,否则就返回一个包含随机键名的数组。
所以使用 array_rand 函数,返回结果要么是键名,要么是数组,在这个例子中,数组是索引数组,所以返回的是整型。
83. 请列举出你所知道的全局环境变量 (亿邮)
$_ENV;
$_SERVER;
$_REQUEST;
$_FILES;
$_SESSION;
$_COOKIE;
$_GET;
$_POST;
$GLOBALS;
php面试题之四——PHP面向对象(基础部分)
四、PHP面向对象
[!]4. PHP5 中魔术方法函数有哪几个,请举例说明各自的用法 (腾讯 PHP 工程师笔试题)
__sleep serialize 之前被调用
__wakeup unserialize 时被调用
__toString 打印一个对象时被调用
__set_state 调用 var_export 时被调用,用__set_state的返回值作为 var_export 的返回值
__construct 构造函数,实例化对象时被调用
__destruct 析构函数,当对象销毁时被调用
__call 对象调用某个方法,若存在该方法,则直接调用,若不存在,则调用__call 函数
__get 读取一个对象属性时,若属性存在,则直接返回,若不存在,则调用__get 函数
__set 设置一个对象的属性时,若属性存在,则直接赋值,若不存在,则调用__set 函数
__isset 检测一个对象的属性是否存在时被调用
__unset unset 一个对象的属性时被调用
__clone 克隆对象时被调用
__autoload 实例化一个对象时,如果对应的类不存在,则该方法被调用
相关题目:请写出 php5 的构造函数和析构函数
构造函数:__construct
析构函数:__destruct
12. 接口和抽象类的区别是什么?
抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract 来声明的。
抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。
抽象方法的格式为:abstract function abstractMethod();
接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。
抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。
子类继承抽象类使用 extends,子类实现接口使用 implements。
13. 类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字 const,例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用,即:类名:: 类常量名。
14. autoload()函数是如何运作的?
使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。
这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行 include 或者 require 来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。
15. 哪种OOP设置模式能让类在整个脚本里只实例化一次?(奇矩互动)
E. 单件模式
16. 借助继承,我们可以创建其他类的派生类。在PHP中,子类最多可以继承几个父类?(奇矩互动)
A. 1个
20. 只有该类才能访问该类的私有变量吗?(卓望)是的
21. 写出你知道的几种设计模式,并用php代码实现其中一种。(卓望)
单例模式,工厂模式
单例模式 实现代码
class Singleton
{
private static $instance = null;
private function __construct(){}
//对外提供一个静态方法
public static function getInstance(): Singleton
{
if (self::$instance === null) {
//如果没有,则创建当前类的实例
self::$instance = new self();
}
return self::$instance;}
php面试题之五——MySQL数据库(基础部分)
五、MySQL数据库
mysql_num_rows()
mysql_affected_rows()
这两个函数都作用于 mysql_query($query)操作的结果,mysql_num_rows() 返回结果集中行的数目。mysql_affected_rows() 取得前一次 MySQL 操作所影响的记录行数。
mysql_num_rows()仅对 SELECT 语句有效,要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()。
相关题目:取得查询结果集总数的函数是?
mysql_num_rows()
2. sql 语句应该考虑哪些安全性?(新浪网技术部)
防止 Sql 注入,对特殊字符进行转义、过滤或者使用预编译的 sql 语句绑定变量。
最小权限原则,特别是不要用 root 账户,为不同的类型的动作或者组建使用不同的账户。
当 sql 运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。
3. 简单描述 mysql 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)(新浪网技术部)
索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含对数据表里所有记录的引用指针。
普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个唯一索引。
也就是说,唯一索引可以保证数据记录的唯一性。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像 INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。
7. MySQL 数据库中的字段类型 varchar 和 char 的主要区别是什么?哪种字段的查找效率要高,为什么?
区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。
varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。
区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节
最大有效长度是 65532 字节,在 varchar 存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2= 65532
由字符集来确定,字符集分单字节和多字节
Latin1 一个字符占一个字节,最多能存放 65532 个字符
GBK 一个字符占两个字节, 最多能存 32766 个字符
UTF8 一个字符占三个字节, 最多能存 21844 个字符
注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。
两相比较,char 的效率高,没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作。但不够灵活,在实际使用时,应根据实际需求来选用合适的数据类型。
相关题目:若一个表定义为 create table t1(c int, c2 char(30), c3 varchar(N)) charset=utf8; 问N 的最大值又是多少?
(65535 - 1 - 2 - 4 - 30 * 3 )/3
8. IP 该如何保存?
最简单的办法是使用字符串(varchar)来保存,如果从效率考虑的话,可以将 ip 保存为整型(unsigned int),使用 php 或 mysql 提供的函数将 ip 转换为整型,然后存储即可。
PHP 函数:long2ip()和 ip2long()
MySQL 函数:inet_aton()和 inet_ntop
12. MYSQL 取得当前时间的函数是?格式化日期的函数是?
current_time()用于取得当前时间
date_format(datetime, format)用于格式化日期,如:select date_format(now(),'%Y%m%d');
[!!]14. 请简述项目中优化 sql 语句执行效率的方法,从哪些方面,sql 语句性能如何分析?
尽量选择较小的列
将where中用的比较频繁的字段建立索引
select子句中避免使用‘*’
避免在索引列上使用计算、not in 和<>等操作
当只需要一行数据的时候使用limit 1
保证单表数据不超过200W,适时分割表。
针对查询较慢的语句,可以使用explain 来分析该语句具体的执行情况。
8. MySQL 自增类型(通常为表 ID 字段)必需将其设为()
整型,并设置为 AUTO_INCREMENT
19. 数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
ACID 四大特性,原子性、隔离性、一致性、持久性。
20. What's the difference between mysql_fetch_row() and mysql_fetch_array()? (Yahoo)
mysql_fetch_row() 从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。
mysql_fetch_array() 是 mysql_fetch_row() 的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。
mysql_fetch_array() 中可选的第二个参数 result_type 是一个常量,可以接受以下值:
MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH。其默认值是 MYSQL_BOTH。
如 果 用 了 MYSQL_BOTH , 将 得 到 一 个 同 时 包 含 关 联 和 数 字 索 引 的 数 组 。 用MYSQL_ASSOC 只得到关联索引(如同 mysql_fetch_assoc() 那样),用 MYSQL_NUM 只得到数字索引(如同 mysql_fetch_row() 那样)。
21. 请写出 php 连 mysql 连接中,获取下一个自增长 id 值的方法,可以写多个(酷讯)
方法一,使用 show table status ,然后获取 auto_increment 的值
方法二,使用 select max(id) + 1 from table
方法三,如果是刚插入记录,可以使用 last_insert_id() + 1 获得
22. 从表 login 中选出 name 字段包含 admin 的前 10 条结果所有信息的 sql 语句 (酷讯)
SELECT * FROM login WHERE name LIKE ‘%admin%’ LIMIT 10;
23. 表中有 A B C 三列,用 SQL 语句实现:当 A 列大于 B 列时选择 A 列,否则选择 B 列,当B 列大于 C 列时选择 B 列否则选择 C 列。
使用case语句,如下:
SELECT CASE WHEN A > B THEN A ELSE B END, CASE WHEN B > C THEN B ELSE C END FROM table
24. 写出三种以上 MySQL 数据库存储引擎的名称(提示:不区分大小写)
MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎。
[!]25. 请简述数据库设计的范式及应用。
一般第 3 范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了 SQL 语句过于庞大所造成系统效率低下。
第一范式:若关系模式 R 的每一个属性是不可再分解的,且有主键,则属于第一范式。
第二范式:若 R 属于第一范式,且所有的非主键属性都完全函数依赖于主键属性,则满足第二范式。
第三范式:若 R 属于第二范式,且所有的非主键属性没有一个是传递函数依赖于候选主键属性,则满足第三范式。
在实际使用中,可以根据需求适当的逆范式。
26. 取得最新一次添加记录(假设 id 为主键,并且是自增类型)所产生的 id 的函数是什么?
mysql_insert_id();如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id()返回 0。
27. php 连接 mysql 之后,如何设置 mysql 的字符集编码为 utf8?
mysql_query(“set names utf8”);
28. php 访问数据库有哪几步?
主要有以下几个步骤:
连接数据库服务器:mysql_connect('host','user','password');
选择数据库:mysql_select_db(数据库名);
设置从数据库提取数据的字符集:mysql_query("set names utf8");
执行 sql 语句:mysql_query(sql 语句);
处理结果集
关闭结果集,释放资源:mysql_free_result($result);
关闭与数据库服务器的连接:mysql_close($link);
29. 在平常 mysql 优化方面,最基本的也是最重要的优化是()。(奇矩互动)
查询优化
30. 列出 mysql 数据库常用的几种类型 HEAP、()、()。 (奇矩互动)
MyISAM,innoDB
31. 请对于据 select * from table example where((a and b)and c or(((a and b)and(c and d)))优化的语句。(奇矩互动)
题目多了一个括号,在 where 后面,但不影响题目的意思,可以将 sql 语句优化如下:
select * from table example where a and b and c
[!!]32. 解释 MySQL 外连接、内连接与自连接的区别 (小米)
先说什么是交叉连接,交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
而外连接其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那
些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以 NULL 来填充。
右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。
左连接和右连接可以互换,MySQL 目前还不支持全外连接。
34. 写出你所知道的数据库。(亿邮)
MySQL,SQL Server, Oracle,Sybase, informix, DB2 等
###### 36. 假设现在有一个数据库服务器,服务器地址为 192.168.0.110,用户名为 root 密码为password 请使用 PHP 编写一个面向过程化的连接该数据库的脚本代码 (亿邮)
`$conn = mysql_connect('192.168.0.110','root','password') or die('数据库连接失败');`
###### [!!!]37. 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 (亿邮)
区别主要有以下几个:
1. 构成上,MyISAM 的表在磁盘中有三个文件组成,分别是表定义文件( .frm)、数据文件(.MYD)、索引文件(.MYI),而 InnoDB 的表由表定义文件(.frm)、表空间数据和日志文件组成。
1. 安全方面,MyISAM 强调的是性能,其查询效率较高,但不支持事务和外键等安全性方面的功能,而 InnoDB 支持事务和外键等高级功能,查询效率稍低。
1. 对锁的支持,MyISAM 支持表锁,而 InnoDB 支持行锁。
###### 38. 现在有下面一个查询语句 select * from tabname where id=2 and password='abc’如何判断它是现在是最优的。(亿邮)
可以使用 explain select * from tabname where id=2 and password='abc’来分析其执行情况。
###### 39. 请问如何在 Mysql 操作中如何写入 utf8 格式数据 (亿邮)
首先确保数据库中的表是基于 utf8 编码的,其次 php 文件是 utf8 编码,在执行 mysql操作之前,执行 mysql_query(‘set names utf8’)操作,对于要操作的文本如果是 utf8编码,则可以直接操作,如果是其它编码,则可以使用 iconv 函数将其转化为 utf8 编码,然后写入。
###### 40. mysql 中 varchar 的 最 大 长 度 是 多 少 ? 用 什 么 类 型 的 字 段 存 储 大 文 本 ?date 和datetime 和 timestamp 什么区别?怎么看数据库中有哪些 sql 正在执行? (卓望)
varchar 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65532 字节。
在 varchar 存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2 = 65532。
由字符集来确定,字符集分单字节和多字节,如果是单字节,如 latin1,则最多可以存放 65532 个字符,如果是多字节,如 GBK 则可以存放 32766 个字符,UTF8 则可以存放 21844个字符。
存储大文本可以使用 text 类型。
date 表示日期,其范围为 1000-01-01 ~ 9999-12-31
datetime 表示日期时间,其范围为 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp 是 unix 时 间 戳 的 日 期 时 间 表 示 方 式 , 其 范 围 较 小 为 1970-01-01 00:00:00~2038-01-19 03:14:07 ,timestamp 具备自动初始化和自动更新功能。
查看数据库中正在执行的 sql 语句可以使用日志,也可以使用 show processlist 命令。
[!!]42. 简述存储过程的适用情况
当需要处理复杂的查询和运算时,可以使用存储过程。
从应用分层的原则,大量使用存储过程导致业务逻辑分散在 DB 和应用服务器层,不利于维护和更新。
总体来说,存储程序可以用,但要慎重,最好只用来维护,不用于业务逻辑和支撑高并发高性能的东西。
高级
php面试题之三——PHP网络编程(高级部分)
三、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的话,对服务器的压力会更大一些。
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函数
php面试题之四——Linux部分(高级部分)
四、Linux部分
1.请解释下列10个shell命令的用途(新浪网技术部)
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc
top:该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进程的资源占用情况。该命令可以按照对CPU、内存使用和执行时间对系统任务进程进行排序显示,同时还可以通过交互式命令进行设定显示。
ps:显示系统进程在瞬间的运行动态。
mv:文件/目录改名或变更存储位置。
find:在指定的路径下查找指定文件。
df:检查磁盘空间占用情况。
cat:将文件的内容打印到标准输出。
chmod:改变文件的权限。
chgrp:改变文件所属组。
grep:过滤文本,根据指定的字符串,对文件的每一行进行搜索,如找到,则输出该行内容。
wc:统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
相关题目:写出15个以上你所知道的常用的Linux命令和它的功能。
ls:列出目录
cp:复制
rm:删除
cat:将文件的内容打印到标准输出
mkdir:建立目录
tar:打包压缩
ps:查看进程
top:查看机器使用情况
df:检查磁盘空间占用情况
find:在指定路径下查找指定文件
grep:过滤文本
cd:改变当前工作目录
mount:挂载/卸载指定的文件系统
ifconfig:配置网络或显示当前网络接口状态
telnet::远程登录
2.vi编辑器中,选中、复制、粘贴、删除的命令各是什么(酷讯)
选中:v(以字符为单位),V(以行为单位)
复制:y,如yy,nyy,y1G,yG,y0,y$
粘贴:p(粘贴在光标之后),P(粘贴在光标之前)
删除:d,如dd,ndd,d1G,dG,d$,d0
3.获取文件行数(酷讯)
wc-l filename
4.输入文件的最后5行到另一个文件中(酷讯)
tail-n 5 file1>>file2
5.查找文件中包含hello的行(酷讯)
grep hello filename
6.查找当前目录下所有目录名为CVS的子目录的命令(酷讯)
find./CVS-maxdepth 1-type d-print
7.如何让一个程序在后台运行并把输入定向到指定的文件(酷讯)
可使用命令:nohup程序>>文件名2>&1
注意,2>&1要放在输出文件名的后面)
8.如何把一个文件的内容添加到另一个文件的末尾(酷讯)
cat file1>>file2
9.如何实时的显示一个文件的输出(酷讯)
使用more或者less
10.定时执行一个程序的方法有什么(酷讯)
可以使用at或者crontab,其中at是处理仅执行一次就结束调度的命令,适用于突发性工作,而crontab将会循环一直进行下去,适用于例行性工作。
11.vi编辑器中,如何替换指定的字符串(酷讯)
使用s命令,例如:
:n1,n2s/word1/word2/g,将第n1行与n2行之间的word1替换为word2
:1,$s/word1/word2/g,从第一行到最后一行中的word1替换为word2
[!]12.当更新后,cvs中文件有冲突时。如何判断哪些你编辑的内容和更新下来的内容(酷讯)
使用CVS时,如果出现冲突,双击冲突的文件(标识为红色),显示文件比较窗口。其中蓝色为需要传入的更新,其中灰色为需要传出的修改,其中红色为需要手工解决的冲突。
可以首先将蓝色需要传入的更新,然后手工解决红色部分,自行选择保留左边还是右边,并选择mark as merge将文件标志为合并,此时将以左边窗口中的内容为依据向服务器提示传出,即灰色和红色部分都会以左边窗口的内容为依据向服务器提交。
如果冲突文件打开无任何的颜色提示,可选择update and override,使用服务器上的文
件更新本地文件。
13.Linux下,如何查看所有用户______
cat/etc/passwd
14.Linux上的crond服务可对服务器设置计划任务,请问如果我需设置每2分钟执行一次/tmp/test.sh的脚本应如何设置计划任务,请写出操作方法。
首先用root用户的权限登录。
切换到/etc/init.d/目录下,使用命令:crond start启动crond服务
切换到/etc/目录下,使用命令:crontab–e
编辑如下:/2***/tmp/test.sh
15.查看磁盘空间使用率的Linux命令是什么?查看有哪些系统进程正在运行命令是什么?检测Linux性能(cpu,磁盘io,内存,网络等)都用到哪些命令?(卓望)
查看磁盘空间使用率的命令:df
查看系统进程命令:top
检测Linux性能的命令:ps,free,vmstat,netstat
16.Linux下终止一个进程用什么命令?打包压缩和解包用什么命令?软连接和硬链接有什么区别?建立软连接的命令是?(卓望)
终止进程的命令:kill
打包压缩和解包命令:tar
建立软连接的命令:ln-s源文件目标链接名
硬链接是通过文件系统的inode来产生新文件名,而不是新文件,它只是在某个目录新建一条文件名链接到某inode号码的管理记录而已,而软链接是创建一个独立的文件,该文件会让数据的读取指向它链接的那个文件的文件名,类似于windows中的快捷方式。
17.说说Linux下的find命令和grep命令的区别
find:在磁盘/分区中找到文件,可以配type可以配size time等,通过文件名或文件大小或访问时间找到指定文件。
grep:查找文件里符合条件的字符串,并把匹配的行打印出来,可以使用正则表达式。
php面试题之五——PHP综合应用(高级部分)
五、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来判断一下。如果是图片的话,使用添加水印即可很好的防止。
控制大文件的下载
最好把文件下载的容量控制为相对较小的一个值,如果有大文件下载,最好使用专用的服务器。
使用多台主机实现分流,集群
使用流量分析软件进行分析统计谷歌和百度
6.请举例说明在你的开发过程中用什么方法来加快页面的加载速度。
要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器,使用代码优化工具等。
[!!!]12.apache+mysql+php实现最大负载的方法
问的太笼统,生成静态html页面,squid反向代理,apache,mysql的负载均衡。
可以采取数据缓存的方法,我们通常在统计数据的时候,需要在原始数据的基础上经过计算等一系列操作,才会得到最终的结果,如果每做一个查询都需要这样一系列操作,当数据量大时,势必会带来很多问题。可以建立一个结果表,写一个脚本,用crontab定时触发脚本去原始表取数据,计算,写入到结果表,前端查询从结果表取数据,这也是比较常用的一种做法。
采用分布式,多个apache,多个mysql,其实就是dns负载均衡,dns根据当前用户解析几个ip的ping值,将用户转移到某一台最快的服务器,或者平均分配。
money不是问题的话,可以考虑F5硬件负载均衡!
可以使用Microsoft Windows Server系统的负载均衡设置
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
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攻击。
[!]23.如果某段与数据库交互的程序运行较慢你将如何处理?
一是首先提高数据库的查询速度,比如增加索引,优化表的结构。
二是优化程序代码,如果查询比较多,可以尽量用条件查询,减少查询语句,比如能用一条查询语句就不用两条。
三就是提高服务器的速度,优化服务器,把不必要的进程关掉。
[!!]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轮询的方式来进行负载平衡。
[!!]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个字节来存储。