面试题

session与cookie的区别和联系
1.存放位置:Session保存在服务器,Cookie保存在客户端。
2.存放的形式:Session是以对象的形式保存在服务器,Cookie以字符串的形式保存在客户端。
3.用途:Cookies适合做保存用户的个人设置,爱好等,Session适合做客户的身份验证
4.路径:Session不能区分路径,同一个用户在访问一个网站期间,所有的Session在任何一个地方都可以访问到。而Cookie中如果设置了路径参数,那么同一个网站中不同路径下的Cookie互相是访问不到的。
5.安全性:Cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
6.大小以及数量限制:每个域名所煲含的cookie 数:IE7/8,FireFox:50个, Opera30个; Cookie总大小:Firefox和Safari允许cookie多达4097个字节,Opera允许cookie多达4096个字 节,InternetExplorer允许cookie多达4095个字节;一般认为Session没有大小和数量限制。
联系
Session需要借助Cookie才能正常工作。如果客户端完全禁止Cookie,Session将失效!因为Session是由应用服务器维持的一个 服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID 提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

  1. 如何修改SESSION的生存时间
  2. 设置浏览器保存的sessionid失效时间 setcookie(session_name(), session_id(), time() + $lifeTime, "/");
  3. 可以使用SESSION 自带的 session_set_cookie_params(86400); 来设置 Session 的生存期
  4. 通过修改php.ini中的session.gc_maxlifetime参数的值就可以改变session的生存时间
  5. PHP页面重定向的方法有哪些
  6. header('Location: http://www.baidu.com/') ;
  7. echo '';
    3 echo '';
  8. PDO、adoDB、PHPLib数据库抽象层比较
    PHP数据库抽象层就是指,封装了数据库底层操作的介于PHP逻辑程序代码和数据库之间的中间件。
    PDO以PHP 5.1为基础进行设计,它使用C语言做底层开发,设计沿承PHP的特点,以简洁易用为准,从严格意义上讲,PDO应该归为PHP 5的SPL库之一,而不应该归于数据抽象层,因为其本身和MySQL和MySQLi扩展库的功能类似。PDO是不适合用在打算或者有可能会变更数据库的系 统中的。
    ADODB不管后端数据库如何,存取数据库的方式都是一致的;
    转移数据库平台时,程序代码也不必做太大的更动,事实上只需要改动数据库配置文 件。提供了大量的拼装方法,目的就是针对不同的数据库在抽象层的底层对这些语句进行针对性的翻译,以适应不同的数据库方言!但是这个抽象层似乎体积过于庞 大了,全部文件大概有500K左右,如果你做一个很小的网站的话,用这个似乎大材小用了
    PHPLib可能是伴随PHP一同成长最老的数据库抽象层(但和ADODB相比,它只算是一个MySQL抽象类库),这个抽象类使用方法相当简单,体积小,是小型网站开发不错的选择。
    PDO提供预处理语句查询、错误异常处理、灵活取得查询结果(返回数组、字符串、对象、回调函数)、字符过滤防止SQL攻击、事务处理、存储过程。
    ADODB支持 缓存查询、移动记录集、(HTML、分页、选择菜单生成)、事务处理、输出到文件。 参考 http://apps.hi.baidu.com/share/detail/463678
  9. 长连接、短连接的区别和使用
    长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。
    短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。C/S通信。
    长连接与短连接的使用时机:
    长连接:
    短连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。每个TCP连 接的建立都需要三次握手,每个TCP连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作下次操作时直接发送数据 就可以了,不用再建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,频繁的socket创建也是对资源的浪 费。
    短连接:
    web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定 的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个 连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。
    参考http://www.cnblogs.com/Roberts/archive/2010/12/05/1986550.html
  10. HTTP协议详解、应用
    http(超文本传输协议)是一个基于请求与响应模式的、无状态的、短连接、灵活、应用层的协议,常基于TCP 的连接方式。
    参考 http://blog.csdn.net/gueter/article/details/1524447 (http协议详解)
    (HTTP响应状态码)
    HTTP响应状态码
    状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求
    常见状态代码、状态描述、说明:
    200 OK //客户端请求成功
    400 Bad Request //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务
    404 Not Found //请求资源不存在,eg:输入了错误的URL
    503 Server Unavailable //服务器超时 //可能恢复正常
    304 Not Modifed //自从上次请求后,请求的网页未修改过。
    //服务器返回此响应时,不会返回网页内容。
  11. 异构系统通讯中的通讯加密方案
    参考 http://blog.csdn.net/linvo/article/details/5741942
  12. socket连接步骤
    Socket(套接字)概念
    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,煲含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
    Socket连接过程
    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket
    套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
    服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
    客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
    连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端
    套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
  13. TCP协议,三次握手、四次挥手
    TCP协议(Transmission Control Protocol)是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,四次挥手断开连接。
    位码即tcp标志位,有6种标示:
    SYN(synchronous建立联机) 同步
    ACK(acknowledgement 确认)
    PSH(push传送)
    FIN(finish结束)
    RST(reset重置)
    URG(urgent紧急)
  14. php中常用作用相似,性能差异很大的函数区分及举例
    参考 http://apps.hi.baidu.com/share/detail/43169774
  15. posix及perl兼容正则比较,及函数性能分析
    POSIX正则和 PCRE正则最显著的需要知道的不同点:
  16. PCRE函数需要模式以分隔符闭合.
  17. POSIX兼容正则没有修正符。不像POSIX, PCRE扩展没有专门用于大小写不敏感匹配的函数. 取而
    代之的是, 支持使用/i 模式修饰符完成同样的工作. 其他模式修饰符同样可用于改变匹配策略.
  18. POSIX函数从最左面开始寻找最长的匹配, 但是PCRE在第一个合法匹配后停止. 如果字符串 不匹
    配这没有什么区别, 但是如果匹配, 两者在结果和速度上都会有差别. 为了说明这个不同, 考虑下面的例子(来自Jeffrey Friedl的《精通正则表达式》一书). 使用模式 one(self)?(selfsufficient)?在字符串oneselfsufficient 上匹配, PCRE会匹配到oneself, 但是使用POSIX, 结果将是整个字符串 oneselfsufficient. 两个子串都匹配原始字符串, 但是POSIX将 最长的最为结果.
    PCRE可用的修饰符: (i,s,m)
  19. 实现PERL正则表达式,抓取html文件a标签的所有href超链接
    正则:/]/is

