PHP问题汇总

以下是PHP的一些题目,说是基础测试,实际上,就算有3年以上PHP开发经验的都未必能完全应答对。

1 请写出至少5个PHP中的超级变量,并说明超级变量的功能
$_SERVER $_GET $_POST $_COOKIE $_ENV $_REQUEST $_SESSION $GLOBALS,全局可用可操作。

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

服务器IP echo $_SERVER[‘SERVER_ADDR’]

客户端IP比较复杂,因为可能来自多重代理
$_SERVER[‘REMOTE_ADDR’] 直接获取最近代理的IP
$_SERVER[‘HTTP_CLIENT_IP’]
$_SERVER[‘HTTP_X_FORWARDED_FOR’]

$CLIENT_IP = ($_SERVER[“HTTP_VIA”]) ? $_SERVER[“HTTP_X_FORWARDED_FOR”] : $_SERVER[“REMOTE_ADDR”];
$CLIENT_IP = ($CLIENT_IP) ? $CLIENT_IP : $_SERVER[“REMOTE_ADDR”];
echo $user_IP.”
“;
实际上,SERVER中的每个变量都可以是测试对象,那么你需要记住所有的….。实际上,我通常会把SERVER数组输出,挑选我要的,我没有办法全部记住,也没有必要。只要能回答使用SERVER数组就应该算对了。

3 用PHP打印出前一天的日期,格式为YYYYMMDD hh:mm:ss
参考:http://blog.ifeeline.com/138.html

echo date(‘Y-m-d h:i:s’,time()-246060);

echo date(‘Y-m-d h:i:s’,strtotime(“-1 days”));

$date = new DateTime(‘now’);
$date->modify(‘-1 day’);
echo $date->format(‘Y-m-d h:i:s’);
日期的操作实际比较复杂,如果熟悉了某框架的方法,你可能真无法想起这些PHP原配方法。好吧,你有3年+的PHP开发经验,可是你没有想起来???基础不好,运气不好?

4 语句include和require的区别是什么,为避免多次包含同一文件,可用(?)语句代替它们?

http://blog.ifeeline.com/94.html

无论require的位置如何,指定文件都将包含到出现require的脚本中。比如放入条件语句中,即使条件语句为假,也会包含指定的文件。
require出错时脚本停止执行,而include则继续执行。比如引用了错误的目标路径,require将出错而停止执行,而include则不会。

这个区别实际上很多人都不清楚,虽然很基础。只要能回答“require即使在条件语句中也总是会包含文件而include可以条件包含”就算满分了。

为了避免多次包含,只能使用require_once()或include_once(),不能使用(?)代替,require在引用了错误路径后执行马上停止。

5 请写出一个函数验证电子邮件的格式是否正确
虽然用过N多正则,真要用笔写出来,估计难处….
function validEmail($email){
if(preg_match(“/^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/i”,$email)){
return TRUE;
}
return FALSE;
}

6 使用PHP写一个简单查询…

http://blog.ifeeline.com/329.html

$db = new PDO(‘mysql:host=db.example.com’,$user, $password);
$st = $db->query(‘select * from user’);
foreach($st->fetchAll() as $row){
}

$db = new PDO(‘mysql:host=db.example.com’,$user, $password);

$st = $db->prepare(‘select * from user’);

foreach($st->fetchAll() as $row){
}
这个也难产,现在的很多PHP框架都提供了对数据库的封装,如果长时间基于某框架开发,PHP原装的查询操作,你能想的起来,并且能用笔写出来?

7 检验一个变量是否有设置的函数是?是否为空的函数是?
iset() empty()

8 用PHP输出下面这段JSON
var testjson = {fruit:[{apple:”苹果”};{bannana:”香蕉”}]}

echo “var testjson = “.json_encode(array(fruit=>array(array(apple=>”苹果”),array(banana=>”香蕉”))));
//var testjson = {“fruit”:[{“apple”:”\u82f9\u679c”},{“banana”:”\u9999\u8549”}]}
9 简单描述PHP中Session的存储方式及如何操作

http://blog.ifeeline.com/300.html

