php资深工程师必备知识

面试php资深工程师相信你已经在这个领域深入耕耘5年以上,有丰富的实践经验和知识深度广度。

作为一个phper,你一定对php和Mysql熟悉的不能再熟悉了,那么必考的知识点有:
php的面向对象的知识、迭代器、协程、流
mysql的引擎区别、索引相关用法、升级mysql实践、安全相关、锁

一般来说你至少还应该熟悉memcached、redis的一种
memcached的cas一致性分布式算法应该有所了解
redis的存储类型、用法、场景也应该门清,要是能把redis的二进制数据存储getbit、setbit搞明白可以加分,redis的备份机制有哪些?有没有看过源代码?

nginx或Apache的相关知识

php-fpm怎么管理php进程的?

如何优化性能?如何debug?这些开放命题就是面试官结合自己的水平给你打分了,你要是能把他忽悠住那你的水平一定比他高

就算你没了解也得知道php APC缓存、opcode cache吧,怎么实现的?

队列是干什么的?实际应用中什么时候用?
用过什么队列?kafka、NSQ、RabbitMQ还有啥?

然后再看看知识的广度

其他的数据库有没有了解运用过?MongoDB有啥特点?为啥不该用MongoDB?ElasticSearch呢?

linux相关业务场景的命令使用

P3P之殇

