去评论
dz插件网

常用算法、问答、设计模式

admin
2020/07/07 09:01:46
1.Cookie 禁用了,Session 还能用吗?
对应的服务器 Session,Session ID 是通过 Cookie 来传递的,禁用 Cookie 相当于失去了 Session ID,就得不到 Session
php.ini 文件中的”session.use_trans_sid = 1“,或者编译时打开打开了”--enable-trans-sid 选项”
a.$sn=session_id();
session_id ($_GET-->url 传过来的参数)
b.fopen w+ 写入 session_id ()
fread 取出 sesson_id
2.GET、POST 传输最大容量是多少?
GET 发送 http 协议通过 url 方式传递,受浏览器或者服务器的设置限制
POST 实体数据,表单传送,通过 php.conf 的 post_max_size 可以设置传输大小
3. 抓取远程图片到本地,会用什么函数?
  1. <p>file_get_contents() </p><p>file_put_contents()</p>
4.CGI 是什么?什么是 FastCGI?php-fpm、FastCGI、Nginx 之间是什么关系?
server 收到一个 php 的请求时,会启动一个程序去处理当前的请求,而这个程序就是 CGI
通用网关接口 (返回标准 html 数据的服务)
FastCGI 是一个协议,是应用程序和 WEB 服务器连接的桥梁。Nginx 并不能直接与 PHP-FPM 通信,而是将请求通过 FastCGI 交给 PHP-FPM 处理。
php-fpm 是 fastcgi 进程的管理器,用来管理 fastcgi 进程的。
5. 函数内部 static 和 global 关键字的作用?
stattic (静态局部变量) 作用于函数内,不能用在函数外
global (静态全局变量) 可以作用任何地方
6.memcache 和 Redis 的区别及优缺点?
memcache 把数据存到内存中,读取速度快。
Redis 支持的数据类型更多,数据也可以存到硬盘,断电不会挂掉,数据持久化,memcache 一旦断电数据就没了。
都可以一主多从。
7.Include require include_once require_once 的区别?
处理失败方式不同:
require 失败时会产生一个致命级别错误,并停止程序运行。
include 失败时只产生一个警告级别错误,程序继续运行。

include_once/require_once 和 include/require 处理错误方式一样,
唯一区别在于当所包含的文件代码已经存在时候,不在包含。

8.php 魔幻(术)方法及预定义变量;
construct () 实例化类时自动调用。
  1. <p>destruct () 类对象使用结束时自动调用。</p><p>set () 在给未定义的属性赋值的时候调用。</p><p>get () 调用未定义的属性时候调用。</p><p>isset () 使用 isset () 或 empty () 函数时候会调用。</p><p>unset () 使用 unset () 时候会调用。</p><p>sleep () 使用 serialize 序列化时候调用。</p><p>wakeup () 使用 unserialize 反序列化的时候调用。</p><p>call () 调用一个不存在的方法的时候调用。</p><p>callStatic () 调用一个不存在的静态方法是调用。</p><p>toString () 把对象转换成字符串的时候会调用。比如 echo。</p><p>invoke () 当尝试把对象当方法调用时调用。</p><p>set_state () 当使用 var_export () 函数时候调用。接受一个数组参数。</p><p>clone () 当使用 clone 复制一个对象时候调用。</p>

预定义变量(超级全局变量)
  1. <p>$GLOBALS</p><p>$_SERVER</p><p>$_GET</p><p>$_POST</p><p>$_COOKIE</p><p>$_SESSION</p><p>$_REQUEST</p><p>$_ENV</p>

魔术变量
  1. <p>LINE</p><p>FILE</p><p>DIR</p><p>CLASS</p><p>FUNCTION</p><p>METHOD</p><p>NAMESPACE</p>

9. 一些编译 php 时的 configure 参数
  1. <p>–prefix=/usr/local/php php 安装目录</p><p>–with-config-file-path=/usr/local/php/etc 指定 php.ini 位置</p><p>–with-mysql=/usr/local/mysql mysql 安装目录,对 mysql 的支持</p><p>–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli 文件目录,优化支持</p><p>–enable-safe-mode 打开安全模式</p><p>–enable-ftp 打开 ftp 的支持</p><p>–enable-zip 打开对 zip 的支持</p><p>–with-bz2 打开对 bz2 文件的支持</p><p>–with-jpeg-dir 打开对 jpeg 图片的支持</p><p>–with-png-dir 打开对 png 图片的支持</p><p>–with-freetype-dir 打开对 freetype 字体库的支持</p><p>–without-iconv 关闭 iconv 函数,种字符集间的转换</p><p>–with-libxml-dir 打开 libxml2 库的支持</p><p>–with-xmlrpc 打开 xml-rpc 的 c 语言</p><p>–with-zlib-dir 打开 zlib 库的支持</p><p>–with-gd 打开 gd 库的支持</p>