as
退出
百度 HTML; $matches = array(); preg_match_all ( "/]/is", $html, $matches ); print_r($matches[1]); //输出所有超链接 ?>
  1. 如何优化前端性能
  1. 页面内容的优化
    a) 降低请求数
    合并css、js文件,集成CSS图片
    b) 减少交互通信量
    压缩技术:压缩css、js文件,优化图像,减少cookie体积;
    合理利用缓存:使用外部js/css文件,缓存ajax;
    减少不必要的通信量:剔除无用脚本和样式、推迟加载内容、使用GET请求
    c) 合理利用“并行” 尽量避免重定向
    慎用Iframe 样式表置于顶部 脚本放到样式后面加载
    d) 节约系统消耗
    避免CSS表达式、滤镜
    2)服务器的优化
  1. yahoo的34条前端优化法则
    减少HTTP请求、利用CDN技术、 设置头文件过期或者静态缓存、Gzip压缩、把CSS放顶部、 把JS放底部、避免CSS 表达式、将JS和CSS外链、减少DNS查找、减小JS和CSS的体积、 避免重定向、删除重复脚本、 配置ETags、缓存Ajax、尽早的释放缓冲、
    用GET方式进行AJAX请求、延迟加载组件、 预加载组件、减少DOM元素数量、跨域分离组件、
    减少iframe数量、不要出现404页面、减小Cookie、 对组件使用无Cookie的域名、减少DOM的访问次数、开发灵活的事件处理句柄、使用< link >而非@import、避免过滤器的使用、优化图片、优化CSS Sprites、 不要在HTML中缩放图片、缩小favicon. ico的大小并缓存它、保证组件在25K以下、将组件打煲进一个多部分的文档中

  2. 数据库缓存的基本理论,参考memcached
    什么是Memcached?
    memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
    虽然memcached 使用了同样的“Key=>Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的,也就是说 它不是本地的。它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)
    PHP与Memcached
    Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和
    基于反向代理的Web缓存;
    基于反向代理的Web缓存

  3. PHP安全模式
    php安全模式:safe_mode=on|off
    启用safe_mode指令将对在共享环境中使用PHP时可能有危险的语言特性有所限制。可以将safe_mode是指为布尔值on来启用,或者设置为off和脚本尝试访问的文件的UID,以此作为限制机制的基础。如果UID相同,则知性脚本;否则,脚本失败。
    当启用安全模式时,一些限制将生效
    1、 所有输入输出函数(例如fopen()、file()和require())的适用会受到限制,只能用于与调用这些函数的
    脚本有相同拥有者的文件
    2、 如果试图通过函数popen()、system()或exec()等执行脚本,只有当脚本位于safe_mode_exec_dir
    配置指令指定的目录才可能
    3、 3、HTTP验证得到进一步加强,因为验证脚本用于者的UID划入验证领域范围内。此外,当启用安
    全模式时,不会设置PHP_AUTH。
    4、 4、如果适用MySQL数据库服务器,链接MySQL服务器所用的用户名必须与调用mysql_connect()
    的文件拥有者用户名相同。
    以下是一些和安全模式相关的配置选项
    safe_mode_gid=on|off
    safe_mode_include_dir=string
    safe_mode_env_vars=string
    safe_mode_exec_dir=string
    safe_mode_protected_env_vars=string

  4. 常见的web攻击方式
    常见攻击
    XSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入的恶意html代码会被执行,从而达到恶意用户的特殊 目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。但是随着前端技术的不断进步富客户端的应用越来越多,这方面的问题越来 越受关注。举个简单例子 : 假如你现在是sns站点上一个用户,发布信息的功能存在漏洞可以执行js 你在 此刻输入一个 恶意脚本,那么当前所有看到你新信息的人的浏览器都会执行这个脚本弹出提示框 (很爽吧 弹出广告 :)),如果你做一些更为激进行为呢 后果难以想象。
    CSRF(Cross Site Request Forgery),跨站点伪造请求。顾名思义就是 通过伪造连接请求在用户不知情的情况下,让用户以自己的身份来完成攻击者需要达到的一些目的。csrf 的攻击不同于xss csrf 需要被攻击者的主动行为触发。这样听来似乎是有“被钓鱼”的嫌疑。
    多窗口浏览器这这方面似乎是有助纣为虐的嫌疑,因为打开的新窗口是具有当前所有 会话的,如果是单浏览器窗口类似ie6 就不会存在这样的问题,因为每个窗口都是一个独立的进程。举个简单例子 : 你正在玩白社会, 看到有人发了一个连接,你点击过去,然后这个连接里面伪造了一个送礼物的表单,这仅仅是一个简单的例子,问题可见一般。
    cookie劫持。通过获取页面的权限,在页面中写一个简单的到恶意站点的请 求,并携带用户的cookie 获取cookie后通过cookie 就可以直以被盗用户的身份登录站点。这就是cookie 劫持。举个简单例子: 某人写了一篇很有意思的日志,然后分享给大家,很多人都点击查看并且分享了该日志,一切似乎都很正常,然而写日志的人却另有用心,在日志中偷偷隐藏了一个 对站外的请求,那么所有看过这片日志的人都会在不知情的情况下把自己的cookie 发送给了 某人,那么他可以通过任意一个人的cookie 来登录这个人的账户。
    SQL注入攻击
    在 SQL 注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。
    DNS攻击
    拒绝服务攻击
    拒绝服务攻击即攻击者想办法让目标机器停止提供服务,是黑客常用的攻击手段之。
    攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接

  5. PHP做好防盗链的基本思想 防盗链
    什么是盗链?
    盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
    网站盗链会大量消耗被盗链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益。 如何做防盗链?
    不定期更名文件或者目录
    限制引用页
    原理是,服务器获取用户提交信息的网站地址,然后和真正的服务端的地址相比较, 如果一致则表明是站内提交,或者为自己信任的站点提交,否则视为盗链。实现时可以使用HTTP_REFERER1 和htaccess 文件(需要启用mod_Rewrite),结合正则表达式去匹配用户的每一个访问请求。
    文件伪装
    文件伪装是目前用得最多的一种反盗链技术,一般会结合服务器端动态脚本 (PHP/JSP/ASP)。实际上用户请求的文件地址,只是一个经过伪装的脚本文件,这个脚本文件会对用户的请求作认证,一般会检查 Session,Cookie 或HTTP_REFERER 作为判断是否为盗链的依据。而真实的文件实际隐藏在用户不能够访问的地方,只有用户通过验证以后才会返回给用户
    加密认证
    这种反盗链方式,先从客户端获取用户信息,然后根据这个信息和用户请求的文件名 字一起加密成字符串(Session ID)作为身份验证。只有当认证成功以后,服务端才会把用户需要的文件传送给客户。一般我们会把加密的Session ID 作为URL 参数的一部分传递给服务器,由于这个Session ID 和用户的信息挂钩,所以别人就算是盗取了链接,该Session ID 也无法通过身份认证,从而达到反盗链的目的。这种方式对于分布式盗链非常有效。
    随机附加码
    每次,在页面里生成一个附加码,并存在数据库里,和对应的图片相关,访问图片时和此附加码对比,相同则输出图片,否则输出404图片
    加入水印

  6. HTTP请求头信息和响应头信息
    请求头信息
    POST /scp1.1.0/prs/new_rnaseqtask/run_go HTTP/1.1
    Host: 172.30.4.102
    User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0
    Accept: /
    Accept-Language: zh-cn,zh;q=0.5
    Accept-Encoding: gzip, deflate
    Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    X-Requested-With: XMLHttpRequest
    Referer: http://172.30.4.102/scp1.1.0/index.php/prs/new_rnaseqtask/index_continue/13/364 Content-Length: 1819
    Cookie:
    ci_session=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22e31556053ff9407a454f6a1e146d43eb%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%22172.16.23.42%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A50%3A%22Mozilla%2F5.0+%28Windows+NT+6.1%3B+rv%3A6.0%29+Gecko%2F2010010%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1314955607%3B%7D664b51a01ef99bac95f3e2206e79cb00;PHPSESSID=v33mlm1437lmop1fquta675vv4;username=linjinming; tk=1314955601855 Pragma: no-cache
    Cache-Control: no-cache
    响应头信息
    HTTP/1.1 200 OK
    Date: Fri, 02 Sep 2011 09:27:07 GMT
    Server: Apache/2.2.3 (Red Hat)
    X-Powered-By: PHP/5.1.6
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Content-Length: 31
    Connection: close
    Content-Type: text/html; charset=UTF-8

  7. MySQL
    MySQL数据库性能优化
    使用mysqlreport;
    正确使用索引:explain分析查询语句,组合索引,索引副作用(占空间、update)
    开启慢查询日志、使用慢查询分析工具mysqlsla;
    索引缓存、索引代价(插入更新索引);
    表锁,行锁,行锁副作用(update多时候变慢),在select和update混合的情况下,行锁巧妙解决了读写互斥的问题;
    开启使用查询缓存;
    修改临时表内存空间;
    开启线程池;
    MySQL Query语句优化的基本思路和原则

  8. 优化需要优化的Query;

  9. 定位优化对象的性能瓶颈;

  10. 明确优化目标;

  11. 从Explaing入手;

  12. 多使用Profile;

  13. 永远用小结果集推动大的结果集;

  14. 尽可能在索引中完成排序;

  15. 只取自己需要的Columns;

  16. 仅仅使用最有效的过滤条件;

  17. 尽可能避免复杂的Join和子查询。
    MySQL 中MyISAM引擎和InnoDB引擎的区别以及它们的性能
    1:Innodb支持事物,Myisam不支持
    2:锁定机制不一样,Myisam支持表锁定,而Innodb支持行锁
    3:Myisam不支持外键,Innodb能支持
    4:Myisam能在特定环境下支持全文索引,而Innodb不支持
    5:Myisam支持数据压缩,Innodb不支持
    6:在数据存储上,Myisam占用的空间少,Innodb相对多些
    7:Myisam在批量插入和查询方面速度上有优势,而Innodb由于支持行锁,所以在数据修改方面更胜一筹
    MySQL存储引擎
    MyISAM:不支持事务、表锁和全文索引, 操作速度快
    InnoDB:行锁设计、支持外键、支持安全事务
    HEAP:数据存放在内存中,临时表
    NDB Cluster:MySQL的簇式数据库引擎
    CSV: 存储引擎把数据以逗号分隔的格式存储在文本文件中。
    FEDERATED:存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表 Archive: 只支持INSERT和SELECT操作, 压缩后存储, 非常适合存储归档数据
    Merge:允许将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们 表类型,区分表类型
    优化表设计的常用思路
    负载均衡的数据库设计
    数据类型及详细定义,区分

  18. 变量如何定义?如何检查变量是否定义?如何删除一个变量?怎样检测变量是否设置?
    $定义 isset()// 检测变量是否设置
    defined()// 检测常量是否设置
    unset()//销毁指定的变量
    empty()// 检测变量是否为空

  19. 什么是可变变量?
    一个变量的变名可以动态的设置和使用。
    {$a}=hello world

  20. 字符串怎么转成整数,有几种方法?怎么实现?
    强制类型转换: (整型)字符串变量名;
    直接转换:settype(字符串变量,整型);
    intval(字符串变量);

  21. 标量数据和数组的最大区别是什么?
    一个标量只能存放一个数据,而数组可以存放多个数据。

  22. 常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型?
    define()//定义常量 , defined()//检查常量是否定义
    常量的值只能是标量类型的数据。

  23. 如果定义了两个相同的常量,前者和后者哪个起作用?
    前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。

  24. 常量和变量有哪些区别?
    1)常量前没有$符号;
    2)常量只能通过define()定义,而不能通过赋值语句定义;
    3)常量可以在任何地方定义和访问,而变量有全局和局部之分;
    4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义;
    5)常量的值只能是标量数据,而变量的数据库类型有8种原始数据类型。

  25. PHP中常用的几个预定义的全局数组变量是哪些?
    有9大预定义的内置数组变量:
    _GET, _SESSION, _FILES,_ENV, $GLOBALS

  26. 在实际开发中,常量最常用于哪些地方?
    1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名;
    2)将站点的部分路径定义成常量,如web绝对路径,smarty的安装路径,model、view或者controller的文件夹路径;
    3)网站的公共信息,如网站名称,网站关键词等信息

  27. func()和@func()之间有什么区别?
    第二个函数调用失败不会报错,第一个会报错

  28. 字符串运算符“.”与算术运算符“+”有什么区别?
    当“a”“b”之间使用.时认为是连字符。如果两者间是+的时候php会认为是一次运算。
    1)如果+号两边的字符串是数字组成的,那么会将字符串自动转为整型;
    2)如果+号两边是纯粹的字母,那么会输出0;
    3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。

  29. foeach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?
    当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().
    reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。
    数组与字符串之间的转换

  30. 字符串定义的时候单引号和双引号有什么区别?
    单引号加载速度比双引号加载速度快
    B. 去除字符串首尾空格的函数: trim ltrim rtrim(别名:chop) 使用第二个参数,还可以去除指定的字符。
    C. 转义字符串函数:addslashes()
    D. 获取字符串长度的函数:strlen()
    E. 截取字符串长度的的函数:substr()
    F. 检索字符串函数: strstr() , strpos()
    G. 替换字符串函数:str_replace
    41.页面字符出现乱码,怎么解决?
    1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是
    在header()函数中指定了charset;
    例如:

    header(“content-type:text/html;charset=utf-8”);
    2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,
    两者必须保持统一;
    3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一,
    例如:mysql_query(“set names utf8”)。

  31. 在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
    用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入),php端接收数据的时候,应该如何处理?
    使用urlencode()对中文进行编码,使用urldecode()来解码。
    使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。

  32. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?
    第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM MYSQL_ASSOC 默认为MYSQL_BOTH
    result = mysql_query(result, MYSQL_NUM);

  33. 请说出目前学过的返回是资源的函数?
    答: fopen(打开文件)
    imagecreatefromjpeg(png gif) — 从 JPEG 文件新建一图像
    imagecreatetruecolor — 新建一个真彩色图像
    imagecopymerge — 拷贝并合并图像的一部分
    imagecopyresized — 拷贝部分图像并调整大小
    mysql_connect — 打开一个到 MySQL 服务器的连接
    mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE

  34. 文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?
    1.首现要在php.ini中开启文件上传;
    2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;
    3.上传表单一定要记住在form标签中写上enctype="multipart/form-data";

    1. 提交方式 method 必须是 post;
    2. 设定 type="file" 的表单控件;
      6.要注意上传文件的大小MAX_FILE_SIZE、文件类型是否符合要求,上传后存放的路径是否存在。
      可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名,这样就避免了重名。可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成将文件保存到指定目录。
  35. header()函数主要的功能有哪些?使用过程中注意什么?
    答:
    header()发送http头信息
    -header("content-type:text/html; charset=utf-8");-------------------//当前页面输出内容是html,编码为utf-8格式
    -
    -header("content-type:image/png gif jpeg");----------------------------------//当前页面输出内容的格式是图片
    -header("refresh:5;url=http://www.1004javag.com/five/string.php");--//页面5秒后要跳转到新网址
    -header("location:http://1004javag.com/five/string.php");-----------//页面重定向

  36. 文件下载的时候如果使用header()函数?
    答:header("content-type: application/octet-stream;charset=UTF-8"); //在这里加utf-8和在上面定义有什么区别?、??
    header("accept-ranges: bytes");
    header("accept-length: ".filesize(filename));
    header("content-disposition: attachment; filename=".filename);

  37. 什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?
    ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。 '$'是jQuery的别名.
    页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎,
    最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。
    这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,
    减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
    Ajax的优点是:

    1. 减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;
    2. 在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。
      Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。
      ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。
  38. PHP提供了2套正则表达式函数库,分别是哪两套?【
    (1) PCRE Perl兼容正则表达式 preg_ 为前缀
    (2) POSIX 便携式的操作系统接口 ereg_ 为前缀
    111、 如何防止SQL注入?
    要对提交的信息进行过滤,对单引号进行转义。
    首先可以在php.ini中设置,让所有的单引号在提交后都进行转义。或者使用addslashes().
    112FCKEditor自动过滤的解决办法?
    如果您需要编辑模板页,默认的FCK设置是会去掉标签,而且会给你加上

    标签的,如果需要保留的话,只要更改下设置可以了。
    在fckconfig.js里面有:FCKConfig.FullPage = false ;
    改为:FCKConfig.FullPage = true;
    如果想去掉自动添加

    的代码就可以在这里设置
    默认是
    FCKConfig.EnterMode = 'p' ; // p | div | br
    FCKConfig.ShiftEnterMode = 'br' ; // p | div | br
    改成
    FCKConfig.EnterMode = 'br' ; // p | div | br
    FCKConfig.ShiftEnterMode = 'p' ; // p | div | br

  39. 使用GD2库创建图像的步骤?
    1). 创建一个画布:imagecreate();
    2). 设置画布背景颜色,使用RGB设置颜色:imagecolorallocate();
    3). 设置文字颜色:imagecolorallocate();
    4). 在画布上书写文字:imagestring();
    5). 以 JPEG 格式将图像输出到浏览器或文件:【根据图片格式不同,函数还可以是imagepng()、imagegif()等】 imagejpeg();
    6). 清除图像资源:imagedestroy();

  40. GD2库生成缩略图的步骤是什么?
    1). 读取希望生成缩略图的源图像,创建图像对象:【根据图片格式不同,函数也相应不同】
    srcW,dstW、dst_image = imagecreatetruecolor(dstH);
    4). 拷贝图像并调整大小: imagecopyresized();
    5). 将图像输出:【根据图片格式不同,函数也相应不同】 imagejpeg();
    6). 清除图像资源(将源图像资源和目标图像资源都清除) imagedestroy();

  41. GD2库给图片增加水印如何做?

  42. 添加简单的文本水印:
    利用imagestring()函数就可以在图片上写文本水印。

  43. 增加一个图形水印:
    1). 读取希望增加水印的源图片,创建图像对象:【根据图片格式不同,函数也相应不同】
    watermark = imagecreatefrompng();
    3). 拷贝并合并图像:
    imagecopymerge();
    4). 将图像输出:【根据图片格式不同,函数也相应不同】
    imagejpeg();
    5). 清除图像资源(将源图像资源和水印图像资源都清除)
    输出控制函数:ob(output buffer) ob_flush
    加密函数 md5
    数学类函数:abs绝对值,rand随机数,ceil取整,floor,mt_rand生成更好的随机数
    转换函数:explode 使用一个字符串分割另一个字符串,implode
    时间函数:date(),strtotime (将字符串转换为时间戳)
    处理地址栏: url_encode url_decode
    10.乱码问题
    ASCII(American Standard Code for Information Interchange)81年产生
    ANSI 美国国家标准学会( American National Standards Institute)
    utf-8(-8代表一次传输8个字符)可变字节编码(中文3个字节)(utf:Unicode转换格式(UCS Transformation Format)
    utf-16(-16代表一次传输16个字符)
    GBK. 国家标准扩展码(Guo-Biao Kuozhan)90年产生(双字节编码)
    GB2312 因为国际排行2312位(81年产生)
    BIG5
    unicode (国际编码)可变字节编码
    Latin_1
    utf-8+ bom
    ISO:国际标准化组织(International Standardization Organization)
    选择器:
    1.基本选择器:
    ①、('.result')
    ③、元素选择器('#myform < input')
    3.后代选择器:('#myform < span < input')
    urlencode(str)替换所有非字母数字的字符,变为%后面跟两位16进制数,空格变为+号
    urldecode(str)对已%##编码的URL进行解析还原
    parse_url(str)解析完整的url转变为为数组
    parse_str(str,out)解析请求字符串转变为数组
    htmlspecialchars()转换html代码为实体代码
    printf/sprintf %b %d %c %x %s %f %X
    – b 整数转成二进位。
    – c 整数转成对应的 ASCII 字符。
    – d 整数转成十进位。
    – f 单倍精确度数字转成浮点数。
    – o 整数转成八进位。
    – s 转成字符串。
    – x 整数转成小写十六进位。
    – X 整数转成大写十六进位。
    1.数组和栈的操作
    array_push(目标数组,字符串)将字符串压入数组的最后
    array_pop(目标数组)将数组最后的元素弹出并返回
    2.数组和队列的操作
    array_unshift(目标数组,字符串)将字符串放到数组的开始位置
    array_shift(目标数组)删除数组的第一个元素并返回
    date(format,[timestamp])//格式化时间信息,并返回
    time()//返回当前时间戳信息
    mktime(hour,minute,second,month,day,year)
    mktime(小时,分钟,秒,月,天,年)//取得一个日期的 Unix 时间戳
    max()//取得最大值
    -echo max(1, 3, 5, 6, 7); // 7
    -echo max(array(2, 4, 5)); // 5
    -echo max(0, '1hello'); // 1hello
    -echo max('hello', 0); // hello
    -echo max(-1, 'hello'); // hello
    -echo max(array(2, 4, 8), array(2, 5, 7)); // array(2, 5, 7)
    -echo max('string', array(2, 5, 7), 42); // array(2, 5, 7)数组和非数组比较数组总认为最大
    mt_rand(65,94)//获得随机数
    round()//四舍五入取整
    flush()//输出准备区内容
    urlencode('张三')//返回字符串中,除了-_.之外的所有非字母数字部分为%后接两位
    16进制数,空格转化为+
    urldecode()//对已经编码的部分反编码
    chr(mt_rand(65,94))随机获得字母
    ord(chr(mt_rand(65,94)))将字母转化为数字
    第七单元【php连接mysql】
    *mysql_connect(主机,用户名,密码) 打开一个到 MySQL 服务器的连接
    *mysql_select_db(数据库,连接数据库资源) 选择 MySQL 数据库
    *mysql_query("set names utf8");设定字符集
    *mysql_close() 关闭 MySQL 链接
    *mysql_query(语句) 发送并执行一条sql语句
    mysql_fetch_row(结果资源)从结果集中取得一行结果(索引数组)
    mysql_fetch_assoc(结果资源)从结果集中取得一行结果(关联数组)
    *mysql_fetch_array(结果资源)从结果集中取得一行结果(索引/关联数组)
    mysql_fetch_object(结果资源)从结果集中取得一行结果(对象数组)

mysql_errno()返回错误号码
*mysql_error()返回错误信息
*mysql_num_rows(结果资源)用于计算查询结果中所得行的数目
*mysql_affected_rows()获得受影响的结果数目
*mysql_insert_id()传回最后一次使用 INSERT 指令产生的自动增长 ID 值

mysql_result(结果集,索引行,字段)指定获取结果
mysql_free_result(结果资源)释放结果集
mysql_num_fields(结果资源)用于计算查询结果中所得列的数目
mysql_fetch_field(结果资源)从结果集中取得列的结果,以对象形式返回
mysql_pconnect()永久连接数据库
2、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分)
答:mysql_fetch_row是从结果集取出1行数组,作为枚举 mysql_fetch_array是从结果集取出一行数组作为关联数组,或数字数组,两者兼得
26.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.答:allow_call_time_pass_reference
27..在PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。
答:结束标识符所在的行不能包含任何其它字符除";"
28.用PHP打印出前一天的时间格式是2006-5-10 22:21:21
答:echo date('Y-m-d H:i:s', strtotime('-1 day'));
29请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进行类比说明
ereg preg_match
ereg_replace preg_replace
30请说明在php.ini中safe_mode开启之后对于PHP系统函数的影响
答案:system,passthru,exec,shell_exec,popen,phpinfo
等等大部分的文件操作函数。
62、实现中文字串截取无乱码的方法。(3分)**************** Mb_substr 答:function GBsubstr(start, string)>str=null; start+i=i0xa0){ string,i++; }else{ string,str.'...'; }else{ return string; } } 71、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分) 答:heredoc的语法是用str = << 79、JS表单弹出对话框函数是?获得输入焦点函数是? (2分) 答:弹出对话框: alert(),prompt(),confirm() 获得输入焦点 focus() 80、JS的转向函数是?怎么引入一个外部JS文件?(2分) 答:window.location.href,
写一个函数验证电子邮件的格式是否正确。** if(isset(_POST['action']==’submitted’){ _POST['email']; if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[0-9a-zA-Z-]+){1,3}email)){ echo“电子邮件检测失败”; }else{ echo“电子邮件检测成功”; } }
104.如果你想要自动加载类,下面哪种函数声明是正确的C

