使用Datadog服务监控php-fpm进程信息

Datadog是什么?

Cloud Monitoring as a Service —— 摘自官网
Datadog是一个一站式云端性能监控平台。

  1. 在datadog官网注册一个账号。
    注册过程中需要在服务器上安装Datadog的agent进程,选择服务器的平台,执行对应的命令即可。

    安装agent

  2. 在datadog上添加php-fpm。
    进入integrations页面,搜索PHP,在结果里移动到php-fpm上,点击install安装。

    添加php-fpm

- 阅读剩余部分 -

使用Slack和Hubot搭建自己的机器人

五一假期在微博上看到「湾区日报」用户发的「湾区日报是如何运作的?」,里面提到了他是如何使用Slack进行自动化的工作。
于是想着自己也搞一个自动化的机器人,本来想着使用微信公众号进行开发,但是苦于没有认证无法使用高级接口,遂作罢。

1. 在Slack上创建一个Bot帐号

进入Slack官网创建App页面

Build your own

- 阅读剩余部分 -

博客启用https了

很早就开始关注Let's Encrypt这个免费的ssl证书,看网上教程一直没动手实践。

官网的工具过于复杂,我使用的是le这个开源的工具。

由于80端口已经再使用了,我使用了dnspod的dns,所以我采用了dns验证的方式。

  1. 下载le

    git clone https://github.com/Neilpang/le.git
    
  2. 安装le

    cd le/
    ./le.sh install
    
  3. 创建证书

    le.sh   issue   dns-dp   liudon.org  www.liudon.org ec-256
    

    注意这一步操作前,需要先在dnspod上申请API token,然后执行下面的命令。

    export DP_Id="1234"
    export DP_Key="sADDsdasdgdsf"
    
  4. 配置nginx启用ssl即可。

利用phantomjs模拟QQ自动登录

之前为了抓取兴趣部落里的数据,研究了下QQ自动登录。

当时搜索了一番,发现大部分方法都已经失效了,于是准备自己开搞。

第一个想到的就是参考网上已有方案的做法,梳理登陆js的实现,通过其他语言重写。
考虑到js可能会更新,放弃了此方案。

第二个想到的是能不能直接调用QQ自己的js方法,模拟进行提交呢。
搜索一番后发现神器 ———— "phantomjs".

PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

于是开搞,代码实现如下。

var page = require('webpage').create();
var fs = require("fs");
page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4';
page.open('http://ui.ptlogin2.qq.com/cgi-bin/login?pt_no_onekey=1&style=9&appid=1006102&s_url=http%3A%2F%2Fxiaoqu.qq.com%2Fmobile%2Fbarindex.html%3F_lv%3D29313%26_bid%3D128%26_wv%3D1027%26from%3Dshare_link%23bid%3D37469%26type%3D%26source%3Dindex%26scene%3Drecent%26from%3Ddongtai%26webview%3D1&low_login=0&hln_css=http%3A%2F%2Fpub.idqqimg.com%2Fqqun%2Fxiaoqu%2Fmobile%2Fimg%2Fnopack%2Flogin-logo.png', function(status){
    if (status == 'success') {
        page.render('index.png');
        setTimeout(function() {
            page.evaluate(function() {
                document.getElementById('u').value = 'QQ号码';
                document.getElementById('p').value = 'QQ密码';
                pt.check(false);
            });
            setTimeout(function() {
                file = fs.open("cookie.log", 'w');
                file.write(JSON.stringify(page.cookies));
                file.close();
                phantom.exit();
            }, 2000);
        }, 1000);
    }
});

cookie会写入到当前目录下的cookie.log文件,有了cookie接下来的事情就简单多了。

PHP进行tcp连接

业务里用到tcp跟后端服务进行通信。

  1. 原生PHP的写法。

        $host = '服务端IP';
        $port = 端口号;
        $timeout = 5;
    
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if (socket_connect($socket, $host, $port) === false) { // 创建连接
            socket_close($socket);
            $message = 'create socket error';
            throw new Exception($message, socket_last_error());
        }   
    
        if (socket_write($socket, $buffer) === false) { // 发包
            socket_close($socket);
            $message = sprintf("write socket error:%s", socket_strerror(socket_last_error()));
            throw new Exception($message, socket_last_error());
        }   
    
        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
    
        $rspBuffer = socket_read($socket, 65536); // 接收回包
    
        socket_close($socket);
    
  2. 使用swoole的写法。

        $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
        $ret = $client->connect('服务端IP', 端口号, 0.5, 0);  // 创建连接
        if (!$ret) {
            throw new Exception('connect error', $client->errCode);
        }   
    
        $client->send($buffer); // 发包
    
        $rspBuffer = $client->recv(); // 接收回包
    

一目了然,使用swoole的写法更加清楚明了。