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

PHP高级面试题:
https://mp.weixin.qq.com/s/ilEVTX6M7BtWapASQMyDnw

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nddhqyL6-1569743250385)(https://cdn.learnku.com/uploads/images/201906/11/42342/QwpIJxckxR.png!large)]
1.Cookie禁用了,Session还能用吗?
对应的服务器Session,Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,就得不到Session
php.ini文件中的”session.use_trans_sid = 1“,或者编译时打开打开了”–enable-trans-sid选项”
a. s n = s e s s i o n i d ( ) ; s e s s i o n i d ( sn=session_id(); session_id( sn=sessionid();sessionid(_GET–>url传过来的参数)
b.fopen w+ 写入session_id()
fread 取出sesson_id
2.GET、POST传输最大容量是多少?
GET发送http协议通过url方式传递,受浏览器或者服务器的设置限制
POST实体数据,表单传送,通过php.conf的post_max_size可以设置传输大小
3.抓取远程图片到本地,会用什么函数?
file_get_contents() file_put_contents()
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() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

预定义变量(超级全局变量)
$GLOBALS
$_SERVER
$_GET
$_POST
$_COOKIE
$_SESSION
$_REQUEST
$_ENV

魔术变量
LINE
FILE
DIR
CLASS
FUNCTION
METHOD
NAMESPACE

9.一些编译php时的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文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持
更多可以使用 ./configure help 查看

10.写代码来解决多进程/线程同时读写一个文件的问题。
PHP是不支持多线程的,可以使用php的flock加锁函数实现。
f p = f o p e n ( " / t m p / l o c k . t x t " , " w + " ) ; i f ( f l o c k ( fp = fopen("/tmp/lock.txt", "w+"); if (flock( fp=fopen("/tmp/lock.txt","w+");if(flock(fp, LOCK_EX)) { // 进行排它型锁定
fwrite(KaTeX parse error: Undefined control sequence: \n at position 26: … something here\̲n̲"); flock(fp, LOCK_UN); // 释放锁定
} else {
echo “Couldn’t lock the file !”;
}
fclose($fp);

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

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.是否用过模板引擎? 如果有您用的模板引擎的名字是?
Smarty

15.PHP中this和self的区别
this:对象
self:类

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

  1. PHP 设计模式
    工厂模式:
    建立一个工厂(一个函数或一个类方法)来制造新的对象。
    工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

单例模式:
某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。
单元素模式可以满足此要求。
PHP 中的单例模式(singleton pattern):指的是在 PHP 的应用程序的范围内只对指定的类创建一个实例。

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

观察者模式
命令链模式
策略模式

单例模式:
class SingleInstance
{
        private function _construct(){
        }
       private static KaTeX parse error: Expected '}', got 'EOF' at end of input: …e(){ self::instance instanceof SingleInstance){
               self::KaTeX parse error: Expected 'EOF', got '}' at position 43: …();            }̲            ret…instance;
        }
 }

短连接:例如普通的web请求,在三次握手之后建立连接,发送数据包并得到服务器返回的结果之后,通过客户端和服务端的四次握手进行关闭断开。

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

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

PHP向第三方服务器发送post请求
function post($url, $post_data, $timeout=10)
{
c h = c u r l i n i t ( ) ; c u r l s e t o p t ( ch = curl_init(); curl_setopt( ch=curlinit();curlsetopt(ch, CURLOPT_URL, u r l ) ; c u r l s e t o p t ( url); curl_setopt( url);curlsetopt(ch, CURLOPT_POST, 1);
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ curl_setopt(ch, CURLOPT_POSTFIELDS, KaTeX parse error: Expected 'EOF', got '}' at position 15: post_data); }̲ curl_setopt(ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘POST’);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, t i m e o u t ) ; c u r l s e t o p t ( timeout); curl_setopt( timeout);curlsetopt(ch, CURLOPT_HEADER, false);
f i l e c o n t e n t s = c u r l e x e c ( file_contents = curl_exec( filecontents=curlexec(ch);
curl_close($ch);
return $file_contents;
}

php获取字节流接口数据
$body_str = @file_get_contents(‘php://input’);
b o d y = j s o n d e c o d e ( body = json_decode( body=jsondecode(body_str, true);
php发送字节流数据
function HttpPost($url, $data)
{
c h = c u r l i n i t ( ) ; c u r l s e t o p t ( ch = curl_init(); curl_setopt( ch=curlinit();curlsetopt(ch,CURLOPT_URL, u r l ) ; c u r l s e t o p t ( url); curl_setopt( url);curlsetopt(ch, CURLOPT_HEADER, 0);
curl_setopt( c h , C U R L O P T R E T U R N T R A N S F E R , 1 ) ; c u r l s e t o p t ( ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt( ch,CURLOPTRETURNTRANSFER,1);curlsetopt(ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
r e s = c u r l e x e c ( res = curl_exec( res=curlexec(ch);
curl_close($ch);

return $res;
}

获取access_token,并缓存
// 获取基本access_token,并且缓存(基本access_token每天只能调用2000次)
function get_access_token($APPID, $APPSECRET){
KaTeX parse error: Expected 'EOF', got '&' at position 76: …ient_credential&̲appid=".APPID."&secret=".$APPSECRET;
r e s u l t = g e t ( result = get( result=get(URL);
session(array(‘cache_name’=>‘access_token’,‘expire’=>7200));
$_SESSION[‘token_expire’] = time() + 7200;
$_SESSION[‘access_token’] = $result[‘access_token’];
$ACCESS_TOKEN = $result[‘access_token’];
return $ACCESS_TOKEN;
}

// 判断基本access_token是否还有效
function token($APPID, $APPSECRET){
if (time() < KaTeX parse error: Expected '}', got 'EOF' at end of input: … // if (!empty(_SESSION[‘access_token’])) {
$TOKEN = $_SESSION[‘access_token’];
}else{
T O K E N = g e t a c c e s s t o k e n ( TOKEN = get_access_token( TOKEN=getaccesstoken(APPID,KaTeX parse error: Expected 'EOF', got '}' at position 15: APPSECRET); }̲ // dump(TOKEN);
return $TOKEN;
}

//获取票据凭证
function get_ticket($ACCESS_TOKEN){
// 获取ticket
KaTeX parse error: Expected 'EOF', got '&' at position 69: …cket?type=jsapi&̲access_token=".ACCESS_TOKEN;
r e s = g e t ( res = get( res=get(url);
session(array(‘name’=>‘ticket’,‘expire’=>7200));
$_SESSION[‘ticket_expire’] = time() + 7200;
$_SESSION[‘ticket’] = $res[‘ticket’];
$TICKET = $_SESSION[‘ticket’];
return KaTeX parse error: Expected 'EOF', got '}' at position 9: TICKET; }̲ //判断票据是否有效 fun…ACCESS_TOKEN){
if (time() < KaTeX parse error: Expected '}', got 'EOF' at end of input: … // if (!empty(_SESSION[‘ticket’])) {
$TICKET = $_SESSION[‘ticket’];
}else{
T I C K E T = g e t t i c k e t ( TICKET = get_ticket( TICKET=getticket(ACCESS_TOKEN);
}
// dump($TICKET);
return $TICKET;
}

一、小程序支付方式选取:
1)微信支持-代销:无论小程序是否开通微信支付都可使用。

使用微信支付-代销,无需复杂申请即可使用,可以在第三方托管平台店铺余额查看货款并提现,第三方托管平台代收微信支付交易手续费,第三方托管平台提供交易担保。

2)微信支付-自有:需商家小程序已开通微信支付,且已完成微信支付激活、签约。

使用微信支付-自有,需要去微信商户平台查看货款并提现,微信直接收取手续费,第三方托管平台不提供交易担保。

二、第三方托管平台为商家提供两种方式生成您的店铺小程序。
申请微信支付-自有的商家请看

(1)您在微信公众平台注册好小程序账号后,一键授权第三方托管平台生成的小程序,需要您前往微信商户平台 开通微信支付,在微信商户平台进行日常的资金管理,例如货款提现、退款等。由微信直接收取手续费,第三方托管平台不提供交易担保。(查看教程

(2)您在第三方托管平台微商城店铺后台注册,提交信息生成的小程序,暂不支持使用微信支付-自有。目前仅可使用微信支付-代销一种支付方式。

三、
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2nSpRlg-1569743250386)(https://cdn.learnku.com/uploads/images/201906/20/42342/egxLil5Wpz.png!large)]

PHP相关知识
https://www.cnblogs.com/jackieron/p/6504765.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值