Crontab 脚本加锁执行(flock命令)

使用 Crontab 执行脚本的时候,尤其是脚本间隔时间段而程序运行时间长的时候,很容易出现上一个时间段的脚本还没运行完,下一个时间段的脚本已经启动开始同步执行了这种情况。而这种情况一方面容易导致数据异常,另一方面同时执行的脚本过多也有可能导致服务器内存占用过多等各种情况。所以,Crontab 执行脚本的时候,有必要加锁执行。而给一个shell脚本加锁,需要使用的就是 flock 命令。

PHP获取客户端真实IP及其原理

PHP 全局变量 $_SERVER 中有好几个字段是与IP有关的:

  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
  • REMOTE_ADDR

这些字段看起来很高深,实际上在处理获取客户端IP的问题上,大多数可以忽略不考虑。

悲观锁和乐观锁

概念不多说,直接上例子:

背景:某商品库存量为1,现在又两个人几乎同时下单。

锁这种东西,就是在这种场景下,避免两个人都下单成功,而实际上后台只有一份资源的情况。

而乐观锁、悲观锁这两个概念,其实也只是两种思维模式,而非某种具体的功能一类的东西。以上场景下,乐观锁每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。

Composer install 和 update 命令的使用和区别

最近面试被问到,为什么给 Designup 选择的框架是 Laravel,当时总结的几个原因,一个是开发效率,真的高,另外一个,就是这个我接触到的第一个使用 Composer 进行包管理的框架,非常的方便。紧接着就被问了一些关于Composer原理的问题,没答上来,想来也是,用了一年多的这么方便的工具,竟然都没有仔细探究过它这么方便的原因和原理,罪过罪过。。。。

MySQL 基本规范和慢查询优化

MySQL 应该是目前PHP语言配合最多的关系型数据库工具了。然而它同时也是我学过的、用过的最自我纠结、最鸡肋的一门技术了。

首先,MySQL 作为目前最流行的关系型数据库工具之一,它的功能无疑是强大的。我们在学校学数据库这门课程的时候,介绍过的关系型数据库的比如外键、连表查询、子查询、负向查询等功能,以及它内置的 sum()/max()/min() 等非常方便的数学运算方法、隐式类型转换,以及模糊查询 like '%xxx%' 等,以及它支持的主键形式(单主键、数字主键、字符串主键、联合主键)等等。这些功能MySQL都是支持的。

然而,在实际项目应用中,尤其是高并发、大数据量的项目中,你会发现项目访问速度的最大瓶颈,就是数据库。所以在多数的线上项目中,以上提到的数据库高级功能,多半不能用!你用一个 count(*) 几乎都已经是极限了。。。

编译安装的 PHP7.0 升级 7.2

如果是在一台新机器上安装 PHP 7.2 , 请参考文章在 Ubuntu 14.04 上搭建 LNMP 环境,只需将其中 PHP 编译安装的部分按照本文中的部分替换PHP版本即可。

此次因为是升级,所以 PHP 编译安装所需的扩展应用等早已安装,只需要重新编译安装 PHP7.2 及相关 PHP 扩展,再关停原来的 php-fpm 并开启 7.2 版本的 php-fpm,然后将 Nginx 的代理解析监听到 PHP 7.2 的 php-fpm 上即可。

PHP 敏感词过滤

敏感词过滤主要包括以下部分:
(1)词库的维护
(2)实时生成的词库词典文件
(3)根据词典文件对比要校验的文字

其中第一步,词库的维护,就是简单的CRUD操作,不再赘述。而后两步比较关键,而且处理不好也可能是一个性能门槛。

这里推荐使用 php-ext-trie-filter 这个第三方扩展来实现,用于检查一段文本中是否出现敏感词,基于 Double-Array Trie 树实现。

使用 Workerman-chat 配合 Laravel 构建自己的 IM 服务

Workerman 是一款纯 PHP 开发的开源高性能的 PHP socket 服务器框架。被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持 Websocket、HTTP 等协议,支持自定义协议。拥有异步 Mysql、异步 Redis、异步 Http、异步消息队列等众多高性能组件。

workerman-chat 是一个以 workerman 作为服务器容器,使用 PHP 开发的基于 Websocket 协议的一个可分布式部署的聊天室框架。

workerman-chat 采用 gateway workers 进程模型。gateway只负责网络IO,全异步非阻塞,每个 gateway 进程都可以同时接受上万客户端连接。 workers 采用的是PHP开发者所熟悉的同步模型,并提供了开发者基本的接口 onConnect、onMessage、onClose、sendToClient、sendToAll 等方法。 开发者只要在 onConnect、onMessage、onClose三个方法中添加上自己的业务逻辑即可,开发维护非常简单。

由于采用的是 gateway workers 进程模型,gateway 和 workers 之间是无状态的,gateway 和 workers 可以分别部署在不同的物理机上,所以扩容和升级都非常方便。 workerman-chat 也非常适合游戏后台开发。

关于阿里云服务器(ECS)安全,一些简单而又必须做的事

原本觉得,我的服务器上就一个小博客,都没什么人访问,谁会来黑我呢?所以一直对自己服务器的安全这块考虑的很少,直到踩坑吃闷亏之后,才追悔莫及啊!其实有不少商业黑客,批量扫描网络上的IP端口,利用一些已知常见的漏洞来攻入你的服务器,有的删除数据之后向你勒索(比如比特币),有的用你的服务器做挖矿机或者用你的服务器在作为肉鸡去攻击其他人的服务器。第一种情况一般比较发现,后面两种情况你可能被黑了很久都不自知。。。

而有很多简单的举措,就能从一定程度上防止这些结果的发生,毕竟这些商业黑客也注重时间和效率,一般只会利用常见的漏洞来入侵别人的机器。【当然如果你得罪人,导致有人刻意要黑你的机器,那就另当别论了。】

升级 HTTPS 和 HTTP2

Designup 最初上线是用的 HTTP 协议,处于安全考虑升级为 HTTPS,后又出于访问速度的优化升级为 HTTP2

关于三者以及 SPDY 的区别和优劣,可以参考文章 HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事, 应该已经介绍的比较完善了,此处不再赘述。

关于 HTTP2,先推荐一款 Chrome 插件 HTTP/2 and SPDY indicator,这个插件的闪电图标,在访问 HTTP2 网站的时候会变成蓝色,所以它也可以帮你更快捷的判断你的 HTTP2 是否配置成功。