php面试宝典
1、表单中get与post提交方法的区别?
答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.
2、session与cookie的区别?
答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短
3、数据库中的事务是什么?
答:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
4、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分)
答:echo date('Y-m-d H:i:s', strtotime('-1 days'));
5、echo(),print(),print_r()的区别(3分)
答:echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
print()只能打印出简单类型变量的值(如int,string)
print_r()可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
6、能够使HTML和PHP分离开使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
10、PHP的意思(送1分)
答:PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
11、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分)
答:now(),date()
12、实现中文字串截取无乱码的方法。(3分)
答:function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
$str=null;
$len=$start+$length;
for($i=$start;$i<$len;$i++){
if(ord(substr($string,$i,1))>0xa0){
$str.=substr($string,$i,2);
$i++;
}else{
$str.=substr($string,$i,1);
}
}
return $str.'...';
}else{
return $string;
}
}
13、您是否用过模板引擎? 如果有您用的模板引擎的名字是?(1分)
答:用过,smarty
14、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)
答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,
程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量
15、用PHP写出显示客户端IP与服务器IP的代码1分)
答:打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR');
打印服务器IP:echo gethostbyname("www.bolaiwu.com")
16、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)
答:require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include->include有返回值,而require没有(可能因为如此require的速度比include快)
注意:包含文件不存在或者语法错误的时候require是致命的,include不是
17、如何修改SESSION的生存时间(1分).
答:方法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:setcookie() and session_set_cookie_params($lifeTime);
18、有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?($1分)
答:方法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");
19、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用header 函数,其语句为(?);(2分)
答:状态401代表未被授权,header("Location:www.xxx.php");
20、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分)
答:heredoc的语法是用"<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串
例子:
$str = <<
my name is Jiang Qihui!
SHOW;
21、谈谈asp,php,jsp的优缺点(1分)
答:ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和运行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script)作为自己的开发语言。
PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.net)*下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。
JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病--脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Java 上的不凡造诣,将Java 从Java 应用程序和Java Applet 之外,又有新的硕果,就是Jsp--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 服务器的技术,客户端浏览器不需要任何附加的软件支持。
22、谈谈对mvc的认识(1分)
答:由模型(model),视图(view),控制器(controller)完成的应用程序由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
23、写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)
答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10;
24、请说明php中传值与传引用的区别。什么时候传值什么时候传引用?(2分) 以题的形式出
答:按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
25、在PHP中error_reporting这个函数有什么作用? (1分)
答:设置错误级别与错误信息回报
26、请写一个函数验证电子邮件的格式是否正确(2分)
答:function checkEmail($email)
{
$pregEmail = "/([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?/i";
return preg_match($pregEmail,$email);
}
27、简述如何得到当前执行脚本路径,包括所得到参数。(2分)
答:$script_name = basename(__file__); print_r($script_name);
28、JS表单弹出对话框函数是?获得输入焦点函数是? (2分)
答:弹出对话框: alert(),prompt(),confirm()
获得输入焦点focus()
29、JS的转向函数是?怎么引入一个外部JS文件?(2分)
答:window.location.href,<script type="text/javascript" src="js/js_function.js"></script>
30、foo()和@foo()之间有什么区别?(1分)
答:@foo()控制错误输出
31、如何声明一个名为”myclass”的没有方法和属性的类? (1分)
答:class myclass{ }
32、如何实例化一个名为”myclass”的对象?(1分)
答:new myclass()
33、你如何访问和设置一个类的属性? (2分)
答:$object = new myclass();
$newstr = $object->test;
$object->test = "info"; sxhj_lzd@163
34、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分)
答:mysql_fetch_row是从结果集取出1行数组,作为枚举
mysql_fetch_array是从结果集取出一行数组作为关联数组,或数字数组,两者兼得
35、GD库是做什么用的? (1分)
答:gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。
在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
36、指出一些在PHP输入一段HTML代码的办法。(1分)
答:echo "aaa";
37、下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分)
(a) fget() (b) file_open() (c) fopen() (d) open_file() [ c ]
38、下面哪个选项没有将john 添加到users 数组中? (1分)
(a) $users[] = ‘john’;
(b) array_add($users,’john’);
(c) array_push($users,‘john’);
(d) $users ||= ‘john’; [ a , c ]
39、下面的程序会输入是否?(1分)
$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
?>
输出:10
40、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来(2分)
表名User
Name Tel Content Date
张三13333663366 大专毕业2006-10-11
张三13612312331 本科毕业2006-10-15
张四021-55665566 中专毕业2006-10-15
请根据上面的题目完成代码:
$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);
$result = mysql_query("SELECT * FROM `user` WHERE name='张三'");
while($rs = mysql_fetch_array($result)){
echo $rs["tel"].$rs["content"].$rs["date"];
}
41、如何使用下面的类,并解释下面什么意思?(3)
class test{
function Get_test($num){
$num=md5(md5($num)."En");
return $num;
}
}
答:$testnum = "123";
$object = new test();
$encrypt = $object->Get_test($testnum);
echo $encrypt;
类test里面包含Get_test方法,实例化类调用方法多字符串加密
42、写出SQL语句的格式: 插入,更新,删除(4分)
表名User
Name Tel Content Date
张三13333663366 大专毕业2006-10-11
张三13612312331 本科毕业2006-10-15
张四021-55665566 中专毕业2006-10-15
(a) 有一新记录(小王13254748547 高中毕业2007-05-06)请用SQL语句新增至表中
mysql_query("INSERT INTO `user` (name,tel,content,date) VALUES
('小王','13254748547','高中毕业','2007-05-06')")
(b) 请用sql语句把张三的时间更新成为当前系统时间
$nowDate = date("Ymd");
mysql_query("UPDATE `user` SET date='".$nowDate."' WHERE name='张山'");
(c) 请写出删除名为张四的全部记录
mysql_query("DELETE FROM `user` WHERE name='张四'");
43、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别(2分)
答:int是数字类型,char固定长度字符串,varchar实际长度字符串,datetime日期时间型,text文本字符串
char的场地固定为创建表设置的长度,varchar为可变长度的字符
44、写出以下程序的输出结果(1分)
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
答:4
45、检测一个变量是否有设置的函数是否?是否为空的函数是?(2分)
答:isset($str),empty($str);
46、取得查询结果集总数的函数是?(1分)
答:mysql_num_rows($result);
47、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值(1分)
答:echo $array[0];
48、请将41题的数组的值用','号分隔并合并成字串输出(1分)
答:for($i=0;$i
49、$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分)
答:echo $a{0} 或echo substr($a,0,1)
50、PHP可以和sql server/oracle等数据库连接吗?(1分)
答:当然可以
51、请写出PHP5权限控制修饰符(3分)
答:public(公共),private(私用),protected(继承)
52、请写出php5的构造函数和析构函数(2分)
答:__construct , __destruct
53、完成以下:
54、
(一)创建新闻发布系统,表名为message有如下字段(3分)
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量
答:CREATE TABLE 'message'(
'id' int(10) NOT NULL auto_increment,
'title' varchar(200) default NULL,
'content' text,
'category_id' int(10) NOT NULL,
'hits' int(20),
PRIMARY KEY('id');
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下(4分)
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
文章id 文章标题点击量回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
答:SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits,
IF(comment.`id` is NULL,0,count(*)) number FROM message LEFT JOIN
comment ON message.id=comment.id GROUP BY message.`id`;
(三)上述内容管理系统,表category保存分类信息,字段如下(3分)
category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单
答:function categoryList()
{
$result=mysql_query("select category_id,categroy_name from category")
or die("Invalid query: " . mysql_error());
print("\n"); while($rowArray=mysql_fetch_array($result)) { print("".$rowArray['categroy_name']."\n"); } print("");
}
54、写一个函数,尽可能高效的,从一个标准url 里取出文件的扩展名
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出php 或.php
答案1:
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(".",$file);
return $ext[1];
}
答案2:
function getExt($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);
}
}
55、在HTML 语言中,页面头部的meta 标记可以用来输出文件的编码格式,以下是一个标准的meta 语句
请使用PHP 语言写一个函数,把一个标准HTML 页面中的类似meta 标记中的charset 部分值改为big5
请注意:
1. 需要处理完整的html 页面,即不光此meta 语句
2. 忽略大小写
3. ' 和" 在此处是可以互换的
4. 'Content-Type' 两侧的引号是可以忽略的,但'text/html; charset=gbk' 两侧的不行
5. 注意处理多余空格
56、写一个函数,算出两个文件的相对路径
如$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出$b 相对于$a 的相对路径应该是../../c/d将()添上
答:function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode('/', $a);
$arrB = explode('/', $returnPath[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++) {
if ($arrA[$n] != $arrB[$n]) {
break;
}
}
if ($len - $n > 0) {
$returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));
}
$returnPath = array_merge($returnPath, array_slice($arrA, $n));
return implode('/', $returnPath);
}
echo getRelativePath($a, $b);
57、如何实现PHP、JSP交互?
题目有点含糊不清,SOAP,XML_RPC,Socket function,CURL都可以实现这些,如果是考PHP和Java的整合,PHP内置了这种机制(如果考PHP和.NET的整合,也可以这么回答),例如$foo = new Java('java.lang.System');
58、使用哪些工具进行版本控制?
CVS和SVN,SVN号称下一代CVS,功能强大,不过CVS是老牌,市占率很高.我一直用SVN,题目是问用什么工具,呃,这个可能需要这么回答:CVS Server on Apache作服务端,WinCVS作客户端;Subversion on Apache/DAV 做服务端,TortoiseSVN做客户端,或者Subclipse做客户端
59、如何实现字符串翻转?
其实PHP本身就有字符串翻转的函数:strrev(),不妨试试echo strrev($str);不过所有的这三种方法都不能解决中文字符串翻转的问题,会出错的。
代码
function reverse($var)
{
$res="";
for($i=0,$j=strlen($var);$i<$j;$i++)
{
$res=$var[$i].$res;
}
return $res;
}
$tmpvar="wofang";
$res=reverse($tmpvar);
echo $res;
?>
60、优化MYSQL数据库的方法。
(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
(3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) ... where article_id = ? 就可以了,不要先select * ... where article_id = ?然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update ... set title = ? where article_id = ?不要set content = ?(大文本)
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度
61、谈谈事务处理
A给B的账户转账50美元的例子
62、apache+mysql+php实现最大负载的方法
见7
63、实现中文字串截取无乱码的方法。
mb_substr()
?>
64、用PHP写出显示客户端IP与服务器IP的代码:
打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR');
打印服务器IP:echo gethostbyname("http://www.baidu.com/")
65、在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的的前一页面URL记录在预定义变量(2)中
//本页地址,SCRIPT_NAME也可以:php/test.php
echo $_SERVER['PHP_SELF']."
";
//链接到当前页面的前一页面的URL 地址:
echo $_SERVER['HTTP_REFERER']."
";
//其它的见参考手册:语言参考》变量》预定义变量
//前执行脚本的绝对路径名:D:Inetpubwwwrootphp est.php
echo $_SERVER["SCRIPT_FILENAME"]."
";
//正在浏览当前页面用户的IP 地址:127.0.0.1
echo $_SERVER["REMOTE_ADDR"]."
";
//查询(query)的字符串(URL 中第一个问号? 之后的内容):id=1&bi=2
echo $_SERVER["QUERY_STRING"]."
";
//当前运行脚本所在的文档根目录:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"]."
";
?>
66、执行程序段将输出__。
//参考手册》语言参考》运算符》算术运算符》%为取模运算,输出0
echo 8%(-2)."
";
//取模$a % $b 在$a 为负值时的结果也是负值。输出-2
echo ((-8)%3)."
";
//输出2
echo (8%(-3))."
";
?>
67、在HTTP 1.0中,状态码401 的含义是____;如果返回“找不到文件”的提示,则可用header 函数,其语句为____。
答:401表示未授权;header("HTTP/1.0 404 Not Found");[见参考手册》函数参考》HTTP函数》header]
68、数组函数arsort 的作用是____;语句error_reporting(2047)的作用是____。
答:arsort:对数组进行逆向排序并保持索引关系error_reporting(2047)的作用是:report All errors and warnings
69、写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):
$script="以下内容不显示:<script language='javascript'>alert('cc');</script>";
echo preg_replace("/<script[^>].*?>.*?</script>/si", "替换内容", $script);
?>
70、以Apache模块的方式安装PHP,在文件http.conf中首先要用语句____动态装载PHP模块,
然后再用语句____使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
答:LoadModule php5_module "c:/php/php5apache2.dll";AddType application/x-httpd-php .php
见参考手册》目录》II. 安装与配置》6. Windows 系统下的安装》Microsoft Windows 下的Apache 2.0.x
71、语句include 和require 都能把另外一个文件包含到当前文件中,它们的区别是____;为了避免多次包含同一文件,可以用语句____来代替它们。
答:在如何处理失败时,include() 产生一个警告而require() 则导致一个致命错误;require_once()/include_once()
72、一个函数的参数不能是对变量的引用,除非在php.ini中把____设为on.
答:allow_call_time_pass_reference boolean :是否启用在函数调用时强制参数被按照引用传递, 见参考手册》附录G
73、SQL 中LEFT JOIN的含义是__,如果tbl_user记录了学生的姓名(name)和学号(ID),
tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句____.
答:自然左外连接
create database phpinterview;
use phpinterview
create table tbl_user
(
ID int not null,
name varchar(50) not null,
primary key (ID)
);
create table tbl_score
(
ID int not null,
score dec(6,2) not null,
subject varchar(20) not null
);
insert into tbl_user (ID, name) values (1, 'beimu');
insert into tbl_user (ID, name) values (2, 'aihui');
insert into tbl_score (ID, score, subject) values (1, 90, '语文');
insert into tbl_score (ID, score, subject) values (1, 80, '数学');
insert into tbl_score (ID, score, subject) values (2, 86, '数学');
insert into tbl_score (ID, score, subject) values (2, 96, '语文');
select A.id,sum(B.score) as sumscore
from tbl_user A left join tbl_score B
on A.ID=B.ID
group by A.id
74、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须____
答:结束标识符所在的行不能包含任何其它字符除";"
75、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
function my_scandir($dir)
{
$files=array();
if(is_dir($dir))
{
if($handle=opendir($dir))
{
while(($file=readdir($handle))!==false)
{
if($file!="." && $file!="..")
{
if(is_dir($dir."/".$file))
{
$files[$file]=my_scandir($dir."/".$file);
}
else
{
$files[]=$dir."/".$file;
}
}
}
closedir($handle);
return $files;
}
}
}
print_r(my_scandir("D:Program FilesInternet ExplorerMUI"));
?>
76、以下哪一句不会把John 新增到users 阵列?
$users[] = 'john';
成功把John 新增到阵列users。
array_add($users,’john’);
函式array_add() 无定义。
array_push($users,‘john’);
成功把John 新增到阵列users。
$users ||= 'john';
语法错误。
77、sort()、assort()、和ksort() 有什么分别?它们分别在什么情况下使用?
sort()
根据阵列中元素的值,以英文字母顺序排序,索引键会由0 到n-1 重新编号。主要是当阵列索引键的值无关疼痒时用来把阵列排序。
assort()
PHP 没有assort() 函式,所以可能是asort() 的笔误。
asort()
与sort() 一样把阵列的元素按英文字母顺序来排列,不同的是所有索引键都获得保留,特别适合替联想阵列排序。
ksort()
根据阵列中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的联想阵列。
78、以下的代码会产生什么?为什么?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由于函式multiply() 没有指定$num 为全域变量(例如global $num 或者$_GLOBALS['num']),所以$num 的值是10。
79、reference 跟一个正规的变量有什么分别?如何pass by reference?在什么情况下我们需要这样做?
Reference 传送的是变量的地址而非它的值,所以在函式中改变一个变量的值时,整个应用都见到这个变量的新值。
一个正规变量传送给函式的是它的值,当函式改变这个变量的值时,只有这个函式才见到新值,应用的其他部分仍然见到旧值。
$myVariable = "its' value";
Myfunction(&$myVariable); // 以reference 传送参数
以reference 传送参数给函式,可以使函式改变了的变量,即使在函式结束后仍然保留新值。
80、些函式可以用来在现正执行的脚本中插入函式库?
对这道题目不同的理解会有不同的答案,我的第一个想法是插入PHP 函式库不外乎include()、include_once()、require()、require_once(),但细心再想,“函式库”也应该包括com 物件和.net 函式库,所以我们的答案也要分别包括com_load 和dotnet_load,下次有人提起“函式库”的时候,别忘记这两个函式。
81、foo() 与@foo() 有什么分别?
foo() 会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。
@foo() 在执行这个函式时,会隐藏所有上述的错误讯息。
很多应用程式都使用@mysql_connect() 和@mysql_query 来隐藏mysql 的错误讯息,我认为这是很严重的失误,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。
82、你如何替PHP 的应用程式侦错?
我并不常这样做,我曾经试过很多不同的侦错工具,在Linux 系统中设定这些工具一点也不容易。不过以下我会介绍一个近来颇受注目的侦错工具。
PHP - Advanced PHP Debugger 或称PHP - APD,第一步是执行以下的指令安装:
pear install apd安装后在你的脚本的开头位置加入以下的语句开始进行侦错:
apd_set_pprof_trace();执行完毕,打开以下档案来查阅执行日志:
apd.dumpdir
你也可以使用pprofp 来格式化日志。
详细的资料可以参阅http://us.php.net/manual/en/ref.apd.php。
83、“===”是什么?试举一个“==”是真但“===”是假的例子。
“===”是给既可以送回布尔值“假”,也可以送回一个不是布尔值但却可以赋与“假”值的函式,strpos() 和strrpos() 便是其中两个例子。
问题的第二部份有点困难,想一个“==”是假,但是“===”是真的例子却很容易,相反的例子却很少。但我终于找到以下的例子:
if (strpos("abc", "a") == true){ // 这部分永不会被执行,因为"a" 的位置是0,换算成布尔值“假”}if (strpos("abc", "a") === true){ // 这部份会被执行,因为“===”保证函式strpos() 的送回值不会换算成布尔值.}
84、你会如何定义一个没有成员函式或特性的类别myclass?
class myclass{}
85、你如何产生一个myclass 的物件?
$obj = new myclass();
86、在一个类别内如何存取这个类别的特性及变改它的值?
使用语句:$this->propertyName,例如:
class myclass{ private $propertyName; public function __construct() { $this->propertyName = "value"; }}
87、include 和include_once 有什么分别?require 又如何?
三者都是用来在脚本中插入其他档案,视乎url_allow_fopen 是否核准,这个档案可以从系统内部或外部取得。但他们之间也有微细的分别:
include():这个函式容许你在脚本中把同一个档案插入多次,若果档案不存在,它会发出系统警告并继续执行脚本。
include_once():它跟include() 的功能相似,正如它的名字所示,在脚本的执行期间,有关档案只会被插入一次。
require():跟include() 差不多,它也是用来在脚本中插入其他档案,但若果档案不存在,它会发出系统警告,这个警告会引致致命错误令脚本中止执行
88、以下哪一个函式可以把浏览器转向到另一个页面?
redir()
这不是一个PHP 函式,会引致执行错误。
header()
这个是正确答案,header() 用来插入卷头资料,可以用来使浏览器转向到另一个页面,例如:
header("Location: http://www.search-this.com/");
location()
这不是一个PHP 函式,会引致执行错误。
redirect()
这不是一个PHP 函式,会引致执行错误。
89、以下哪一个函式可以用来开启档案以便读/写?
fget()
这不是一个PHP 函式,会引致执行错误。
file_open()
这不是一个PHP 函式,会引致执行错误。
fopen()
这是正确答案,fopen() 可以用来开启档案以便读/写,事实上这个函式还有很多选项,详细资料请参阅php.net。
open_file()
这不是一个PHP 函式,会引致执行错误。
90、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() 的值。
91、下面的代码用来做什么?请解释。
$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","\\2/\\1/\\3",$date);
这是把一个日期从MM/DD/YYYY 的格式转为DD/MM/YYYY 格式。我的一个好朋友告诉我可以把这个正规表达式拆解为以下的语句,对于如此简单的表示是来说其实无须拆解,纯粹为了解说的方便:
// 对应一个或更多0-9,后面紧随一个斜号$regExpression = "([0-9]+)/";// 应一个或更多0-9,后面紧随另一个斜号$regExpression .= "([0-9]+)/";// 再次对应一个或更多0-9$regExpression .= "([0-9]+)";至于\\2/\\1/\\3 则是用来对应括号,第一个括号对的是月份,第二个括号对应的是日期,第三个括号对应的是年份。
92、给你一行文字$string,你会如何编写一个正规表达式,把$string 内的HTML 标签除去?
首先,PHP 有内建函式strip_tags() 除去HTML 标签,为何要自行编写正规表达式?好了,便当作是面试的一道考题吧,我会这样回答:
$stringOfText = "
This is a test
";$expression = "/<(.*?)>(.*?)<\/(.*?)>/";echo preg_replace($expression, "\\2", $stringOfText);// 有人说也可以使用/(<[^>]*>)/ $expression = "/(<[^>]*>)/";echo preg_replace($expression, "", $stringOfText);
93、PHP 和Perl 分辨阵列和散列表的方法有什么差异?
这正是为何我老是告诉别人选择适当的编程语言,若果你只用一种语言的话你怎么能回答这道问题?这道问题很简单,Perl 所有阵列变量都是以@ 开头,例如@myArray,PHP 则沿用$ 作为所有变量的开头,例如$myArray。
至于Perl 表示散列表则用%,例如%myHash,PHP 则没有分别,仍是使用$,例如$myHash。
94、你如何利用PHP 解决HTTP 的无状态本质?
最主要的俩各选择是session 和cookie。使用session 的方法是在每一页的开始加上session_start(),然后利用$_SESSION 散列表来储存session 变量。至于cookie 你只需记着一个原则:在输出任何文字之前调用set_cookie() 函式,此外只需使用$_COOKIE 散列表便可以存取所有cookie 变量。
还有一个不那么可靠的方法,就是利用访客的IP 地址,这个方法有特定的危险性。
95、GD 函式库用来做什么?
这个可能是我最喜欢的函式库,自从PHP 4.3.0 版本后GD 便内建在PHP 系统中。这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是ImageMagick,但这个函式库并不内建于PHP 之中,必须由系统管理员安96、试写出几个输出一段HTML 代码的方法。
嗯,你可以使用PHP 中任何一种输出语句,包括echo、print、printf,大部分人都使用如下例的echo:
echo "My string $variable";你也可以使用这种方法:
echo<< HTML tags in here as well. The END; remarks must be on a line of its own, and can't contain any extra white space.END;
97、PHP 比Perl 好吗?请讨论。
我们不要为一个简单的问题引发一场舌战,正如我经常说的:“为工作选择适合的语言,不要把工作迁就语言。”我个人认为Perl 十分适合用作命令行工具,虽然它在网页应用上也有不错的表现,但是它的真正实力在命令行上才能充分发挥。同样地,PHP 虽然可以在控制台的环境中使用,但是个人认为它在网页应用上有更好的表现,PHP 有大量专门为网页应用而设计的函式,Perl 则似乎以命令行为设计之本。
个人来说两种语言我都喜欢,在大学期间我经常使用Perl、PHP 和Java,可惜工作上我使用C#,但在家里我花不少时间操练PHP、Perl、Ruby(现正学习)和Java,保持我的技能知识在最新状态。很多人问我C 和C++ 怎么样,它们是否仍有机会在我的应用中占一席位,我的答案基本上是“否”,我近来的工作主要集中在网页开发,虽然C 和C++ 也可以用来写网页,但它们到底不是为这种工作而设计的,“为工作选择适合的语言”,若果我需要编写一个控制台应用,用来展示bubble sort、quick sort 和merge sort 的效能比较,我一定会使用C / C++。若果我需要编写一个相片簿系统,我会使用PHP 或者C#(我认为制作用户介面方面.NET 语言比网页更加)。
98、请说明PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
答:传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。
99、在PHP中error_reporting这个函数有什么作用?
答:The error_reporting() function sets the error_reporting directive at runtime. PHP has many levels of errors, using this function sets that level for the duration (runtime) of your script.
100、请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
答:
if(isset($_POST['action']) && $_POST['action']=='submitted')
{
$email=$_POST['email'];
if(!preg_match("/^(?:w+.?)*w+@(?:w+.?)*w+$/",$email))
{
echo "电子邮件检测失败";
}
else
{
echo "电子邮件检测成功";
}
}
else
{
?>
<script type="text/javascript">
function checkEmail(sText)
{
var reg=/^(?:w+.?)*w+@(?:w+.?)*w+$/;
var email=document.getElementById(sText).value;
if(!reg.test(email))
{
alert("电子邮件检测失败");
}
else
{
alert("电子邮件格式正确");
}
}
</script>
电子邮件:
}
?>
101、简述如何得到当前执行脚本路径,包括所得到参数。
echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
//echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
102、有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)
function BubbleSort(&$arr)
{
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++)
{
if($flag==0)
{
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++)
{
if($arr[$j]>$arr[$j+1])
{
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
?>
103、请举例说明在你的开发过程中用什么方法来加快页面的加载速度
答:要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具啦
Mysql部分
104、创建poll表,用于记录单选投票用户的数据
字段包括id[ Autoincreace ] , ip , time , iid(用户选则的选项,int型)
写出create上述table的完整sql语句
drop table if exists poll;
/*==============================================================*/
/* Table: poll */
/*==============================================================*/
create table poll
(
id int unsigned not null auto_increment,
ip varchar(15) not null,
time datetime not null,
iid int not null,
primary key (id)
)
105、写出将一个选择2号选项的ip为127.0.0.1的用户在当前时间的投票记录到数据库的SQL
insert into poll (ip,time,iid) values('127.0.0.1',now(),2);
106、写出满足下边条件的SQL语句
item表的结构为id(就是poll表中的iid) ,descp(用户选择的选项的文字)
请查询并返回10条记录,包括ip和用户选择的选项的文字
107、现在因为投票人数太多,网站时常出现too many connection的错误,请提供解决方案
方法一:加大MySql的最大连接数
mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些,编辑my.ini
修改max_connections=1000
方法二,不用mysql数据库,改为直接写文件,详细方法参照问题5
若非要用mysql,还可
方法三:由于用mysql语句调用数据库时,在每次之执行语句前,会做一个临时的变量用来打开数据库,所以你在使用mysql语句的时候,记得在每次调用完mysql之后就关闭mysql临时变量
108、在成功解决连接数的问题后,发现程序运行缓慢,经查发现是mysql并发太多,表被锁定的现象严重,请提供解决方案
对于访问量大的,本来就不推荐使用数据库,可以考虑直接写到文本中,根据预测的访问量,先定义假若是100个文件文件名依次为1.txt,2.txt…100.txt,每有用户投票的时候,随机往其中的一个文件中写入投票信息。统计的时候,再对所有文本文件中的数据进行分析。必要的时候,再导入数据库
drop table if exists item;
/*==============================================================*/
/* Table: item */
/*==============================================================*/
create table item
(
id int not null,
descp varchar(200) not null,
primary key (id)
);
select A.ip,b.descp
from poll A,item B
where A.id=B.id
limit 10
109、因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这3台服务器?
对于服务器分配,其实有好几种方案(建议采用LINUX主机),先列出一个解决方案。
1.考虑到电信,网通(南北差异)互访问速度慢的问题,可以让电信的用户走电信的线,网通的走网通的线。大致可以这样分配,国内南方用户(电信用户)拥有一台服务器A;北方用户(网通用户)拥有一台服务器B。国外的用户也可以考虑给一台服务器C。用户访问的时候,首先访问的是针对国外的服务器,那台机器是电信网通的用户访问速度都差不多的(可以考虑就租用香港或是什么地方的),经过服务器C判断后直接跳到相应的服务器。统计时三台机器的数据合起来。
110、现在开始要求同一ip不能重复投票,请指出如何对数据表进行相应的修改
ALTER TABLE `phpinterview`.`poll` ADD unique INDEX `IX_poll_ip`(`ip`);
111、原有数据已经有很多重复ip的数据了,所以我们把它导出为一个txt,格式和上边的poll一致,用TAB键间隔,请写一段程序,删除ip有重复的记录,并统计每个投票选项的投票数
//读取文本并放入数组
$apoll = file("c:\1.txt");
//对每一行数据进行分割,从而获取了一个二维数组
for ($i=0;$i
{
$poll[$i] = split(" ",$apoll[$i]);
}
//获取IP、出现的次数数据
$arrIP=array();
for($i=0;$i
{
$arrIP[$poll[$i][1]]=isset($arrIP[$poll[$i][1]])?$arrIP[$poll[$i][1]]+1:1;
}
//获取选项、投票个数
$arrRes=array();
for($i=0;$i
{
if($arrIP[$poll[$i][1]]==1)
{
$arrRes[$poll[$i][3]]=isset($arrRes[$poll[$i][3]])?$arrRes[$poll[$i][3]]+1:1;
}
}
var_dump($arrRes);
?>
mysql5.0测试版:
/*========================得到测试数据c: .txt=========*/
SELECT *
into outfile 'c: .txt'
FROM `testok`;
/*========================载入临时表=========*/
create TABLE phpinterview.testok(id int,ip varchar(15),time datetime,iid int);
LOAD DATA INFILE 'c: .txt'
into table testok;
/*=========================删除ip有重复的记录=========*/
delete A from testok A,(select ip from testok B group by ip having count(*) >1) B
where A.ip=B.ip
/*================统计每个投票选项的投票数==============================*/
select iid,count(*) from testok B group by B.iid
112、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来
表名User
Name Tel Content Date
张三13333663366 大专毕业2006-10-11
张三13612312331 本科毕业2006-10-15
张四021-55665566 中专毕业2006-10-15
请根据上面的题目完成代码:
$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);
代码
drop table if exists user;
/*==============================================================*/
/* Table: user */
/*==============================================================*/
create table user
(
`Name` varchar(20),
Tel varchar(16),
Content varchar(255),
`Date` date
)
insert into user(name,tel,content,`date`) values('张三','13333663366','大专毕业','2006-10-11');
insert into user(name,tel,content,`date`) values('张三','13612312331','本科毕业','2006-10-15');
insert into user(name,tel,content,`date`) values('张四','021-55665566','中专毕业','2006-10-1');
select * from user where name='张三';
代码
header("content-type:text/html; charset=gbk");
$mysql_db=mysql_connect("localhost","root","");
@mysql_select_db("phpinterview",$mysql_db);
echo "
";
mysql_query("set names gbk");
$result=mysql_query("select Name,Tel,Content,Date from user where Name='张三'") or die("错误:".mysql_error());
while($row=mysql_fetch_array($result,MYSQL_BOTH))
{
echo "
";
}
mysql_free_result($result);
echo "
".$row["Name"]." ".$row["Tel"]." ".
$row["Content"]."
".$row["Date"]." "
?>
113、如何使用下面的类,并解释下面什么意思?
class test{
function Get_test($num){
$num=md5(md5($num)."En");
return $num;
}
}
/**
* 使用md5加密数据...
*
*/
class test{
function Get_test($num){
$num=md5(md5($num)."En");
return $num;
}
}
$a=new test();
echo $a->Get_test("123");
?>
114、用javascipt打印“上海爱吉”
<script type="text/javascript">
document.write("上海吉它");
</script>
115、写出SQL语句的格式: 插入,更新,删除
代码
select expression
from tablename
where condition
group by columns asc
with rollup
order by column asc
limit offset,rowcount;
insert into tablename(columname) values(exp);
update tablename set columnname=exp where condition order by column limit rowcount;
delete from tablename where condition order by column limit rowcount;
116、某内容管理系统中,表message有如下字段
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量
创建上表,写出MySQL语句
117、同样上述内容管理系统:表comment记录用户回复内容,字段如下
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
文章id 文章标题点击量回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
118、上述内容管理系统,表category保存分类信息,字段如下
category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单
drop table if exists Comment;
drop table if exists category;
drop table if exists message;
/*==============================================================*/
/* Table: Comment */
/*==============================================================*/
create table Comment
(
comment_id int unsigned not null,
id int unsigned not null,
comment_content text,
primary key (comment_id)
)
type = InnoDB;
/*==============================================================*/
/* Table: category */
/*==============================================================*/
create table category
(
category_id int not null AUTO_INCREMENT,
category_name varchar(40) not null,
primary key (category_id),
key AK_pk_category_id (category_id)
)
type = InnoDB;
/*==============================================================*/
/* Table: message */
/*==============================================================*/
create table message
(
id int not null,
title varchar(120) not null,
content text not null,
category_id int unsigned,
hit int unsigned,
primary key (id)
)
type = InnoDB;
select A.id,A.title,A.hits,IFNULL(B.num,0)
from message A left join (select id,count(*) as num from comment B group by id) B
on A.id=B.id
order by B.num desc;
mysql_connect("localhost","root","") or die("db conn error:".mysql_error()); mysql_select_db("phpinterview") or die("db error".mysql_error()); $result=mysql_query("select category_id,category_name from category"); while($row=mysql_fetch_array($result)) { echo "".$row["category_name"].""; } ?>
119、内容管理系统:用户提交内容后,系统生成静态HTML页面;写出实现的基本思路
直接通过php写入文件,或使用模板来替换标签
120、简单描述用户修改以发布内容的实现流程和基本思路
更新内容,替换静态文件
121、写出以下程序的输出结果
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
122、写出以下程序的输出结果
$str="cd";
$$str="hotdog";
$$str.="ok";
echo $cd;
?>
hotdogok
123、有一表menu(mainmenu,submenu,url),请用递归法写出一树形菜单,将所有的menu列出来
function GenerateMenu($id=0,$str="")
{
$result=mysql_query("select mainmenu,url,submenu from menu where mainmenu=$id");
while($row=mysql_fetch_array($result))
{
echo $str.$row["url"]."
";
GenerateMenu($row["submenu"],$str."--");
}
mysql_free_result($result);
}
$link=mysql_connect("localhost","root","");
mysql_select_db("phpinterview");
GenerateMenu();
mysql_close($link)
?>
124、给你三个数,写程序求出其最大值。
$var1=1;
$var2=7;
$var3=8;
$max=$var1>$var2?$var1:$var2;
$max=$max>$var3?$max:$var3;
echo $max;
125、写出发贴数最多的十个人名字的SQL,利用下表:
members(id,username,posts,pass,email)
SELECT username,count(*) as num FROM `members` group by username desc order by count(*) desc limit 10
10)如何通过javascript判断一个窗口是i已经被屏蔽。
<script>
var result = window.open("/somepage.aspx");
if(result==null)
{
alert("浏览器不允许弹出窗口");
}
</script>
126、写出session的运行机制
用户A访问站点Y,如果站点Y执行了session_start();(以下假定session_start()总是存在)那么会产生一个session_id,这个session id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制SESSION ID必须以COOKIE传递。)。这时候SESSION ID表现为$_COOKIE[’PHPSESSID’];(PHPSESSID可用session_name()函数来修改)
用户A接着访问,这个session id($_COOKIE[’PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。
127、防止SQL注射漏洞一般用__addslashes___函数。
128、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。
129、在PHP中error_reporting这个函数有什么作用?
设定php脚本的错误报告级别,说实话,我没怎么用过,我现在用的是C#开发,。
130、请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
/*
检查邮件地址是否为邮件地址,返回逻辑值
*/
functionCheckMailAdr($str){
return(eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$str));
}
131、简述如何得到当前执行脚本路径,包括所得到参数。
说明:例如有一个脚本 www.domain.com,传给他的参数有参数1,参数2,参数3…。传递参数的方法有可能是GET有可能是POST,
那么现在请写出类似:http://www.domain.com/script.php?参数1=值1&参数2=值2.....的结果
关于前执行脚本路径感觉有点歧义:若是得到该脚本在服务器上的绝对路径用 $_SERVER[‘APPL_PHYSICAL_PATH’].若是该脚本的URL则可以用获取
获取所有参数:可以用以下方法:
//获取post的数据
while(list($var, $value) = each($HTTP_POST_VARS))
{
echo"$var = $value n";
}
//获取get方式的数据
while(list($var, $value) = each($HTTP_GET_VARS))
{
echo"$var = $value n";
}
132,有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)
可以用冒泡排序
functionBubbleSort($str)
{
for($i=0;$i {
for($j=count($str)-2;$j>=$i;$j--)
{
if($str[$j+1]<$str[$j])
{
$tmp= $str[$j+1];
$str[$j+1]=$str[$j];
$str[$j]=$tmp;
}
}
}
return$str;
}
$str= array(3,6,1,5,9,0,4,6,11);
print_r(BubbleSort($str));
?>
132、负载均衡
目前主要有三种网络负载平衡转发技术,分别是网络地址转换、直接路由和IP隧道技术,采用不同的方法将客户端发送的包转发到目的服务器上,并确保目的服务器的返回包可以顺利到达客户端。
● 网络地址转换
网络地址转换模式
在目标网络地址转换(DNAT)模式下,提供服务的IP被定义在平衡服务器上,应用服务器只需要定义各自的内部IP地址,但是必须将负载平衡服务器定义为缺省路由,以保证返回客户端的包经过负载平衡服务器,完成第二次地址转换后再送回客户端。
原理:
1. 客户发出服务请求
2. 负载平衡服务器接收到请求,将数据包中目的IP地址改为选中的应用服务器IP地址,然后重新发出数据包
3. 应用服务器收到后,将应答包发回给负载平衡服务器
4. 负载平衡服务器收到应答包后将其中的源地址改回成服务IP,发回客户端
缺点是网络地址转换的性能扩展能力有限,因为请求包和应答包都必须通过平衡服务器,当服务器的节点数量达到20或更多时,平衡服务器可能成为整个系统的瓶颈。因此,这种方式主要适用于网络负载不是很高的场合。
● 直接路由
和那种请求包和应答包都必须通过平衡服务器的网络地址转换不同,平衡服务器在直接路由模式下,将请求调度到不同的实际服务器,实际服务器直接将结果发回 客户端。在大多数应用中,请求的字节数远小于应答的字节数,所以与网络地址转换相比平衡服务器能处理更多的请求。采用直接路由能更大程度提高平衡服务器的 最大节点数和网络吞吐量。甚至于平衡服务器使用100M全双工的网卡,系统的最大数据吞吐量仍可以超过1Gbps。
直接路由的特点是运用网络分层原理,通过将目标IP包封装在指定MAC地址的以太网数据包中欺骗TCP堆栈,因此实际服务器和负载平衡服务器必须在同一个物理网段中,并且在应用服务器上必须将服务IP定义在loopback虚拟网卡上。
原理:
1. 客户发出服务请求
2. 负载平衡服务器接收到请求,将数据包中网卡物理地址(MAC)改为选中的应用服务器的MAC地址,然后重新发出数据包
3. 目标应用服务器收到后,将应答包通过路由器直接发回客户端(不经过负载平衡服务器)
直接路由是最高效,网络延时最小的负载平衡技术,但是,为达到MAC地址的欺骗,负载平衡服务器和所有应用服务器必须在同一个物理网段。而且,现在出现操作系统缺省是关闭这种特性的,如FreeBSD,必须显示打开相应的内核开关才可以。不过,目前的主流操作系统,都可以满足直接路由的需求,如Windows、Linux、AIX、Solaris、FreeBSD等。
直接路由转换模式
●IP隧道
与直接路由的方法类似,区别仅仅在于不是通过MAC欺骗来转发数据包,而是通过建立负载平衡服务器和应用服务器之间的IP隧道来完成。
因为这些服务器的连接是通过IP隧道,平衡服务器和实际服务器可以在不同的局域网甚至是广域网。缺点是所有服务器必须使用IP隧道(IP封装)协议,比直接路由的效率要低,而且,不是所有的操作系统都支持。
133、索引
索引的原理;索引的意义;什么情况下不易用索引,
134、2.int varchar char text 的最大值和在gbk和ntf_8中所占字符数
135、3.xss是什么?怎么预防
136、4.include与require的区别
137、5.192.168.0.1用二进制和十进制分别如何表示
138、在PHP中,当前脚本的名称(不包括路
上一篇: JSP中include的用法讲解
下一篇: C语言版单向链表的简单实现教程
推荐阅读
-
Ubuntu16.04搭建php5.6Web服务器环境
-
PHP版Mysql爆破小脚本
-
PHP示例演示发送邮件给某个邮箱
-
jquery+php后台实现省市区联动功能示例
-
PHP中number_format()函数的用法讲解
-
PHP中str_split()函数的用法讲解
-
PHP中quotemeta()函数的用法讲解
-
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
-
C#常见算法面试题小结
-
CentOS下安装Memcached和PHP Memcached扩展