A) function autoload($class_name)

B) function __autoload(file)

C) function __autoload($class_name)

D) function _autoload($class_name)

E) function autoload(file)
112. 答案:-1。 考查:优先级。 因为-的优先级比%求余的优先级低, 也就是-(10%3)。 113. print (int)pow(2,32); 答案:0 114.//file1.php //file2.php 答案:1. 考查:返回值。 因include()也是一个函数,有返回值。 在成功时返回1,失败时返回错误信息。 如果被包含的文件有return,则inculde() 成功时返回该文件的返回值。 115. count = 5; function get_count() { static count++; } ++count,所以只在第一次 调用get_count的时候对count++ 和return ++arr= array(0 =>1,'aa' =>2,3,4); foreach(key => key == 'aa' ? 5 : key和aa的比 较实际就是0和aa的比较,一个是int一个 是string,这个时候会转换类型,将字符 串转换为数字再与数字比较。所以0=='aa' 就是0==0,所以为true,也就是输出5。 虽然PHP是若类型语言,但是人家也有类 型的好吗。 117. 答案:2. 考查:count的用法。 因count()的官方解释“If the parameter is not an array or not an object with implemented Countable interface, 1 will be returned.”. 意思是说,如果不是数组或者对象的其他 类型,返回1.那么这个值应该就是1+0+1 了(boolen人家也是一个类型,虽然是 讨厌的false)。NULL的意思是没有值, 难道在计数函数中还能有1? 118. 答案:330。
考查:++和&。
因foreach结束后的数组应该是array(3,3,7);最后给第三个元素赋值为0,所以就是330了。其中注意的是&,如果有&则是对原变量操作,如果没有,则是先生成一个新变量,然后给这个变量复制,最后操作的是这个新变量。

  1. 10); ?> 答案:7。 考查:浮点数的概念。 因0.1+0.7=0.8 0.810=8 所以转换 成整数后还是8?错!因为0.1+0.7=0.8是 浮点数,0.8*10在数学计算中是正整数8, 可是在计算机中它仍然是浮点数8,什么叫 浮点数8?每一个看起来像整数的浮点数, 其实都不是整数,比如这个8,它其实只是 7.9999循环,无限接近于8,转换成整数会 舍弃小数部分,就是7喽。 120. 答案:B。 考查:优先级。 因“."的优先级高于三元运算符"?:"。所以程 序其实报错了。会说">arr的索引2不存在。 121. A、6 8 B、6 6 C、2 6 D、1 6 E、4 6 答案:D。 考查:优先级,基础概念,++。 因“="的优先级低于“||”,所以先逻辑判断再赋值。 也就是(b = 7))。所以,最后 其实给a赋值了,x = 2; echo x == 1 ? '你' : '它'; ?> 输出的结果是() A、我 B、你 C、它 D、syntax error 答案:B。 考查:优先级。
    167.双引号和单引号的区别
    答:双引号解释变量,单引号不解释变量
    双引号里插入单引号,其中单引号里如果有变量的话,变量解释
    双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误 双引号解释转义字符,单引号不解释转义字符,但是解释'\和\
    能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)
    PHP中处理json格式的函数为json_decode( string assoc ] ) ,接受一个 JSON格式的字符串并且把它转换为PHP变量,参数json待解码的json string格式的字符串。assoc当该参数为TRUE时,将返回array而非object;
    Json_encode:将PHP变量转换成json格式

你可能感兴趣的:(面试题)