flowable 配置运行在 MySQL 数据库

flowable 下载下来后有五个war文件直接放到 Tomcat webapps 目录下即可使用,默认使用h2内存数据库,如果尝试更改配置文件使用MySQL会提示 com.mysql.jdbc.Driver 这个类不存在或找不到。

(更优解决方案请参考本文评论。)

解决方法是重新编译打包,步骤如下:

下载 flowable 源代码后,分别进去 flowable-app-rest , flowable-ui-modeler, flowable-ui-idm, flowable-ui-task 等目录使用

命令进行编译打包,进入 flowalbe-ui-admin 目录使用

命令进行编译打包,将 war 放到 Tomcat webapps 目录下,启动Tomcat会自动解压得到同名目录,然后修改对应数据库配置即可。

将图片由 RGB 转为 CMYK 格式

 

PHP-PM 执行原理

大体流程如下:主进程监听两个socket,一个接收外部 http 请求(web 服务器),另一个与子进程通信。主进程通过 proc_open 调用创建子进程,每个子进程会监听一个 socket(http 服务器),主进程将 http 请求转发给子进程进行处理。子进程在 bootstrap 阶段会 new 一个 Application (假设是 symfony 框架),后面所有的请求都不会再重复初始化 Application (因此比传统 PHP-FPM 执行速度快)。

画了一个图

PHP7 的高性能来自于哪些改进

  • 变量容器 zval 结构体定义改变,减少内存占用,减少引用计数相关操作。
  • zend_string。字符串复制的时候,采用引用赋值,zend_string可以避免的内存拷贝。
  • zend_array。数组的value默认为zval。
    HashTable的大小从72下降到56字节,减少22%。
    Buckets的大小从72下降到32字节,减少50%。
    数组元素的Buckets的内存空间是一同分配的。
    数组元素的key(Bucket.key)指向zend_string。
    数组元素的value被嵌入到Bucket中。
    降低CPU Cache Miss。
  • 改进函数调用机制。
  • 通过宏定义和内联函数(inline),让编译器提前完成部分工作

参考链接:

  1. http://www.csdn.net/article/2015-09-16/2825720
  2. PHP’s new hashtable implementation
  3. Internal value representation in PHP 7 – Part 2

MyISAM 和 InnoDB 存储引擎区别及各自使用场景

InnoDB 主要优势

  • 事务支持:事务提交回滚以及错误恢复。
  • 行级锁
  • 聚合索引
  • 外键支持

InnoDB 在 MySQL 5.6.4 后支持全文索引。

MySQL 5.5 后默认存储引擎为InnoDb。

如果不能使用到索引,行级锁会失效。

如何选择两种存储引擎

大量读,几乎没有写请求 和 小于5.6.4版本需要全文索引,选择 MyISAM,其他情况选择InnoDB。

我的性能测试结果,仅供参考

单进程插入10万条记录,MyISAM 1.8348009586334 秒, InnoDB 2.0098528862 秒

6个进程同时各插入10万条记录,MyISAM 3.860533952713 秒, InnoDB 2.9386329650879 秒(每个进程运行时间差不多,文章中给出的是其中一进程的运行时间,下同)

12个进程同时各插入10万条记录,MyISAM 7.4965870380402 秒, InnoDB 5.0007991790771 秒

单进程插入1万条记录,MyISAM 4.3874440193176 秒, InnoDB 3.8677229881287 秒

6个进程同时各插入1万条记录,MyISAM 9.7532279491425 秒, InnoDB 6.4886889457703 秒(平均每个进程运行时间)

12个进程同时各插入1万条记录,MyISAM 22.401536941528 秒, InnoDB 8.3166329860687 秒(平均每个进程运行时间)

12个进程同时主键SELECT1万次,MyISAM 3.3773090839386 秒, InnoDB 3.3466641902924 秒(平均每个进程运行时间)

30个进程同时主键SELECT1万次,MyISAM 8.7141139507294 秒, InnoDB 8.6588280200958 秒(平均每个进程运行时间)

总结:从这个测试结果来看,InnoDB几乎是完胜啊。(结果仅供参考,或许完全没有参考价值,毕竟与真实业务中的查询情况相差巨大)

PHP内存回收原理

每个php变量存在一个叫”zval”的变量容器中。除了包含变量的类型和值,还包括两个字节的额外信息。is_ref 是个bool值,用来标识这个变量是否是属于引用集合(reference set),refcount 用以表示指向这个zval变量容器的变量(也称符号即symbol)个数

refcount 为0时变量从内存中删除。在5.3之前的版本无法处理循环引用的问题。5.3及以后, 在引入新的垃圾回收算法来对付循环引用计数的时候, 作者加入了大量的宏来操作refcount, 为了能让错误更快的显现, 所以改名为refcount__gc, 迫使大家都使用宏来操作refcount。

一个zval在5.3之前版本占用24字节(64位系统,下同),5.3为了解决循环引用的问题,用zval_gc_info劫持了zval的分配,因此5.3到5.6,一个zval实际占用32字节。

从PHP7开始, 对于在zval的value字段中能保存下的值, 就不再对他们进行引用计数了, 而是在拷贝的时候直接赋值, 这样就省掉了大量的引用计数相关的操作, 这部分类型有:IS_LONG、IS_DOUBLE,对于那种根本没有值, 只有类型的类型, 也不需要引用计数了:IS_NULL、IS_FALSE、IS_TRUE。

PHP7的性能,我们并没有引入什么新的技术模式, 不过就是主要来自, 持续不懈的降低内存占用, 提高缓存友好性, 降低执行的指令数的这些原则而来的。

PHP5(v<5.3) zval 结构体定义:

PHP5(5.3<= v < 7) zval 结构体定义:

5.3及以上版本虽然 struct  _zval_struct 结构体的内容没有变(除了 refcount 重命名为 refcount__gc,is_ref 重命名为 is_ref__gc),但是新增的头文件 zend_gc.h 重定义了 ALLOC_ZVAL 宏

zval_gc_info 的定义为

所以实际上5.3及以上版本zval大小为32字节。

PHP7 zval 结构体定义如下

 

关于内存对齐请参考:https://levphy.github.io/2017/03/23/memory-alignment.html

PhpStorm 激活服务器 PhpStorm License Server

下面给出的激活服务器可以激活 JetBrains 系列的所有产品,包括但不限于:PhpStorm AppCode CLion IDEA PyCharm RubyMine WebStorm

http://jetbrains.tencent.click
http://idea.lanyus.com
http://idea.qinxi1992.cn

http://idea.imsxm.com/
http://114.215.133.70:41017/
http://172.245.22.235:1017/
http://mcpmcc.com:1017
http://idea.pjoc.pub

http://idea.goxz.gq/
http://v2mc.net:1017/
http://idea.imsxm.com/
http://idea.ibdyr.com/

作者:伍源辉
链接:http://www.jianshu.com/p/8c49c41603ab
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Yii2 gridview fixed column width 如何设置table宽度固定

其中关键代码是:’style’ => ‘table-layout: fixed;’ 和 ‘options’ => [‘style’ => ‘width:10em’]