涨姿势 – 不一样的服务端长连接方案 – 客户端代理

仔细再看一次腾讯云的小程序解决方案,发现一个新大陆。

传统的 LAMP 架构,PHP-CGI  这种方式是很难处理长连接的。要么写死循环的方式来握住请求,要么使用 swoole 这种,通过 C 拓展来支持。

而 NodeJS 由于官方 DEMO 就是支持跑一个 HTTP 服务,所以处理这些长连接会方便一些(大家好懂一些,我觉得 PHP-CLI 方式也是一样的)。

信道服务

建立连接过程

  1. 小程序请求业务服务器
  2. 业务服务器和信道服务建立连接
  3. 业务服务器告诉小程序你可以和信道服务建立 ws 了
  4. 小程序和信道服务建立 ws
  5. 信道服务请求业务小程序的 ws 建立完成

连接成功后的通信方式

  1. 小程序请求信道服务,信道服务转发请求给业务
  2. 业务请求信道服务,信道服务推送到客户端

我最开始看的时候,没注意信道服务是一个云服务,琢磨着腾讯云的 SDK 难道有什么新的黑魔法来实现 PHP 的长连接。

https://github.com/tencentyun/wafer-php-server-sdk/blob/master/lib/Tunnel/TunnelService.php

看里面的代码,各种 onConnect\onRequest,看着就很像长连接的 API,但他基于 CI 是怎么实现的长连接了?看 composer.json 里面没有用什么黑魔法,搜索代码里面没没看到任何死循环。

客户端代理

为什么信道服务的 icon 是一朵云?

原来腾讯云把这个信道服务抽象成了一个 PaaS 的云服务,这根本就是一个客户端代理。而开源出来的 PHP-SDK,里面没有任何长连接的实现方案。

  • 业务服务器 -> 小程序:业务服务器只需要请求信道服务即可,信道服务接收到业务的请求后,会将 HTTP Body 部分,转成 WS 的消息推送给小程序。
  • 小程序 -> 业务服务器:则正常通过 WS 发送消息给信道服务,信道服务转成 HTTP 请求转发到业务服务器。

对于一些使用 PHP 开发的历史业务,大规模的长连接改造是非常困难,但部署一个长连接转发服务却容易很多(比如用 NodeJS 来写一个)。

腾讯云的这个思路可以帮助各种业务快速支持包括 SSE 和 WS 这两种长连接方案。并且由于业务服务器本身是 HTTP 方式,可以很容易给低版本 IE 做轮训兼容。

最后感谢腾讯云开源了他们的 wafer 方案。

Ubuntu12.04快速部署 Nginx + MySQL + PHP + Memcached + XCache + phpMyAdmin

纯属MarkDown,我个人不大喜欢这类文章,按部就班,没啥思考性。

安装Nginx

注意,我下面的操作都是在一台干净的系统上进行的

#装好后,配置文件都在/etc/nginx/目录下面,网站目录在/usr/share/nginx/www/下面

安装PHP

修改其中支持PHP的部分,更新为以下内容:

在网站目录下面新建一个php脚本,检测PHP环境是否搭建成功:

代码内容如下:

重新加载一次Nginx的配置文件,并修改网站目录权限

打开浏览器,输入IP/phpinfo.php,看看显示是否正常。

安装MySQL和phpMyAdmin

期间,会让你设置MySQL的用户名和密码,你照常设置即可。

期间,也会让你设置phpMyAdmin的帐号密码,检查phpMyAdmin是否正常工作的方法是登录用一下,浏览器输入ip/phpMyAdmin/index.php运行即可。

安装Memcached和XCache

浏览器输入ip/phpinfo.php检查Memcached和XCache是否安装成功。

安装SendMail

没注意之前我的WP一直发不出邮件,原来我没有安装邮件模块。

就这么简单,一句代码,安装完成后重启一下php-fpm就好

现在PHP的mail()函数就能正常使用了,我们可以给WP装上WordPress Database Backup自动备份数据并发送到我们的TB级别的邮箱中~~

结语:

自此,一台性能还算不错的PHP Server就部署好了。

为啥选Ubuntu 12.04?因为是LTS呗,其实没为啥,随便哪款Linux都可以,apt-get用得顺手。

为啥选Nginx?处理并发请求完胜Apache,不过我很喜欢Apache自带的benchmark,功能强大,在同局域网中发起测试不错。

为啥选PHP?我不会Java、不会Python…

为啥选MySQL?难道你不要数据库?

为啥选XCache?为啥选Memcached?因为Ubuntu自带有这两个的包,懒得编译。

前者的价值体现如下:

后者的价值体现如下:

PS:

之前在帷千的一个项目,用上了Redis,其实也可以改用Memcached(毕竟我只是做的INC这样的原子操作,不过放弃Redis的话,持久化存储的问题,就需要另外解决了),Ubuntu自带php5-memcached包,安装比phpredis要方便很多,虽然那个也不是很麻烦…

文中截图来自《Pro PHP Application Performance》一书,这书把PHP的生命周期讲得挺过瘾的,薄薄一本,值得一读。

使用开源phpmailer发送邮件

网上也有几篇教程,不过我是为了给自己的服务可以发送邮件给自己用,所以只是用phpmailer的base功能,不需要使用smtp。

