php面试题
? 一部分来自网上,一部分自己面试中遇到的
php魔术常量
__LINE__,
__FILE__,
__DIR__,
__FUNCTION__,
__CLASS__,
__TRAIT__,
__METHOD__,
__NAMESPACE__,
<?php
echo '这是第 " ' . __LINE__ . ' " 行';
?>
<?php
echo '该文件位于 " ' . __FILE__ . ' " ';
?>
<?php
echo '该文件位于 " ' . __DIR__ . ' " ';
?>
<?php
function test() {
echo '函数名为:' . __FUNCTION__ ;
}
test();
?>
<?php
class test {
function _print() {
echo '类名为:' . __CLASS__ . "<br>";
echo '函数名为:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
?>
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
<?php
function test() {
echo '函数名为:' . __METHOD__ ;
}
test();
?>
<?php
namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"';
?>
php的伪类型
伪类型有三种,分别是:1,mixed混合类型。2,number数字类型。3,callback回调类型。
1,mixed混合类型:
mixed说明一个参数可以接受多种不同的类型,但并不是所有的类型。
2,number数字类型:
number参数可以接受integer整型和float浮点型。
3,callback回调类型:
Print、echo、print_r有什么区别
1) echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
(2) print 是打印字符串
(3)print_r 则是打印复合类型 如数组 对象
PHP处理数组的常用函数
(1)array() 创建数组
(2)in_array() 判断元素是否在数组中
(3)count() 返回数组中元素的数目
(4)array_merge() 将多个数组合并成一个数组
(5)array_diff() 比较两个或两个以上数组的差异
(6)array_intersect() 获取两个或两个数组以上的交集
(7)array_keys() 获取数组的key列表
(8)array_values() 获取数组的值列表
(9)array_unique() 删除数组中的重复值
(10)array_push()将一个或多个元素插入数组的末尾(入栈)
(11)array_pop() 弹出并返回 array 数组的最后一个单元(出栈)
(12)array_walk() 使用用户自定义函数对数组中的每个元素做回调处理
PHP处理字符串的常用函数
(1)trim() 移除字符串两侧的空白字符和其他字符;
(2)strlen() 获取字符串的长度
(3)mb_strlen() 获取字符串长度(可指定字符编码,对中文字符串计算长度)
(4)substr()返回字符串的一部分;
(5)str_replace() 子字符串替换
(6)str_repeat () 重复一个字符串
(7)is_string() 检测变量是否是字符串;
(8)str_shuffle () 随机打乱一个字符串
(9)sprintf() 返回根据格式化字符串生成的字符串(通常用于获取分表后的数据表名)
(10)strstr() 查找字符串的首次出现
(11)addslashes 使用反斜线引用字符串
PHP处理时间的常用函数
(1)date() 格式化一个本地时间/日期。
(2)getdate() 取得日期/时间信息。
(3)date_default_timezone_set() 设定默认时区。
(4)date_default_timezone_get() 返回默认时区。
(5)mktime() 返回一个日期的 Unix时间戳。
(6)strtotime() 将任何字符串的日期时间描述解析为 Unix 时间戳
(7)strftime() 根据区域设置格式化本地时间/日期
PHP操作目录(文件夹)的常用函数
(1)打开目录 opendir()
(2)读取目录 readdir()
(3)删除目录 rmdir()
(4)关闭目录句柄 closedir()
(5)创建目录 mkdir()
(6)返回路径中的目录部分 dirname()
(7)取得当前工作目录 getcwd()
(8)列出指定路径中的文件和目录 scandir()
面试题
1.详述一次完整的HTTP请求过程
2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
1)、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
2)、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。
禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。
3.HTTP 状态中302、403、 500代码含义?
一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列
302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。
4. Linux 下建立压缩包,解压缩包的命令
打包:
tar czf file.tar.gz file.txt
解压:
tar xzf file.tar.gz
打包:
bzip2 [-k] 文件
解压:
bunzip2 [-k] 文件
打包:
gzip file1.txt
解压:
gunzip file1.txt.gz
打包:
zip file1.zip file1.txt
解压:
unzip file1.zip
5. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?
Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型
Varchar 与char的区别 :
char是固定长度的字符类型,分配多少空间,就占用多长空间。
Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。
6. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?
MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,
而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。
创建索引:alert table tablename add index (字段名 )
7. 不使用cookie向客户端发送一个cookie.
session_start()开启时,生成一个常量 SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。通过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面可以使用SESSION里面的值。 当客户端开启COOKIE和服务器端开启SESSION时。 浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID. 当浏览器第二次请求时,会把已存在
8. isset() 和 empty() 区别
Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,
empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。
9.持久化redis有几种方式?
主要有两种方式:
1) 快照持久化
在redis配置文件中已经自动开启了,
格式是:save N M
表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。
当然我们也可以手动执行save或者bgsave(异步)命令来做快照
2)append only file AOF持久化
总共有三种模式,如
appendfsync everysec默认的是每秒强制写入磁盘一次
appendfsync always 每次执行写操作的时候就强制写入磁盘
appendfsync no 完全取决于os,性能最好但是持久化没法保证
其中第三种模式最好。redis默认的也是采取第三种模式。
10.mysql存储引擎
常用的主要分为两种,一种是innodb,一种是myisam,两者的主要区别是
1)myisam不支持事务处理,而innoDB支持事务处理
2)myisam 不支持外键,innoDB支持外键
3)myisam支持全文检索,而innoDB在MySQL5.6版本之后才支持全文检索
4)数据的存储形式不一样,mysiam表存放在三个文件:结构、索引、数据,innoDB存储把结构存储为一个文件,索引和数据存储为一个文件
5)myisam在查询和增加数据性能更优于innoDB,innoDB在批量删除方面性能较高。
6)myisam支持表锁,而innoDB支持行锁
11.sql注入是什么及如何预防sql注入?
SQL注入攻击指的是用户或者黑客通过构建特殊的输入作为参数传入我们的Web应用程序端,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序员没有细致地过滤用户输入的数据,致使非法数据侵入系统而造成的。因此我们在做开发过程中一定要预防sql注入,主要从两方面着手:
1)占位符的方式,就是对sql语句进行预处理,然后执行sql语句
2)通过addslashes或者mysql_real_escape_string这两个函数对用户输入的值进行转义处理,把一些特殊的字符转义掉。
12.有用过预处理么?
用过,PDO类中,有个prepare方法可以实现预处理,PDOStament类中 的excute方法可以执行预处理,
预处理的参数分为两种,
一种是:字符串占位符,
另一种是?占位符,:字符串占位符在执行预处理传递参数时传入的是关联数组,而?占位符传递的是索引数组。两者不能混合使用,但一般推荐使用:字符串占位符。
13.用框架还用自己的处理吗
一般成熟的开源框架中都考虑到了数据安全这方面的东西,但有时候我们可能会使用一些原生的SQL语句时,我们就需要考虑自己对sql语句进行预处理。当然有时候框架中的过滤方法我们不希望采用,比如使用文本编辑器时,我们可以使用自己的过滤方式。
14.mysql优化怎么做的?
mysql优化主要从以下几个方面来实现:
1)设计角度:存储引擎的选择,字段类型选择,范式
2)功能角度:可以利用mysql自身的特性,如索引,查询缓存,碎片整理,分区、分表等
3)sql语句的优化方面:尽量简化查询语句,能查询字段少就尽量少查询字段,优化分页语句、分组语句等。
4)部署大负载架构体系:数据库服务器单独出来,负载大时可以采用主从复制,读写分离机制进行设计
5)从硬件上升级数据库服务器。
15.请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
值传递:函数范围内对值的任何改变在函数外部都会被忽略
引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
16.在PHP中error_reporting这个函数有什么作用?
设置 PHP 的报错级别并返回当前级别。
17.使用PHP描述快速排序算法,对象可以是一个数组吗?
原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。
function QuickSort($arr){
$num = count($arr);
$l=$r=0;
for($i=1;$i<$num;$i++){
if($arr[$i] < $arr[0]){
$left[] = $arr[$i];
$l++;
}else{
$right[] = $arr[$i];
$r++;
}
}
if($l > 1){
$left = QuickSort($left);
}
$new_arr = $left;
$new_arr[] = $arr[0];
if($r > 1){
$right = QuickSort($right);
}
for($i=0;$i<$r;$i++){
$new_arr[] = $right[$i];
}
return $new_arr;
}
18.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
19.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())
function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}
20.对于用户输入一串字符串
s
t
r
i
n
g
,
要
求
string,要求
string,要求string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
class regx {
public static function check($str) {
if(preg_match("/^([1-9,])+$/",$str)) {
return true;
}
return false;
}
}
$str="12345,6";
if(regx::check($str)) {
echo "suc";
} else {
echo "fail";
}
21.单例模式,创建mysqli数据库链接的单例对象
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);
}
}
22.PHP session扩展默认将session数据储存在哪里? D
A) SQLite Database
B) MySQL Database
C) Shared Memory
D) File System
E) Session Server
23.PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)
手动解决:用str_split(string string,intstring,intsplit_length = 1)按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。
<?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);
24.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 (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
{
return is_writable($file);
}
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;
}
}
25.PHP处理上传文件信息数组中的文件类型$_FILES[‘type’]由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠
用getimagesize来判断上传图片的类型比$_FILES函数的type更可靠 同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话, 就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。 可以通过getimagesize()函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组
Array
(
[0] => 331
[1] => 234
[2] => 3
[3] => width="331" height="234"
[bits] => 8
[mime] => image/png
);
26.如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?
基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)
1)屏蔽错误,将display_errors 设置为off 2)过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤
这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。
1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句
2 使用addslashes 将所有特殊字符过滤
3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成 \'
3)可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容 4)可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php
27.请写出让PHP能够在命令行下以脚本方式执行时安装PHP所必须指定的configure参数,并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?
由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php
php -f “index.php”
php -r “print_r(get_defined_constants());”
28.PHP的垃圾收集机制是怎样的?
说明: 1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分 2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。 3)对,则有分,错误不扣,不写无分。
答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
29.get和post的区别?
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
30.如何修改会话的生存时间?
一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间
二:代码实现 $ lifeTime = 24 * 3600; //保存一天
session_set_cookie_params($ lifeTime);
在session_start();
31.微信支付回调失败该如何处理?
他问的是已经支付成功后,但是回调失败了。
自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。
32.调用区块链接口的安全措施,有那些实现方法?
来自PHP技术交流群 群友分享
使用MD5实现对接口加签,目的是为了防止篡改数据。 基于网关实现黑明单与白名单拦截 可以使用rsa非对称加密 公钥和私钥互换 如果是开放接口的话,可以采用oath2.0协议 使用Https协议加密传输,但是传输速度慢 对一些特殊字符实现过滤 防止xss、sql注入的攻击 定期使用第三方安全扫描插件 接口采用dto、do实现参数转化 ,达到敏感信息脱敏效果 使用token+图形验证码方法实现防止模拟请求 使用对ip访问实现接口的限流,对短时间内同一个请求(ip)一直访问接口 进行限制。
33.服务器受到dos攻击,这个问题如何应付?
看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。
对于特定的IP访问的情况,限制IP访问 限制同一IP在单位时间内的访问次数 上级服务器,提高吞吐能力 是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。
34.简述Linux下安装Mysql的过程?
Groupadd mysql 添加一个用户组mysql
Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql
Cd /lamp/mysql 进入mysql目录
./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all
Make
Make all
35.对于大流量的网站,您采用什么样的方法来解决访问量问题?
优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
确定当前服务器设备是否满足流量需求。 使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。 禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。 控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。 使用不同的主机分流主要流量,使服务器均衡负载。 使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。
36.对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:
1)索引的目的是什么?
快速访问数据表中的特定信息,提高检索速度 创建唯一性索引,保证数据库表中每一行数据的唯一性 加速表和表之间的连接 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
- 索引对数据库系统的负面影响是什么?
负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
- 为数据表建立索引的原则有哪些?
在最频繁使用的、用以缩小查询范围的字段上建立索引 在平频繁使用的、需要排序的字段上建立索引
- 什么情况下不宜建立索引?
对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。
37.PHP字符串中单引号与双引号的区别?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
38.求两个日期的差数,例如2021-2-5 ~ 2021-3-6 的日期差数
方法一:
<?php
class Dtime{
function get_days($date1, $date2){
$time1 = strtotime($date1);
$time2 = strtotime($date2);
return ($time2-$time1)/86400;
}
}
$Dtime = new Dtime;
echo $Dtime->get_days(’2021-2-5′, ’2021-3-6′);
?>
方法二:
<?php
$temp = explode(‘-’, ’2021-2-5′);
$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
$temp = explode(‘-’, ’2021-3-6′);
$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
echo ($time2-$time1)/86400;
方法三:echo abs(strtotime(“2021-2-5″)-strtotime(“2021-3-1″))/60/60/24 计算时间差
39.有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)
<?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);
41什么是面向对象?主要特征是什么?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。
主要特征:封装、继承、多态。
42PHP执行的时候有如下执行过程:Scanning(Lexing) - Compilation - Execution - Parsing,其含义分别为:
将PHP代码转换为语言片段(Tokens)、将Tokens转换成简单而有意义的表达式、将表达式编译成Opocdes、顺次执行Opcodes
43php选项/信息函数作用错误的是?
A、phpinfo() 输出关于 PHP 配置的信息
B、php_sapi_name() 返回 web 服务器和 PHP 之间的接口类型
C、ini_set() 为一个配置选项设置值
D、ini_get() 获取所有配置选项
参考答案:D
答案解析:
ini_get() 是获取一个配置选项,获取所有配置选项的函数是ini_get_all()
44下列对shell 变量FRUIT 操作,正确的是?
A、为变量赋值:$FRUIT=apple
B、显示变量的值:fruit=apple
C、显示变量的值:echo $FRUIT
D、判断变量是否有值:[ -f ―$FRUIT ]
参考答案:C
答案解析:
为变量赋值FRUIT=apple; 显示变量的值为C; 判断是否有值[-n $FRUIT];
45以下不是线性表是?
A、数组
B、二叉树
C、队列
D、栈
参考答案:B
答案解析:
二叉树是树结构
46以下哪个函数不是PHP的文件指针操作?
A、ftell()
B、fseek()
C、file()
D、feof()
参考答案:C
答案解析:
ftell() 返回文件指针位置 fseek() 在文件指针中定位 feof() 测试文件指针是否在结尾
47PHP的三个模块不包括哪个?
A、内核
B、zend引擎
C、扩展层
D、解析层
参考答案:D
答案解析:
PHP总共三个模块:内核、zend引擎、以及扩展层
48CSRF攻击描述错误的是?
A、CSRF需要有JavaScript代码
B、CSRF攻击恶意代码位于第三方站点上
C、过滤用户的输入可以防止恶意代码注入到某个站点,但是它无阻止法恶意代码在第三方站点上运行
D、CSRF符合同源策略
参考答案:A
答案解析:
XSS攻击需要JavaScript代码,CSRF攻击不需要JavaScript代码
49关于PHP数组在C语言中是哪种存储结构?
A、单链表
B、双链表
C、循环链表
D、二叉树
参考答案:B
答案解析:
双链表
50一个5L,一个6L的瓶子,要得到3L的水。
将6L的瓶子装满,然后往5L的空瓶子里倒水当装满5L的瓶子时6L的瓶子里只剩1L的水,再将5L瓶子清空将6L瓶子里1L水倒入,再将6L瓶子装满倒入装有1L水的5L瓶子,装满5L瓶子,此时6L瓶子剩2L水,如此再来一次就能得到3L水。
51联合查询
具体面试题已记得不清楚了。
关于联合查询详见https://blog.csdn.net/qq_36260310/article/details/79699377
52用会的语言实现递归
网上看到的一个例子https://www.cnblogs.com/xianz666/p/13754165.html
- 递归是一种函数调用自身的机制
- 递归必须要有边界条件,也就是递归出口(退出递归)
- 递归前进段和递归返回段,也就是最后得到的值
- 当边界条件不满足时,递归前进;当边界条件(递归出口)满足时,递归返回
<?php
echo "-------------------------------------"."\n";
function num1($n,$m=1){
static $x=1;
if($n>0){
$x=$n*$m;
$n--;
echo $x."\n";
num1($n,$x);
}
return $x."\n";
}
echo num1(4);
echo "-------------------------------------"."\n";
function num($n){
static $m=1;
if($n>0){
$m*=$n;
num(--$n);
echo $m."\n";
}
return $m."\n";
}
echo num(4);
echo "-------------------------------------"."\n";
?>
-------------------------------------
4
12
24
24
24
-------------------------------------
24
24
24
24
24
-------------------------------------
public class Main {
public static void main(String[] args) {
System.out.println(get(4));
}
public static long get(int n) {
long result = 1;
if (n == 1) {
result *= 1;
}
else {
result = n * get(n-1);
}
return result;
}
}
24
52用会的语言实现array{8,9,13,11,23,45,3,2,55}快速排序
快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边,然后以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组,重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有序的)。
代码中会常常使用交换数组中两个元素值的Swap方法,其代码如下
public static void Swap(int[] A, int i, int j){
int tmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
private static void quickSort(int[] arr,int left,int right){
int l=left;
int r=right;
int pivot=arr[(left+right)/2];
int temp=0;
while (l<r){
while (arr[l]<pivot){
l++;
}
while (arr[r]>pivot){
r--;
}
if (l>=r){
break;
}
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
if (arr[l]==pivot){
r--;
}
if (arr[r]==pivot){
l++;
}
}
if (l==r){
l++;
r--;
}
if (left<r){
System.out.println(pivot);
System.out.println("左"+left+"--|--"+r+"\n");
System.out.println(Arrays.toString(arr)+"\n");
quickSort(arr,left,r);
}
if (l<right){
System.out.println(pivot);
quickSort(arr,l,right);
System.out.println("右"+right+"--|--"+l+"\n");
System.out.println(Arrays.toString(arr)+"\n");
}
}
php启动session
Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start()。session_start()函数的语法格式如下:
Bool session_start(void)
当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。
<?php
session_start();
$_SESSION["username"]="skygao";
$_SESSION["uid"]=1;
?>
执行该脚本后,两个Session变量就会被保存在服务器端的某个文件中,该文件的位置是通过php.ini文件,在session.save_path属性指定的目录下。
注销变量与销毁Session
当使用完一个Session变量后,可以将其删除,当完成一个会话后,也可以将其销毁。如果用户退出Web系统,就需要为他提供一个注销的功能,把他的所有信息在服务器中销毁。销毁和当前Session有关的所有的资料,可以调用session_destroy()函数结束当前的会话,并清空会话中的所有资源。该函数的语法格式如下所示:
bool session_destroy(void)
详细见php中Session使用方法详解 - 码农编程进阶笔记 - 博客园 (cnblogs.com)
|