session.save_handler = files|mm|sqlite|user 文件 共享内存 sqlite 用户自定义
用户自定多见于把数据保存到数据库中,使用session_set_save_handler()实现,这个方法需要提供opne,close,read,write,destroy,gc接口方法的实现的句柄。共享内存多见于保存到memcached,一般需要安装扩展模块,也可以使用session_set_save_handler自定义保存到共享内存中。

这个主题绝对不属于基础测试的范围。你可能知道可以保持到文件和数据库,实际上你可能根本没有深入搞清楚过具体的细节,好吧,你有3年+PHP开发经验哦。

10 PHP中如何设置报错级别,分别说明在配置文件和代码中设置的方法

http://blog.ifeeline.com/690.html

配置文件中,error_reporting设置了报告的类型,log_errors决定了是否记录错误,记录的地方由error_log指定,display_errors决定是否显示错误信息。
在代码中可用函数error_reporting(‘E_ALL | E_STRICT’)设置。用ini_set()可以在运行时改变PHP的运行时指令,所以init_set(‘error_reporting’,’E_ALL | E_STRICT’)也可以生效。
这个题目也是如此,设置报错实际上这个操作很少操作,不像其它常用函数那样多次使用,就算多次使用也只是知道轮廓,很多时候,用时还要参考文档,更何况不怎么常用的操作。

—————>
如何修改SESSION的生存时间
SESSION的生存时间默认由配置文件中的session.cookie_lifetime来控制,默认为0,表示退出浏览器保存会话ID的cookie马上被删除,意味着会话过期。要修改SESSION的生存时间实际是修改保存会话ID的这个cookie的生存时间,PHP提供了session_set_cookie_params()方法来设置这个会话cookie的参数。
SESSION的生存时间实际跟cookie没有任何联系,session.cookie_lifetime指令或session_set_cookie_params()方法只是用来设置传递SID的cookie在浏览器的生存时间,服务端的SESSION的生存时间实际由指令session.gc_maxlifetime指定,意思是对于超过这个值的SESSION数据,PHP的垃圾回收器将会对它进行清除。

echo(),print(),print_r()的区别
echo是PHP语句,print和print_r是函数,语句没有返回值。print_r可以递归打印。

如何实现字符串翻转
可是直接使用内置的strrev()函数。

简述如何得到当前执行脚本路径,包括所得到参数

##http://example.com/time.php/url/?abc=123

[SCRIPT_FILENAME] => D:/www/time.php    实际执行脚本
[QUERY_STRING] => abc=123               查询串
[REQUEST_URI] => /time.php/url/?abc=123 查询URI(包含查询串)
[SCRIPT_NAME] => /time.php              执行脚本
[PATH_INFO] => /url/                    
[PATH_TRANSLATED] => D:\www\url\
[PHP_SELF] => /time.php/url/
[REQUEST_TIME] => 1367746221
[argv] => Array
    (
        [0] => abc=123
    )

MYSQL取得当前时间的函数是? 格式化日期的函数是?

mysql> select now(),current_timestamp(),curtime();
+———————+———————+———–+
| now() | current_timestamp() | curtime() |
+———————+———————+———–+
| 2013-05-05 17:22:49 | 2013-05-05 17:22:49 | 17:22:49 |
+———————+———————+———–+

date_format(date, format)
实现中文字串截取无乱码的方法
mb_substr()。

写一个正则表达式,过滤所有的HTML代码
echo preg_replace(“/<[^>]>/i”,”,$str);

写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉
/<script[^>].?>.?<\/script>/si

编写一个SOCK程序,使用POST,提交数据,用Cookie回传参数……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

//POST DATA
$post = array('username'=>'vfeelit','pwd' =>'&123=321&321=123&','intro'=>'Hello world!');
$post_data = '';
foreach($post as $i=>$v){
$post_data .= rawurlencode($i).'='.rawurlencode($v).'&';
}
$post_data = substr($post_data,0,-1);