P3P:Platform for Privacy Preferences (P3P) (https://www.w3.org/P3P/)
P3P 计划是由服务端告知浏览器一系列多选项问题的答案组成的策略。

P3P规范也包含有用于请求和传输P3P策略的协议.P3P协议所基于的HTTP协议与 Web 浏览器用来与 Web服务器进行通信的 HTTP 协议相同。
不论在何时设置cookie都可以用特定的HTTP报头来传送一个可选的 P3P 简洁策略。

引自:http://www.cnblogs.com/_franky/archive/2011/03/16/1985954.html

大部分查询P3P资料的朋友都是在解决跨域ajax请求和跨域读写cookie两个事的时候偶然知道了这个名词,所以我就不多说了,直接上结论,其他的大家可以参考官方网站以及其他资料。

for IE developers
一些企业应用都是IE only,用P3P解决跨域问题可行,前提是浏览器仅限于IE7~10,做法就是在页面返回的http header中增加一行
P3P:CP=
因为IE对P3P简洁策略的支持,属于搞笑级别的.根本不看内容。(PS:再度引用上文资料)

FOR OTHERS
别看P3P了,兼容性完全不行,项目理念也有安全风险,也未作为正式标准进入http协议内容,甚至我的《松鼠·HTTP权威指南》里一句话都没提过。

对于同网站不同二级域名下解决跨域ajax请求和跨域读写cookie,想要兼容现代浏览器、移动浏览器的朋友,下面是我们整理的一套可行方案
1.设置cookie的domain为一级域名,如.ffan.com,*.ffan.com,ffan.com,此时,浏览器中cookie可以在任一二级三级域名的页面、图片、接口地址中获取到
2.使用jsonp代替json,json仅在同域名,相对路径下可以请求,否则有跨域问题,为此除了jsonp外还可以考虑在json输出前设定response http header 中Access-Control-Allow-Origin: *,不过要注意的是不能设置多次Access-Control-Allow-Origin,否则浏览器仍然不识别。
jsonp的方案所有参数均通过get方式明文传输,Access-Control-Allow-Origin方案需要小心的设置header,但支持get、post两种,可以按需选择。

“image/png” 和 “image/x-png”有哪些区别?

referer: http://stackoverflow.com/questions/2086374/what-is-the-difference-between-image-png-and-image-x-png
前缀 x- 是非标准的 MIME 类型 (例如:未在 IANA注册). 所以可以认为 image/x-png 是 PNG 类型未被标准化之前使用的

6.3. New Content-Transfer-Encodings

Implementors may, if necessary, define private Content-Transfer-Encoding values, but must use an x-token, which is a name prefixed by “X-”, to indicate its non-standard status, e. g., “Content-Transfer-Encoding: x-my-new-encoding”. Additional standardized Content-Transfer-Encoding values must be specified by a standards-track RFC. The requirements such specifications must meet are given in RFC 2048. As such, all content-transfer-encoding namespace except that beginning with “X-” is explicitly reserved to the IETF for future use.

—RFC 2045 — Multipurpose Internet Mail Extensions, Section 6.3
This is also documented in the PNG specification. See FalseVinylShrub’s answer.

根据W3C关于PNG的标准 http://www.w3.org/TR/PNG/#A-Media-type

“image/png” 是PNG格式网络媒体类型的 MIME 类型 [RFC-2045], [RFC-2048].同时也建议支持识别 MIME 类型 “image/x-png”.
所以, 如果你打算上传或是提供一个 PNG 图片, 该用’image/png’. 另外, 处理上传后文件等其他情况应该两种 MIME 类型都支持.

由于IE前些年一直在用”image/x-png”上传,所以造成了一些开发上的困扰。

一行命令解决composer下载问题

一行命令解决composer下载问题: composer config -g repositories.packagist composer https://packagist.phpcomposer.com

===
2016-3-21 更新说明(http://pkg.phpcomposer.com/)
本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 https 协议!请各位同学 按照下面所示的两个方法将 http://packagist.phpcomposer.com 修改为 https://packagist.phpcomposer.com

优化lumen加载速度

通过xdebug+QCachegrind分析lumen一个项目里的某一接口

分析每一个时间较长或者调用次数较多的函数
先看了下route这块用到的是nikic/fast-route 其中按照官方文档介绍,动态路由比静态路由慢,所以项目路由设计时我们添加的都是静态路由,而项目自带一个欢迎页面的动态路由。

优化方案,干掉动态路由,静态路由函数优化:找到
vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
的addStaticRoute方法
其中为了验证添加的路由是否有效,每一条记录都做了循环校验,这里其实可以在开发环境中启用,线上干掉来提速。
注释代码
/*
if (isset($this->methodToRegexToRoutesMap[$httpMethod])) {

foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) {
if ($route->matches($routeStr)) {
throw new BadRouteException(sprintf(
‘Static route “%s” is shadowed by previously defined variable route “%s” for method “%s”‘,
$routeStr, $route->regex, $httpMethod
));
}
}
}

*/

整个请求最重的就是mysql数据库操作了,其中prepare是pdo中做安全验证的必要组件,参考php手册

http://www.php.net/manual/de/pdo.prepare.php

http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in-single-query
有说php5.6中array_push 比array_merge快很多

Incompatible implementation of send() in Client / ClientInterface (phpunit)?

Incompatible implementation of send() in Client / ClientInterface (phpunit)?
开发环境 lumen
在phpunit执行测试时报错

PHP Fatal error: Declaration of GuzzleHttp\Client::send() must be compatible with GuzzleHttp\ClientInterface::send(GuzzleHttp\Message\RequestInterface $request) in /Users/michael/Code/contrib/guzzle/src/Client.php on line 26

https://github.com/guzzle/guzzle/issues/1214

找到报错的解决帖

发现自己的项目版本挺新的

于是在autoload加上加载文件的文件名输出

发现加载了global 文件
框架安装的时候是全局安装的
composer update却只更新了本项目
找到global的composer。json文件,把phpunit之外的项目都删掉,global update 解决问题

Console Wars – PHP CLI Libraries 命令行战争 - PHP的终端类库

Console Wars – PHP CLI Libraries

三大PHP终端类库

每个都zhendui不同用户类型用户喜好提供了不同的方法

  • Symfony console 测试稳定、鲁棒性好、文档丰富、能解决大部分问题 
  • Hoa console 更专业,适合做控制窗口、鼠标、指针等
  • Webmozart console 是最新的库,马上要出稳定版本了,适合那些很快变大的新项目

私有Composer代理服务器 Toran Proxy 安装使用教程(1)

这几年新的php包管理工具Composer火起来了,但是无奈被🔫。。。。

还好我们可以把文件同步到自己的服务器缓存起来,这样xuy组件依赖时就不用再去考虑这个问题了。

安装完toran proxy 安装jiem有个google的网址会卡住,直接暂停页面就出来了,hul这个问题

我们自己用,☑️This instance is for personal use

packagist.org是一个php组件包查询下载的站点,我们选上

缓存选项

考虑到硬盘小,还是lazy模式吧

git settings 等需要时再配置

安装

windows安装vagrant 以及 laravel homestead[2]

安装 Homestead
由于windows下和linux命令不尽相同
实际上要做的是在你的用户目录下新建一个.homestead目录
然后把Homestead/src/stubs目录的文件全拷贝过去即可
配置文件Homestrad.yaml参考如下

ip: “192.168.10.10”
memory: 2048
cpus: 1
provider: virtualbox

authorize: C:\Users\zy\Homestead\test.key.pub

keys:
– C:\Users\zy\Homestead\test.key

folders:
– map: C:\Users\zy\Homestead\test
to: /home/vagrant/Code

sites:
– map: homestead.app
to: /home/vagrant/Code/Laravel/public

databases:
– homestead

怎么删除CSS文件开始的  符号

mb_internal_encoding(‘UTF-8’);

通过php – How do I remove  from the beginning of a file? – Stack Overflow.

How do I remove  from the beginning of a file?

在做文件合并的时候发现css文件合并后总是不对,于是首先把换行压缩为空格的代码屏蔽,发现仍有部分样式不对,用w3c css验证工具发现某行样式定义前有乱码,表现为#topNav {}

http://jigsaw.w3.org/css-validator/validator

通过查询发现是utf8文件的bom头在作怪,把源文件的bom头去掉就好了