关于PHP的100个小知识
最后一期【81-100】
正文内容
81、对于大流量的网站,您采用什么样的方法来解决访问量问题?
- 确认服务器硬件是否足够支持当前的流量
- 优化数据库访问
- 禁止外部的盗链
- 控制大文件的下载
- 使用不同主机分流主要流量
- 使用流量分析统计软件
82、error_reporting(2047)什么作用?
相当于 error_reporting("E_ALL");
输出所有的错误。
83、 简述如何得到当前执行脚本路径,包括所得到参数。
访问 http://localhost/phpinfo.php?id=1
echo $_SERVER['SCRIPT_URL']; //得到/phpinfo.php
echo $_SERVER["SCRIPT_URI"]; //得到http://localhost/phpinfo.php
echo $_SERVER["SCRIPT_FILENAME"]; //得到 /usr/local/var/www/phpinfo.php
echo $_SERVER["REQUEST_URI"]; //得到/phpinfo.php?id=1
echo $_SERVER["SCRIPT_NAME"]; //得到/phpinfo.php
84、写出session的运行机制。
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为sessionid
,如果已包含一个sessionid
则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。一般这个cookie的名字都是类似于SEEESIONID。由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。
85、Cookie的原理及使用?
Cookie是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一般随着HTTP头发送到服务器端。在Cookie生效之后及失效之前,客户每次发出页面请求的时候,都会把Cookie一块发送到服务器。
86、Form中的get和post方法,有什么区别?
- Get参数显示在URL上,而Post是在请求体里面。
- Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用
?
连接,而各个变量之间使用&
连接;Post是将表单中的x数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。 - Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post。
- Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
- Post传输的数据量大,可以在配置文件中设置大小,而Get方法由于受到URL长度的限制。
87、PHP中魔术方法有哪些?
__construct()
, __destruct()
, __call()
, __callStatic()
, __get()
, __set()
, __isset()
, __unset()
, __sleep()
, __wakeup()
, __serialize()
, __unserialize()
, __toString()
, __invoke()
, __set_state()
, __clone()
和 __debugInfo()
88、isset()和empty()的区别
isset()
是测试变量是否被创建赋值,而empty()
是测试已经被赋值的变量是否为空
。如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示。如果一个变量被赋空值,$foo=””或者$foo=0或者$foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。要注销一个变量,可以用unset($foo)或者$foo=NULL。
89、以下哪一句不会把 John 新增到 users 阵列?
$users[] = 'john';
成功把John新增到阵列users
array_add($users,'john');
函式 array_add() 无定义。
array_push($users,'john');
成功把 John 新增到阵列 users。
$users ||= 'john';
语法错误。
90、以下哪一个函式可以把浏览器转向到另一个页面?
redir()
这不是一个PHP函式,会引致执行错误。
header()
这个是正确答案,例如:header("Location: http://shengxuecheng.cn/");
location()
这不是一个PHP函式,会引致执行错误。
redirect()
这不是一个PHP函式,会引致执行错误。
91、PHP中的非静态方法可以通过静态调用吗,反之呢?
其实问题是问没有通过static定义的方法,能否通过"对象名::方法名"
这样的形式来调用。答案是会产生一个strict错误,但在会继续执行代码。反之,能否通过"对象名->方法名"
的形式来调用static定义的方法?答案是不能,会出错并中断程序执行。
92、使用utf-8编码,以下代码输出结果是什么?strlen函数是计算字符串的字节数还是字符数?
$str = '您好hello';
echo strlen($str); // 11
strlen()
函数返回字符串的长度。
中文utf-8编码一个字算3的长度。
93、什么是时间戳?时间戳能代表的最小年份和最大年份是多少?
格林威治时间 1970 年 1 月 1 日 00:00:00
到当前时间的秒数。有效的时间戳典型范围是格林威治时间 1901 年 12 月 13 日 20:45:54
到 2038 年 1 月 19 日 03:14:07
。(此范围符合32 位有符号整数的最小值和最大值)。不过在 PHP 5.1 之前此范围在某些系统(如 Windows)中限制为从 1970 年 1 月 1 日 到 2038 年 1 月 19 日
。
94、MyISAM与innoDB存储引擎有何差别?
- 两者在文件构成上有区别;
InnoDB
支持事务处理MyISAM
不支持;- 对无
WHERE子
句的COUNT(*)
操作的不同:MyISAM
中保存了该值,直接读取,InnoDB
需要作全表扫描; - 锁的区别:
InnoDB
支持表级锁和行级锁,MyISAM
只支持表级锁; - 索引会缓存数据,而
MYISAM
不会; INNODB
不区分char和varchar;INNODB
支持hash索引,而MYISAM
不支持;InnoDB
不支持FULLTEXT
类型的索引;InnoDB
中不保存表的具体行数,也就是说,执行select count(*) from table
时,InnoDB
要扫描一遍整个表来计算有多少行,但是MyISAM
只要简单的读出保存好的行数即可。注意的是,当count(*)
语句包含where
条件时,两种表的操作是一样的;- 对于
AUTO_INCREMENT
类型的字段,InnoDB
中必须包含只有该字段的索引,但是在MyISAM
表中,可以和其他字段一起建立联合索引; DELETE FROM table
时,InnoDB
不会重新建立表,而是一行一行的删除;LOAD TABLE FROM
MASTER
操作对InnoDB
是不起作用的,解决方法是首先把InnoDB
表改成MyISAM
表,导入数据后再改成InnoDB
表,但是对于使用的额外的InnoDB
特性(例如外键)的表不适用。
95、如何记录php程序错误至系统日志?
将PHP
的log_errors
开启即可,默认是记录到WEB服务器的日志文件里,比如Apache
的error.log
文件。当然也可以记录错误日志到指定的文件中。
代码如下:
# vim /etc/php.inidisplay_errors = Off
log_errors = On
error_log = /var/log/php-error.log
另外也可以设定error_log = syslog
,使这些错误信息记录到操作系统的日志里。
display_errors = Off
//不显示错误
error_reporting
设定错误讯息回报的等级
96、用最少的代码写一个求3值最大值的函数.
<?php
function ($a, $b, $c) {
return $a > $b ? ($a > $c ? $a : $c) : ($b > $c ? $b : $c);
}
97、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?
heredoc
的语法是用<<<
加上自己定义成对的标签,在标签范围內的文字视为一个字符串
<?php
$str = <<<SHOW
my name is eson!
SHOW;
98、有哪些字符串函数?
chr
— 通过ASCII码值返回指定的字符
ord
— 通过指定的字符返回ASCII码值
explode
— 使用一个字符串分割另一个字符串
implode
— 将一个一维数组的值转化为字符串
join
— 别名implode
htmlspecialchars
— 把预定义的字符转换为HTML
实体(比如说大于小于)
nl2br
— 在字符串所有新行之前插入HTML
换行标记
strip_tags
— 从字符串中去除HTML
和PHP
标记
lcfirst
— 使一个字符串的第一个字符小写
ucfirst
— 将字符串的首字母转换为大写
ucwords
— 将字符串中每个单词的首字母转换为大写
md5
— 加密,返回32位的字符串
sha1
— 加密,返回40位的字符串
number_format
— 以千位分隔符方式格式化一个数字
trim
— 去除字符串首尾处的空白字符(或者其他字符)
ltrim
— 删除字符串开头的空白字符(或其他字符)
rtrim
— 删除字符串末端的空白字符(或者其他字符)
chop
— rtrim 的别名
str_replace
— 子字符串替换
str_ireplace
— str_replace的忽略大小写版本
str_pad
— 使用另一个字符串填充字符串为指定长度
str_repeat
— 重复一个字符串
str_shuffle
— 随机打乱一个字符串
str_split
— 将字符串转换为数组
strstr
— 查找字符串的首次出现
strchr
— 别名 strstr
stristr
— strstr 函数的忽略大小写版本
strrchr
— 查找指定字符在字符串中的最后一次出现
strpos
— 查找字符串首次出现的位置
stripos
— 查找字符串首次出现的位置(不区分大小写)
strripos
— 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strrpos
— 计算指定字符串在目标字符串中最后一次出现的位置
strlen
— 获取字符串长度
strrev
— 反转字符串
strtolower
— 将字符串转化为小写
strtoupper
— 将字符串转化为大写
substr
— 截取字符串
99、数组函数
array_shift
— 将数组开头的单元移出数组
array_pop
— 将数组最后一个单元弹出(出栈)
array_unshift
— 在数组开头插入一个或多个单元
array_push
— 将一个或多个单元压入数组的末尾(入栈)
array_keys
— 返回数组中部分的或所有的键名
array_values
— 返回数组中所有的值
in_array
— 检查数组中是否存在某个值
array_key_exists
— 检查给定的键名或索引是否存在于数组中
key_exists
— 别名 array_key_exists
array_rand
— 从数组中随机取出一个或多个单元
array_reverse
— 返回一个单元顺序相反的数组
array_unique
— 移除数组中重复的值
array_merge
— 合并一个或多个数组
count
— 计算数组中的单元数目或对象中的属性个数
sizeof
— count 的别名
array_sum
— 计算数组中所有值的和
array_flip
— 交换数组中的键和值
array_count_values
— 统计数组中所有的值出现的次数
shuffle
— 将数组打乱
reset
— 将数组的内部指针指向第一个单元
prev
— 将数组的内部指针倒回一位
current
— 返回数组中的当前单元
pos
— current 的别名
each
— 返回数组中当前的键/值对并将数组指针向前移动一步
next
— 将数组中的内部指针向前移动一位
end
— 将数组的内部指针指向最后一个单元
sort
— 对数组排序
rsort
— 对数组逆向排序
asort
— 对数组进行排序并保持索引关系
arsort
— 对数组进行逆向排序并保持索引关系
ksort
— 对数组按照键名排序
krsort
— 对数组按照键名逆向排序
compact
— 建立一个数组,包括变量名和它们的值
range
— 快速创建数组
100、单例模式,创建mysqli数据库链接的单例对象?
<?php
class Db
{
private static $instance;
public $handle;
private function __construct($host, $username, $password, $dbname)
{
$this->handle = NULL;
$this->getcon($host, $username, $password, $dbname);
}
public static function getBb()
{
self::$instance = new Db();
return self::$instance;
}
private function getcon($host, $username, $password, $dbname)
{
if($this->handle!=NULL){
return true;
}
$this->handle = mysqli_connect($host, $username, $password,
$dbname);
}
}
Thanks♪(・ω・)ノ 感谢你长得那么好看还来看我的博客!see you around ~