//COOKIE DATA
$cookie = array('cur_query'=>'you&me','last_tm'=>time()-600,'cur_tm'=>time());
$cookie_data = '';
foreach($cookie as $ci=>$cv){
$cookie_data .= rawurlencode($ci).'='.rawurlencode($cv).';';
}
$cookie_data = substr($cookie_data,0,-1);

//HOST
$host = '127.0.0.1';

//REQUEST STRING
$req = "POST /s.php HTTP/1.1\r\n";
$req .= "Host: ".$host."\r\n";

$req .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0\r\n";
$req .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$req .= "Accept-Language: en-us,en;q=0.5\r\n";
$req .= "Accept-Encoding: gzip, deflate\r\n";

$req .= "Cookie: ".$cookie_data."\r\n";
$req .= "Content-Type: application/x-www-form-urlencoded\r\n";
$req .= "Content-Length: ".strlen($post_data)."\r\n";
$req .= "Connection: close\r\n\r\n";
$req .= $post_data."\r\n";

//SOCKET
$fp = fsockopen("tcp://".$host,80,$errno,$errstr,20);
if(!$fp){
echo "Sock Open Failed!";
}else{
//echo $req;
fwrite($fp,$req);
while(!feof($fp)){
echo fgets($fp,1024);
}
}
fclose($fp);

只要对SOCKET有概念,基本都是完成完成程序的,不过手写代码的话你就要记住HTTP的首部信息与格式了。除非经常写,否则手写基本难产。

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

sleep wakeup
toString set_state
construct, destruct
call, get,
set, isset,
unset sleep,
wakeup, toString,
set_state, clone
__autoload
请写出让,并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?

php filename.php $agr1 $agr2
php -r “”
PHP的垃圾收集机制
页面结束即释放变量所占内存的。当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。GC进程一般都跟着每起一个SESSION而开始运行的. GC目的是为了在session文件过期以后自动销毁删除这些文件。 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP 的GC垃圾处理机制

使对象可以像数组一样进行foreach循环,要求属性必须是私有。
(Iterator模式的PHP5实现,写一类实现Iterator接口)

1
2
3
4
5
6
7
8
9
10
11

class sample implements Iterator
{
private $_items = array(1,2,3,4,5,6,7);
public function __construct() {}
public function rewind() { reset($this->_items); }
public function current() { return current($this->_items); }
public function key() { return key($this->_items); }
public function next() { return next($this->_items); }
public function valid() { return ( $this->current() !== false ); }
}

请写一段PHP代码,确保多个进程同时写入同一个文件成功(模拟上锁)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

function write_file($filename, $content)
{
$lock = $filename . '.lck';
$write_length = 0;
while(true) {
if( file_exists($lock) ) {
usleep(100);
} else {
touch($lock);
$write_length = file_put_contents($filename, $content, FILE_APPEND);
break;
}
}
if( file_exists($lock) ) {
unlink($lock);
}
return $write_length;
}

用PHP实现一个双向队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

class DEQueue {
//存储
protected $_storage = array();

//入头
public function unshift($element)
{
return array_unshift($this->_storage, $element);
}

//入尾
public function push($element)
{
return array_push($this->_storage, $element);
}

//出尾
public function pop()
{
return array_pop($this->_storage);
}

//出头
public function shift()
{
return array_shift($this->_storage);
}

//长度
public function length()
{
return count($this->_storage);
}
}

使用正则表达式提取一段标识语言(html或xml)代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有空格等)。

你用什么方法检查 PHP 脚本的执行效率(通常是脚本执行时间)和数据库 SQL 的效率(通常是数据库 Query 时间), 并定位和分析脚本执行和数据库查询的瓶颈所在?
microtime()

编写一个自定义函数提取这段路径的的后缀名。

1
2
3
4
5
6
7
8
9
10
11

$url = 'http://www.vfeelit.com/test.php.html?a=3&b=4';
function getExt($url){
$info=parse_url($url);
$p = explode('.',$info);
$t = count($p);
if($t>1){
return $p[$t-1];
}
return false;
}

PHP描述顺序查找和二分查找算法
二分法查找(先排序):

1
2
3
4
5
6
7
8
9
10
11
12
13
14