先去phpmailer官网下载,然后把里面的class.phpmailer.php放到自己的class库中。

我自己再定义一个mail.function.php的函数,里面new一个phpmailer的对象。

好吧,之前我是自己用PHP原生mail()函数写的邮件功能,但因为一直没看懂该如何对邮件正文进行重编码,导致邮件正文在部分收件工具中总是存在各种乱码情况。

需要用到发邮件的时候,只需要postmail($body);即可,当然,记得把mail.function.php给include进去。

分层解耦,理想很美好,现实很残酷

自从实习以来,不是第一次有这种想法了。
今天弄一个简单的发邮件功能,使用PHP自带的mail()函数实现,基本就照着php.net上面的例子来写,结果…
情况好的,邮件被丢垃圾箱,情况差的,连垃圾箱里面都看不到邮件。
邮件标题和正文等,皆出现各种不同情况的文字乱码,现在标题的乱码通过base64来encode一下解决了,但是正文依旧没找到好方法,有的邮件客户端能正常显示中文,有的却不能。
来看看php.net的文档对mail()函数是怎么说的:

Note:

The following RFCs may be useful: » RFC 1896, » RFC 2045, » RFC 2046, » RFC 2047, » RFC 2048, » RFC 2049, and » RFC 2822.

为了发个邮件,我还得去翻阅RFC文档,要命啊。这些事情不是应该底层已经给我做好了吗,唉~
明天再解决不了,就真得去翻阅一下RFC文档了。
PS:吐槽一下新浪企业邮箱,怎么给域名设置了白名单,都还扔到垃圾箱,实在无语~~~~

在SAE上开发遇到的问题~

之前一直在纠结数据输入SQL时的字符串转义问题,今天算是有个比较好的方案了~

在正常的LAMP平台上面

添加一个escape_data()的函数,该函数已经会自动识别各种PHP配置环境~

在SAE平台下面,就更加简单,SAE已经为我们封装好了一个escape函数,直接使用即可 继续阅读“在SAE上开发遇到的问题~”

API学习手札-1

这学期的后半段,一直在断断续续的写一套系统~

嗯,不要误会,只是一个mini系统,主要功能是用户管理以及任务派送~

其中,用户管理之前做班级“书架”的时候已经做过,比较熟悉~

任务派送里面的所有任务信息,使用的第三方API~

对于API的处理,从来没弄过,这是第一次尝试~

 

好了,正题~

知识储备:

1、标准的文件函数file_get_contents()

2、JSON

3、数组

由于时间紧迫,JSON没有详细的去了解,但知道使用json_decode()函数,可以将数据转成数组~

值得注意的是,使用json_decode()函数的时候,后面要加上参数true,否则会提示错误~

eg:

<?php

$res = json_decode( file_get_contents( $url ) , true );//$url改为你那个API所使用的url

var_dump($res);

?>

这样,var_dump()函数会把$res的所有数组都打印出来~

非常方便吧,然后把需要的数据直接复制就好了~

 

由于我的应用里面,这些数据出来后,还需要按每条offer为记录写入数据库~

还有就是需要手动往数据库中更新记录~

这些都还没想到怎样弄~

囧~

 

PS:今天去图书馆,无意中看到某“动物大集合”中的PHP经典实例,借回来翻了翻,还不错,90+,是本不错的工具书

小项目里面的大内涵

最近一直在用PHP来做东西~

一个很简单的应用:用户系统~

知识储备:

1、PHP基础(语法规则)

2、PHP与MySQL连接函数

3、SQL语句

4、前端工程师所需的一些技能

5、系统安全问题

看上去好像很高深,其实也不是特别高深,一点一点的说吧~

 

PHP基础这部分,没什么说的

文件格式*.php,

<?php 把程序写在这里面,写法和CC++差不多 ;?>

 

PHP与MySQL连接这一部分,主要就几个PHP函数而已

mysql_connect() – 连接数据库

mysql_select_db() – 选择数据库

mysql_query() – 执行SQL查询

mysql_fetch_array() – 抓取查询结果,生成数组

 

SQL语句

额~因为我从没系统的看过,所以实施的时候总是出这样那样的语法问题,尤其是对 ‘ “ . ` 这些个符号的使用,非常混乱~

要用的时候,可以使用PhpMyAdmin里面,看看别人的SQL语句是怎样用的~

还是不在这误人子弟了~

 

为什么说要有一些前端工程师的技能呢?

首先嘛,这个用户注册,登录界面可是用户对整个站点的第一印象~

其次,我们来看看twitter的界面、Tumblr的界面等,里面用到某些行为,非常形象生动,给人很好的感觉,让整个站点马上体现出一种“炫”~

 

万事都说安全第一,网站也不例外~

做任何系统,都不要相信用户的输入(@http://rockux.com 还教我们不要相信javascript,具体该怎么做自己想吧)~

必须要对用户的输入进行处理,才可以执行、或者存储,否则,神马跨站攻击、神马SQL注入攻击,烂摊子不好收拾~

一个比较基本的处理,PHP的魔术引号,详情请看:传送门

 

做人做事要“眼高手低”,万丈高楼平地起,just do it~