Web,分析
Web

Emscripten 字符串传值

CC文件(C++)C文件(C),由于使用了string所以用CC文件代码如下

#include <stdio.h>
#include <string>
#include <emscripten/emscripten.h>
int main(int argc, char ** argv) {
    printf("Hello World\n");
}
#ifdef __cplusplus
extern "C" {
#endif
char * EMSCRIPTEN_KEEPALIVE myFunction (int i,char * argv) {
  printf("%d\n",i);
  return argv;
}
#ifdef __cplusplus
}
#endif

编译:emcc decrypt-wasm.cc -s WASM=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"

注意这里导出了一个胶水函数:ccall,默认会生成a.out.js

Heml、JavaScript代码:

<!DOCTYPE html>
<html>
<head>
  <title></title> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="a.out.js"></script>
  <script type="text/javascript">
    Module['onRuntimeInitialized'] = onRuntimeInitialized;
    function onRuntimeInitialized() {
      var result = Module.ccall('myFunction', // name of C function 
                                 String, // return type
                                 ['number','string'], // argument types
                                 [11,'1111']); // arguments
      console.log(UTF8ToString(result));
    }
  </script> 
</head>
<body>
</body>
</html>

效果

屏幕快照 2020-03-29 下午5.01.47.png

新版本的EMCC已经更改了一些获取返回值的方式,可以查看a.out.js导出的胶水代码,里面有一些函数返回值或者其它的处理。

传递数组

C

typedef struct 
{ 
uint32_t number;
    char* pass;
} Exxxxx;
Exxxxx * EMSCRIPTEN_KEEPALIVE cccc (int rands,char * argv) {
    Exxxxx *result = (Exxxxx *)malloc(sizeof(Exxxxx)); 
    return result;
}

JavaScript

function aaaa(_num,_str){
     var result = Module.ccall('cccc',
                                 Array, 
                                 ['number','string'], 
                                 [_num,_str]); 
          let __useless = Module.HEAPU32[result / 4],__key = UTF8ToString(Module.HEAPU32[result / 4+1] );
     return [__useless,__key];   
}


C&Rust编译wasm

不论是C或者Rust编译Wasm都可以在https://developer.mozilla.org/zh-CN/docs/WebAssembly找到很好的说明。如果你是用webpack或者rollup来进行打包JavaScript代码的话,可能你需要处理一些额外的事情,比如如何生成arrayBuffer。在尝试了一些webpack和rollup一些自带的加载器的时候出现了一些无法描述的问题,如是查看官方文档,注意到一些说明:https://developer.mozilla.org/zh-CN/docs/WebAssembly/Loading_and_running

未完待续:关注微信小程序获取访问密码 (文章ID:1738)或小程序在线阅读

从VideoJs理解Blob

Mozilla说明

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。      要从其他非blob对象和数据构造一个 Blob,请使用 Blob() 构造函数。要创建一个 blob 数据的子集 blob,请使用 slice() 方法。要获取用户文件系统上的文件对应的 Blob 对象,请参阅 File 文档。接受 Blob 对象的API也被列在 File 文档中。

更多的解释:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob

未完待续:关注微信小程序获取访问密码 (文章ID:1732)或小程序在线阅读

Nginx OpenResty PHP

本博客已搭建了访问地址

PHP:http://os.iwonmo.com

OpenResty:http://os.iwonmo.com/openresty

明确几个概念

Ngxin:反向代理(与之相对的是正向代理)

OpenResty:基于Nginx开发的Web平台,也可以理解为它就是Nginx只不过把Nginx增强了

PHP-FPM:PHP的进程管理器

普遍访问流程:用户 -> Ngxin -> PHP-FPM -> 数据 | 数据 -> 用户

OpenResty访问流程:用户 -> OpenResty ->数据 | 数据 -> 用户

可以看到少了PHP-FPM直接就可以把数据给用户,这样就可以去掉PHP的一些弊端。

比如高并发下PHP接受的请求多过PHP-FPM能够管理的进程会堵塞。

造成进程堵塞即使Nginx还有处理请求的能力,也得进行等待,这样Nginx的并发优势就没法体现出来。

普遍的解决方法就会不断的增加负载服务器,实际Nginx单台服务器的并发是很不错的。

但是使用PHP编写的话,就会有一些约束,这个约束来自PHP-FPM模式。

效率对比

第一张图是OpenResty,第二张图是PHP-FPM。可以发现有一个明显的激增,这个有很大概率是PHP堵塞其它请求等待。并发测试并没有太高,所以效果不是很明显,高并发下差异化会放大。

微信模板消息群发

在对用户群发消息的时候出现一些问题(发送用的zoujingli的封装):

1、循环发送150条,实际只到30-90之间。

2、用sleep for循环发送又会出现只发送1条或者2条的现象

思考:

1、是否是客户端已经断开 PHP脚本终止执行。

查看PHP的连接处理:https://www.php.net/manual/zh/features.connection-handling.php

  • 0 - NORMAL(正常)

  • 1 - ABORTED(异常退出)

  • 2 - TIMEOUT(超时)

所以有所怀疑是TIMEOUT,解决方法:set_time_limit 设置脚本超时时间

2、设置超时时间还是无效考虑是不是发送的频繁了

由于Sleep函数出现打断问题,所以使用 time_sleep_until 结果又出现了问题:150条发送了160次。有重复的。

3、是不是推送的太频繁微信队列问题

于是使用阿里的队列来进行逐个的推送,首先将用户推送到阿里的队列,然后在一个一个的从阿里的队列上取出来,推送给微信。结果又发现一个阿里的问题,显示的消息数一直在80与96两个数来回切换。而微信已经推送了100多条了。这个不影响功能,当阿里推送完毕我查看了一下阿里的消息数153条。而数据库的判断字段也没有了。也就是说脚本确实多推送了一些。怀疑是睡眠问题,于是将睡眠代码去掉,然后将脚本时间设置为0。

屏幕快照 2020-02-23 下午10.20.54.png

这次推送到阿里很准确,只有150条,原先推了153条。但是有个问题,微信的推送走的很慢,很长时间才会走一个推送。不过起码比没有强。准确度还有待检测。因为确实太慢了,就不等了,明天直接一个微信工单吧。

解决方法:

阅读全文»