更多可以使用 ./configure help 查看

10. 写代码来解决多进程 / 线程同时读写一个文件的问题。
PHP 是不支持多线程的,可以使用 php 的 flock 加锁函数实现。
  1. <p>$fp = fopen("/tmp/lock.txt", "w+");</p><p>if (flock ($fp, LOCK_EX)) { // 进行排它型锁定</p><p>fwrite($fp, "Write something here\n");</p><p>flock ($fp, LOCK_UN); // 释放锁定</p><p>} else {</p><p>echo "Couldn't lock the file !";</p><p>}</p><p>fclose($fp);</p>

11.Mysql 的存储引擎,myisam 和 innodb 的区别。
a. MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持.
b. MyISAM 类型的表强调的是性能,其执行数度比 InnoDB 类型更快.
c. InnoDB 不支持 FULLTEXT 类型的索引.
d. InnoDB 中不保存表的具体行数,也就是说,
执行 select count (*) from table 时,InnoDB 要扫描一遍整个表来计算有多少行,
但是 MyISAM 只要简单的读出保存好的行数即可.
  1. <p></p><p>e. 对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引。</p><p>f. DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除。</p><p>g. LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,</p><p>但是对于使用的额外的 InnoDB 特性 (例如外键) 的表不适用.</p><p>h. MyISAM 支持表锁,InnoDB 支持行锁。</p>

12.MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
a. 设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql 库主从读写分离。
d. 找规律分表,减少单表中的数据量提高查询速度。
e。添加缓存机制,比如 memcached,apc 等。
f. 不经常改动的页面,生成静态页面。
g. 书写高效率的 SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

13. 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
a. 确认服务器是否能支撑当前访问量。
b. 优化数据库访问。
c. 禁止外部访问链接(盗链), 比如图片盗链。
d. 控制文件下载。
e. 使用不同主机分流。
f. 使用浏览统计软件,了解访问量,有针对性的进行优化。

14. 是否用过模板引擎?如果有您用的模板引擎的名字是?
  1. Smarty

15.PHP 中 this 和 self 的区别
  1. <p>this:对象</p><p>self:类</p>

16. 如何防止 SQL 注入,XSS 攻击和 CSRF 攻击
SQL 注入:mysqli_real_escape_string () 转义关键字符;
XSS 攻击:alert 把一些 cookie 信息打印出来;过滤掉 <> 等关键字符串
CSRF 攻击:跨站攻击。防止:token,验证码

PHP 设计模式
工厂模式:
建立一个工厂(一个函数或一个类方法)来制造新的对象。
工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
单例模式:
某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。
单元素模式可以满足此要求。
PHP 中的单例模式(singleton pattern):指的是在 PHP 的应用程序的范围内只对指定的类创建一个实例。

在 PHP 中使用单例模式的类通常拥有一个私有构造函数和一个私有克隆函数,以防 止用户通过创建对象或者克隆对其进行实例化。还有一个静态私有成员变量 $instance 与静态方法 getInstance。getInstance 负责对其本身实例化,然后将这个对象存储在 $instance 静态成员变量中,以确保只有一个实例被创建。
观察者模式
命令链模式
策略模式

单例模式:
  1. <p>class SingleInstance</p><p>{</p><p>        private function _construct(){</p><p>        }</p><p>       private static $instance;</p><p>       private function _clone(){</p><p>       }</p><p>       public static function getInstance(){</p><p>self::$instance instanceof SingleInstance){</p><p>               self::$instance=new SingleInstance();</p><p>           }</p><p>           return self ::$instance;</p><p>        }</p><p> }</p>
短连接:例如普通的 web 请求,在三次握手之后建立连接,发送数据包并得到服务器返回的结果之后,通过客户端和服务端的四次握手进行关闭断开。

长连接:区别于短连接,由于三次握手链接及四次握手断开,在请求频繁的情况下,链接请求和断开请求的开销较大,影响效率。采用长连接方式,执行三次握手链接后,不断开链接,保持客户端和服务端通信,直到服务器超时自动断开链接,或者客户端主动断开链接。

适用场景:
短连接:适用于网页浏览等数据刷新频度较低的场景。
长连接:适用于客户端和服务端通信频繁的场景,例如聊天室,实时游戏等。