PHP笔试之简答题

时间:2022-10-24 21:53:58

1、 请简述echoprintprint_r的区别?

答:echoprint实际上都不是函数,而是一个语法结构。不同的是echo返回值是void,并且可以输出多个参数值;而print返回值是int(总是返回1),且只能输出一个字符串值。Print_r是一个输出函数,返回值为boolean型,如果给出的是 stringinteger float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素,并将把数组的指针移到最后边使用 reset() 可让指针回到开始处。object与数组类似。


2、 请简述一下htmlspecialcharshtmlentities的区别?

答:这两个函数的功能都是将特殊字符转换为HTML字符编码(有& ' " <  > 这几个特殊符号),防止字符标记被浏览器执行。但是htmlentities将转换所有的html标记,连同里面的它无法识别的中文字符也给转化了。


3、 请简述func_get_argsfunc_num_args的功能。

答:①int func_num_args( void )-- 这个函数返回传递到目前定义函数的参数数目;②array func_get_args (void )-- 这个函数返回的是包含目前定义函数所有参数的一个数组;③mixed func_get_arg ( int $arg_num )-- 函数返回的是指定位置的参数的值


4、 请列举一下php错误日志处理的方法。

答:对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可。错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中或发送给系统syslog,分别介绍如下:

  使用指定的文件记录错误报告日志

如果使用指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。并且该文件一定要让PHP脚本的执行用户(Web服务器进程所有者)具有写权限。假设在Linux操作系统中,将/usr/local/目录下的error.log文件作为错误日志文件,并设置Web服务器进程用户具有写的权限。然后在PHP的配置文件中,将error_log指令的值设置为这个错误日志文件的绝对路径。需要将php.ini中的配置指令做如下修改:

1. error_reporting = E_ALL;将会向PHP报告发生的每个错误  

2. display_errors = Off;不显示满足上条 指令所定义规则的所有错误报告  

3. log_errors=On;决定日志语句记录的位置  

4. log_errors_max_len = 1024;设置每个日志项的最大长度  

5. error_log = /usr/local/error.log; 指定产生的 错误报告写入的日志文件位置

PHP的配置文件按上面的方式设置完成以后,并重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/usr/local/error.log中。此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。该函数的原型如下所示:

1. bool error_log ( string message [, intmessage_type  [, string destination [,string extra_headers]]] )  此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。该函数执行成功则返回TRUE,失败则返回FALSE。第一个参数message 是必选项,即为要送出的错误信息。如果仅使用这一个参数,会按配置文件php.ini中所设置的位置处发送消息。第二个参数message_type为整数值:0表示送到操作系统的日志中;1则使用PHPMail()函数,发送信息到某E-mail处,第四个参数extra_headers亦会用到;2则将错误信息送到TCP 服务器中,此时第三个参数destination表示目的地IPPort3则将信息存到文件destination中。

②错误信息记录到操作系统的日志里 

错误报告也可以被记录到操作系统日志里,但不同的操作系统之间的日志管理有点区别。在Linux上错误语句将送往syslog,而在Windows上错误将发送到事件日志里。如果希望将错误报告写到操作系统的日志里,可以在配置文件中将error_log指令的值设置为syslog。具体需要在php.ini中修改的配置指令如下所示:

1. error_reporting=E_ALL;将会向PHP报告发生的每个错误  

2. display_errors = Off ;不显示 满足上条指令所定义规则的所有错误报告  

3. log_errors = On;决定日志语句记录的位置  

4. log_errors_max_len = 1024;设置每个日志项的最大长度  

5. error_log = syslog;指定产生的错误报告写入操作系统的日志里 

除了一般的错误输出之外,PHP还允许向系统syslog中发送定制的消息。虽然通过前面介绍的error_log()函数,也可以向syslog中发送定制的消息,但在PHP中为这个特性提供了需要一起使用的4个专用函数。分别介绍如下: define_syslog_variables()  在使用openlog()syslogcloselog()三个函数之前必须先调用该函数。因为在调用该函数时,它会根据现在的系统环境为下面三个函数初使用化一些必需的常量。

openlog() 打开一个和当前系统中日志器的连接,为向系统插入日志消息做好准备。并将提供的第一个字符串参数插入到每个日志消息中,该函数还需要指定两个将在日志上下文使用的参数。 

syslog() 该函数向系统日志中发送一个定制消息。需要两个必选参数,第一个参数通过指定一个常量定制消息的优先级。例如LOG_WARNING表示一般的警告,LOG_EMERG表示严重地可以预示着系统崩溃的问题,一些其他的表示严重程度的常量可以参考官方文档使用。第二个参数则是向系统日志中发送的定制消息,需要提供一个消息字符串,也可以是PHP引擎在运行时提供的错误字符串。

closelog() 该函数在向系统日志中发送完成定制消息以后调用,关闭由openlog()函数打开的日志连接。 如果在配置文件中,已经开启向syslog发送定制消息的指令,就可以使用前面介绍的四个函数发送一个警告消息到系统日志中,并通过系统中的syslog解析工具,查看和分析由PHP程序发送的定制消息。


5、 请简述一下includeinclude_oncerequirerequire_once的区别?requireinclude的效率哪个高?

答:includerequire语句包含并运行指定文件。区别是require是编译包含,只要有引入就会包含,而且如果包含的文件出现异常,怎会抛出异常停止执行;而include是运行包含,只有执行到include语句时,才包含引入文件,并且如果包含的文件出现异常,怎会抛出异常继续执行。

         include_once()函数的作用与include相同,不过它会首先验证是否已经包含了该文件。如果已经包含,则不再执行include_once。否则,则必须包含该文件。Require_once()include_once()相同,区别同上。

Php在遇到include时就解释一次,如果页面中出现10includephp就解释10次,

php遇到require时只解释一次,即使页面出现多次require也只解释一次,因此require

的执行表率比include高。


6、 $_REQUEST$_POST$_GET$_COOKIE$_SESSION$_FILE的意思是什么

答:它们都是PHP预定义变量。

         $_REQUEST用来获取postget方式提交的值

         $_POST用来获取post方式提交的值

         $_GET用来获取get方式提交的值

         $_COOKIE用来获取cookie存储的值

         $_SESSION用来获取session存储的值

         $_FILE用来获取上传文件表单的值


7、 数组中下标最好是什么类型的,为什么?

答:数组的下标最好是数字类型的,数字类型的处理速度快。


8、 ++ii++哪一个效率高,为什么?

答:++i效率比i++的效率更高,因为++i少了一个返回i的过程。


9、 magic_quotes_gpcmagic_quotes_runtime的意思是什么?

答:Magic_quotes_gpcphp配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的所有的 ' (单引号)" (双引号)\(反斜杠)和 NUL's被一个反斜杠自动转义。

         magic_quotes_runtimephp配置文件中的,如果设置为on,则大多数返回任何形式外部数据的函数,包括数据库和文本段将会用反斜线转义引号。 如果启用了 magic_quotes_sybase,单引号会被单引号转义而不是反斜线。(特性已自PHP 5.3.0 废弃并将自 PHP 5.4.0移除


10、你对Memcach的理解,优点有哪些?

答:Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,

下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库。使用memcache

做缓存的好处是:提高网站的访问速度,减轻高并发时服务器的压力。

         Memcache的优点:稳定、配置简单、多机分布式存储、速度快。


11、表单中 getpost提交方法的区别?

答:get用户端将数据加到URL后,格式为”?字段1=输入数据1&字段2=输入数据2&..."。由于get提交参数后会在地址栏中显示出来,所以会产生严重的安全问题。并且get传输的数据量小,这主要是因为受url长度限制;

         post方式提交,就不会使用url传参数,而且数据量几乎没有限制,这样可以提交大量的数据,安全性可靠!


12、数据库中的事务是什么?

答:数据库事务是指作为单个逻辑工作单元执行的一系列操作。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。


13、优化MYSQL数据库的方法。

答:(1)数据库设计方面,要有良好的数据库结构,必要的时候,去正规化,允许部分数据冗余,避免JOIN操作,以提高查询效率,并检查有没有少加索引

 (2)系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.

(3)数据库集群,主服务器Read &write,从服务器read only,或者N台服务器,各机器互为Master

(4)写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group Byorder 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可以提高一个数量级的查询速度.


14、对于大流量的网站,您采用什么样的方法来解决访问量问题?

答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,大量采用缓存队列,程序功能规则,实现网站的静态化,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量。


15、请写出数据类型(int char varchar datetime text)的意思请问varcharchar有什么区别

:int是数字类型,char固定长度字符串,varchar可变长度字符串,datetime日期时间型,text文本字符串。

         char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于MMySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

         MySQL中用来判断是否需要进行对据列类型转换的规则

1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.

2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.

3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.例外:长度小于4个字符的char数据列不会被转换为varchar类型

建意: myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。

memory存储引擎 目前都使用固定数据行存储,因此无论使用char varchar列都没关系,

innodb 存储引擎 建意使用varchar 类型


16、一些编译php时的configure 参数

答:./configure

--prefix=/usr/local/php-----php安装目录

–with-config-file-path=/usr/local/php/etc----指定php.ini位置

--with-mysql=/usr/local/mysql/----mysql安装目录,对mysql的支持

–with-mysqli=/usr/local/mysql/bin/mysql_config----mysqli文件目录,优化支持

--with-jpeg-dir=/usr/local/jpeg/----打开对jpeg图片的支持

--with-freetype-dir=/usr/local/freetype/----打开对freetype字体库的支持

--with-png-dir=/usr/local/libpng---打开对png图片的支持

--with-gd=/usr/local/gd/----打开gd库的支持

--with-curl=/usr/local/curl/----打开对cURL库支持

--with-libxml-dir=/usr/local/libxml2/----打开libxml2库的支持(libxml2软件包提供允许用户操控XML文件的函数库,包含有读、修改和写XMLHTML文件支持)

--with-zlib=/usr/local/zlib/----打开zlib库的支持(zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性。zlib 也支持读写 gzip (.gz) 格式的文件)

--with-iconv-dir=/usr/local/libiconv/----开启iconv函数库的支持,实现字符集间的转换

--with-mcrypt=/usr/local/libmcrypt/----开启mcrypt加密模块的支持

--with-openssl=/usr/local/openssl/----开启OpenSSL模块,可以产生、验证签名和加密解密数据

--with-mhash=/usr/local/mhash/---开启对hash函数库的支持

--enable-gd-native-ttf-----支持TrueType字符串函数库

--enable-soap-----开启对soap的支持(wenbservice

--enable-sockets-----打开 sockets 支持

--enable-mbstring-----多字节,字符串的支持

--enable-zip -----打开对zip的支持

--enable-fpm-----开启PHP-FPM的支持

--disable-debug----关闭调试模式


17、使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请打开mod_rewrite.

答:1.启用mod_rewrite模块,打开Apache2\conf\httpd.conf搜索 :

LoadModulerewrite_module modules/mod_rewrite.so (Apache2是这个)去掉前面的#

2. 找到AllowOverride None 改成 AllowOverride All。注:AllowOverride 的参数设置为ALL,表示整台服务器上都支持URL规则重写。Apache 服务器要读每个网站下目录下的 .htaccess 文件。如果没有这个文件,或者这个文档没有定义任何关于URL重写的规则就不会有任何效果。

3.对于不同的网址,需要在APACHE中增加如下内容

/*引号里代表你的web存放目录*/

/*如果是Linux,只要你定位到你网站目录即可*/

<Directory “E:/ApacheGroup/Apache2/htdocs/leapsoul”>

Options FollowSymLinks
   AllowOverride All

</Directory>

4.重启apache服务器,先按stopstart

5.在你需要URL重写的网站目录下放一个.htaccess文件,文件名是.htaccessWindiws下不能直接建立,你可以用记事本另存为。注:我测试的时候在每个需要伪静态的目录下都存放了对应的.htaccess文件,同时在httpd.conf文件中像第三步那样对相关的目录添加了相应的<Directory>..</Directory>代码。

6.在.htaccess中通过正则表达式映射需要伪静态的页面。

URL正则表达式如下:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/archivers/(\d+)\.html$ index.php?id=$1


18MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

答:


19、对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题

答:


20、请介绍Session的原理,大型网站中Session方面应注意什么?

答:HTTP定义了通过万维网传输文本、图形、视频和所有其他数据所用的规则。http是一种无状态的协议,每次请求的处理都与之前或之后的请求无关。答对于希望创建复杂的web应用程序的开发人员,这就成了重大缺陷。为了修复这个问题,就发展出了cookie,但受限于cookie的大小、cookie数量以及cookie实现上的不一致,开发人员就提出了一种更好的解决方案:session

         Session的实现方式是为每位网站访问者分配一个会话ID(SID)的唯一标示属性,然后将此SID视为与任意数量的数据关联,在HTTP无状态行为下,session通过两种方式实现:①通过cookie存储SID,并在必要时获取SID,并在页面中使用与SID相关的各项数据。此外,即使会话结束,cookie也能在客户端保存,所以可以再后续会话中读取。②URL重写,在每个请求页面的本地URL上增加SID。无论客户何时单击这些本地练级,都会导致SID的自动传播,这样即使客户端禁用cookie,也不会影响会话处理功能的正常使用,但这种方法也有缺陷,URL重写在会话之间不能保证持久性,其次无法阻止用户将URL复制到电子邮件并发送给另一个用户。

         在大型网站中,为了提高访问量,应用服务器一般会做集群部署,这时session会存储在个服务器中,需要在设计的时候注意实现session的共享。


21、测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。

答:


22、正则提出一个网页中的所有链接.

答:


23、介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuzpassport)的原理。

答:在实现单点登录过程中,很可能会涉及到不同域名间的单点登录,因此无法通过写大域名实现,这样就需要调用每个子站的登录接口,让每个子站写出自己的cookie信息,记录用户登录。具体实现就是在主站中抽取出一个用户中心,有用户中心统一管理全站用户信息。当用户需要登录时,点击登录跳转到用户中心进行登录操作。如果用户信息正确,有用户中心生成出js的应用,通过这些js请求各子站点的登录接口,使各子站点写出自己对应的cookie信息,记录用户信息和登录状态。


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

答:


25、以Apache模块的方式安装PHP,在文件http.conf中首先要用语句(1)动态装载PHP模块,然后再用语句(2)使得Apache把所有扩展名为php的文件都作为PHP脚本处理。

解:(1)LoadModule php5_module D:/xampp/apache/bin/php5apache2.dll

(2)AddType application/x-httpd-php-source .phps

AddType application/x-httpd-php .php .php5.php4 .php3 .phtml


26、请问cgifastcgi有什么不同,你在什么情况下会选择哪个?

答:cgi是由于以前web服务器一般只处理静态的请求,如果碰到一个动态请求,web服务器会根据这次请求的内容,启动一个新进程来运行外部程序(或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才启动的进程也随之退出。如果下次用户还请求动态脚本,那么web服务器又会再次启动一个新进程,周而复始的进行。

fastcgi的方式是,web服务器启动时会根据配置文件初始化一个进程服务池。web服务器收到一个请求时,服务器不会重新启动一个进程,而是从进程池中获取一个进程,直接把请求内容传递给这个进程;这个进程收到请求后进行处理,把结果返回给web服务器;然后释放该进程,重新将该进程放会到进程服务池中,等待下一个请求的到来。


27PHP substr(),mb_substr()mb_strcut的区别和用法

答:PHP substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr() /mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是 一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。

举个例子:

<?php

echomb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');

?>

输出:这样一来我的字

<?php

echomb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');

?>

输出:这样一

从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象……

 

mbstring 函数的说明:

 

phpmbstring扩展模块提供了多字节字符的处理能力,平常最常用的就是用mbstring来切分多字节的中文字符,这样可以避免出现半个字符的情况,由于是php的扩展,它的性能也要比一些自定义的多字节切分函数要好上一些。

 

mbstringextension提供了几个功能类似的函数,mb_substrmb_strcut,看看手册上对它们的解释。

 

mb_substr

mb_substr()returns the portion of str specified by the start and length parameters.

 

mb_substr()performs multi-byte safe substr() operation based on number of characters.Position is counted from the beginning of str. First character's position is 0.Second character position is 1, and so on.

 

mb_strcut

mb_strcut()returns the portion of str specified by the start and length parameters.

 

mb_strcut()performs equivalent operation as mb_substr() with different method. If startposition is multi-byte character's second byte or larger, it starts from firstbyte of multi-byte character.

 

Itsubtracts string from str that is shorter than length AND character that is notpart of multi-byte string or not being middle of shift sequence.

 

再举个例子,有一段文字分别用mb_substrmb_strcut来做切分:

 

PLAINTEXT

CODE:

<?php

$str = '我是一串比较长的中文-www.51projob.com';

echo"mb_substr:" . mb_substr($str, 0, 6, 'utf-8');

echo"<br>";

echo"mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');

?>

输出结果如下:

 

mb_substr:我是一串比较

mb_strcut:我是


28strlen()mb_strlen的作用分别是什么

答:int strlen ( string $string)---返回给定的字符串 string 的长度。不会区分字符串的编码规则。

int mb_strlen ( string $str [, string $encoding ] )---根据字符串编码方式,获取一个string的长度。

例如:$str = "您好,呵呵";

echo strlen($str);-----15

echo mb_strlen($str,'UTF8');-----5


29、写出smarty模板的特点

答:Smarty是一个php模板引擎。它实现了逻辑程序和外在的内容的分开,提供了一种易于管理的方法。并且执行效率非常高;不需要多余的模板语法解析,仅仅是编译一次;仅对修改过的模板文件进行重新编译;可以编辑'自定义函数'和自定义'变量',因此这种模板语言完全可以扩展;可以自行设置模板定界符 ;一些模板语句可以被传递到php语法解析器;引擎是可以定制的.可以内嵌php代码到你的模板文件中;内建缓存支持;独立模板文件;可自定义缓存处理函数、插件体系结构等。


30、写出下列几个预定义全局变量的作用

答:$_SERVER['DOCUMENT_ROOT']当前运行脚本所在的文档根目录。在服务器配置文件中定义。

$_SERVER['HTTP_HOST']当前请求的 Host: 头部的内容

$_SERVER['REMOTE_ADDR']正在浏览当前页面用户的 IP 地址

$_SERVER['HTTP_REFERER']链接到当前页面的前一页面的 URL 地址

$_SERVER['SERVER_NAME']当前运行脚本所在服务器主机的名称

$_FILES包含有所有上传的文件信息。

$_FILES['userfile']['name']客户端机器文件的原名称。

$_FILES['userfile']['type']文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP端并不检查,因此不要想当然认为有这个值。

$_FILES['userfile']['size']已上传文件的大小,单位为字节。

$_FILES['userfile']['tmp_name']文件被上传后在服务端储存的临时文件名。

$_FILES['userfile']['error']和该文件上传相关的错误代码。


31、写出phppublicprotectedprivate三种访问控制模式的区别

答:public: 公有类型

在子类中可以通过 self::属性名(或方法名调用public方法或属性,parent::方法名 调用父类方法;在实例中可以能过 $obj->属性名(或方法名来调用 public类型的方法或属性

protected: 受保护类型

在子类中可以通过 self::属性名(或方法名调用protected方法或属性,parent::属性名(或方法名调用父类方法;在实例中不能通过 $obj->属性名(或方法名来调用 protected类型的方法或属性

private: 私有类型
该类型的属性或方法只能在该类中使用,在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法