function bsch($arr, $s, $h, $k){
if($s <= $h){
$m = (int)($s+$h);
if($arr[$k] == $k){
return $m;
}else if($arr[$k] > $k){
return bsch($arr,$s,$m-1,$k);
}else{
return bach($arr,$m+1,$h,$k);
}
}
return false;
}

循序查找

1
2
3
4
5
6
7
8
9
10
11
12

function seqsch($arr, $k){
$idx = false;
$c = count($arr);
for($i=0;$i<$c;$i++){
if($arr[$i] == $k){
$idx = $i;
break;
}
}
return $idx;
}

快速排序和冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

function qksort($arr){
$cnt = count($arr);
if($cnt <=1) return $arr;
$k = $arr[0];
$l = $r = array();

for($i=0;$i<$cnt;$i++){
if($arr[$i] <= $k){
$l[] = $arr[i];
}else{
$r[] = $arr[i];
}
}
$l = qksort($l);
$r = qksort($r);
return array_merge($l,$r);
}

function bsort($arr){
$c = count($arr);
if($c <= 1) return $arr;
for($i=0;$i<$c;$i++){
for($j=1;$j<$c-$i;$j++){
if($arr[$j]<$arr[$i]){
$tmp = $arr[$j-1];
$arr[j-1] = $arr[$j];
$arr[j] = $tmp;
}
}
}
}

有一个留言板,用mysql做数据库,需求如下:
用户信息包括:用户名,密码,email
留言内容包括:留言ID,标题,内容,发表时间,状态(审核,未审核)
1) 画出表结构,在字段中标注是否创建索引
2)用一个sql语句查询出发表留言数量大于10条的用户名及其留言数量,查询结果按文章数量降序排列

1
2

select u.name,count(uc.uid) as total from user u, user_content uc where u.uid = uc.uid group by uc.uid having total > 10 order by total desc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

function my_mkdir($root=NULL,$path=NULL){
if(empty($path)){
return false;
}
$default = dirname(__FILE__);
if(!empty($root)){
$default = $root;
}

//$path
$path = explode('/',trim($path,'/'));
foreach($path as $p){
if(!is_dir($default.$p)){
if(!mkdir($default.$p)){
return false;
}
}
$default .= $p.'/';
}
}

已知一个字符串如下: $str = “1109063 milo 1″;
用一行代码将该字符串里面的1109063赋值给$uid, milo赋值给$user, 1赋值给$type
list($uid,$milo,$type) = each(preg_split(‘/\s+/’,$str))

将下面的数组用一行拼装成一个字符串i am milo! day day up!

1
2
3
4
5
6
7

<?php
$arr = array(
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'
);
?>
$str = strtolowwer(implode(',',$arr));

下面php程序输出的内容是什么? 为什么?

1
2
3
4
5
6

<?php
$str = "aa\tbb\tcc";
@list($a, $b, $c) = explode('\t', $str);
echo $a,$b,$c;
?>

输出$str
应用中我们经常会遇到在user表随机调取10条数据来展示的情况, 简述你如何实现该功能, 不能使用sql函数以及order by等语句->把表内存读取到数组中,1)使用shuffle打乱 2)生成随机下标

假设下面的sql语句里面的uid都能获取到具体值, 经过下面语句查询后uid的顺序是什么, 如何去按照uid in 输入的顺序去排序
select uid from user where uid in(10, 1, 3, 8, 11, 4, 7);
->默认应该是根据uid从到高排序,也可能不是。可以读入数组,然后根据索引组装一个新数组。

用PHP将一个字符串中的字母替换成
preg_replace(‘/[a-zA-Z]+/’,’
’);

如何在php中设置header头信息
header(‘Content-type: text/xhtml’);

单态设置模式

1
2
3
4
5
6
7
8
9
10
11
12
13

class myconn{
public static $conn;
public static function getInstance(){
if(!self::$conn){
new self();
}
retrun self::$conn;
}
private function __construct(){
self::$conn = new PDO('mysql:');
}
}

工厂模式
主要作用是降低耦合度。

坚持原创技术分享,您的支持将鼓励我继续创作!