× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Table

Table一个基于共享内存和锁实现的超高性能,并发数据结构。用于解决多进程/多线程数据共享和同步加锁问题。

请谨慎使用数组方式读写Table, 建议使用文档中提供的API来进行操作
数组方式取出的Swoole\Table\Row对象为一次性对象, 请勿依赖其进行过多操作

优势

  • 性能强悍,单线程每秒可读写200万
  • 应用代码无需加锁,Table内置行锁自旋锁,所有操作均是多线程/多进程安全。用户层完全不需要考虑数据同步问题。
  • 支持多进程,Table可以用于多进程之间共享数据
  • 使用行锁,而不是全局锁,仅当2个进程在同一CPU时间,并发读取同一条数据才会进行发生抢锁

Table的内存容量不受PHPmemory_limit控制

遍历

请勿在遍历期间进行删除操作(可将所有key取出后进行删除)

Table类实现了迭代器和Countable接口,可以使用foreach进行遍历,使用count计算当前行数。

foreach($table as $row)
{
    var_dump($row);
}
echo count($table);

  • winters

    能说一说swoole_table的生命周期吗?是随着创建进程一起销毁吗?

  • 大盛V5

    找了半天手册没找到swoole_talbe对象中记录条数方法。实际源码中是有的swoole_table->count() 备注下。

  • 夏向红

    多机部署的时候,怎么实现数据同步,保持多机一致性

  • 夏威

    强烈建议提供一个clearAll方法来删除表里面的所有数据

  • php

    rango要加强文档的完善,而不是一直加功能呀。。PHP 简单易用,swoole 也要这样,才会有更多的人加入

  • 老船长

    至少要加个 Keys的方法,获取所有Key,

  • jsp士普

    韩天峰-Rango微博:swoole_table模块经过大规模压测,目前已稳定成熟。通过了并发8进程随机读写1600万次的测试。swoole_table基于共享内存,读写接口均为key-value形式,get/set操作使用行锁自选锁。彻底解决PHP没有高性能并发库的问题。

  • jsp士普

    文档写的有点问题, 获取当前行数$table->count()

  • 飞鱼

    多个进程间怎么共享table呢?

  • 5+

    1.8.6已踩坑。。。在迭代器里执行del会导致不可预期的结果

    foreach ($swoole_table as $k => $v) { $swoole_table->del($k);//你想清空所有行?别做梦了。。。 }

  • Robert

    发现一个问题,在swoole创建的不同进程中,同一个table读取的内容不一致?

  • Robert

    同一个swoole_table,在Server->Start()前已经创建好。 运行中发现:(1)在task进程中读取的值和worker进程中的值不同,(2) 不同worker进程中读取的值也不同。 mac osx和CentOS7下结果都一样。 请问如何才能读到一致的值?

  • Robert

    已经找到原因,是调用del() 导致的。 swoole_table 没问题。谢谢

  • lovejocky

    1.8.7在生产环境下,可以使用swoole_table吗?

  • YY

    现在swoole_table可以用了吗?

  • hill

    早可以了

  • 松帅

    foreach遍历期间,其他线程做操作会有问题么,比如删除一个条目

  • 依然D调

    我也入坑了

  • 俩鱼

    没有亲缘关系的进程之间,可以通过swoole_table共享数据吗?[挖鼻屎]

  • 俩鱼

    同问,没有亲缘关系的进程之间,可以通过swoole_table共享数据吗?[挖鼻屎]

  • 松林's blog

    这里有个坑 incr自增之后 del将始终返回false

  • Bacysoft

    Table 什么时候可以用于生产环境?现在是否已经足够稳定了?

  • 風色

    怎么也要有个max min吧... 我放20W数据, Key/Value, 不可能通过便利来获取最大KEY和最小KEY吧. Redis的有序集合(sorted set) 就很好, 能搬到swoole的table里. 机会秒杀绝大多数的计算场景.

  • 有个坑:在arm平台上,如果行大小未设为4的整数倍,会在创建表时产生内存不对齐,从而在get,set的原子锁调用时产生SIGBUS错误。

  • 姓唐名僧字嗡嗡

    swoole_table和global,在一个work中相比,哪个读写的效率更高?如果效率有差别,两者效率差距有多大?

  • 编程浪子

    我create了一个table, 行数16384, 列长1024, 执行set时,提示:PHP Warning: swoole_table::set(): Unable to allocate memory. 而且是加载11000行以后提示,全部log如下:

    11798 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11799 11800 11801 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11802 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11803 11804 11805 11806 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11807 11808 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11809 11810 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11811 11812 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11813 PHP Warning: swoole_table::set(): Unable to allocate memory. in /opt/sites/ss4gd4/test.php on line 49 11814 11815 11816 11817

    是不是个bug?

  • 吾爱

    为什么要移除lock方法..

  • 进阶大乘期

    无法遍历table,需要安装pcre-devel后,重新编译swoole才可以

  • Sin

    比起鸟哥水

  • Sin

    要不不做,要么做好.还提供VIP服务?

  • 拼个Léon

    2000万条数据测试:

    测试环境:

    CentOS 6.3,php 7.2,swoole 4.2;

    8G内存,2.5 4核 x 2;

    ====================== Create total use 55.091857910156 插入总用时

    Real create time 30.757210254669 实际插入代码用时

    Real create speed 665860.13 q/s 插入速度

    Real Row count 19250107 总插入行数

    ====================== 95 use 0.000083 查询总用时 Query Speed 1144996.78 q/s 查询速度 Avg query time use 0.000001 s root 28221 100 62.9 5447960 5152056 pts/1 S+ 19:21 1:00 php7 swoole_table.php root 28223 0.0 0.0 106108 1156 pts/1 S+ 19:22 0:00 sh -c ps aux|grep php root 28225 0.0 0.0 103336 864 pts/1 S+ 19:22 0:00 grep php

    2000万次插入一个id和一个name的table

    结果,平均插入速度66万个/秒;

    在这2000万中查询100个,平均用时1微秒,2000万个查询速度是114万个/秒

    内存占了 5152056 = 4.9G

    id为int 4字节,name 32字节,一条36字节,

    理论最小内存占用:19250107*36 = 693003852 / 1024/1024 = 660M, 实际多了7倍。感觉肯定有优化空间。

    除了内存占用外,其它表现,都可以用十分优秀来形容。

  • 赞

    @Sin 作为一个伸手党,还有理了,不喜欢就不要用,神一般的逻辑

  • sonly

    文档有时比软件本身更能影响推广,衷心希望能将文档写的更加完善与易懂,再次谢谢!

  • sonly

    swoole对于现在的PHP来讲,是一个不可或缺的组成部分,但入门还是有点高,所以将文档写的更加完善有利于PHPer新手的上手,也就更能拓展swoole的影响力,只有更多的人加入swoole大家庭,才能使swoole发展的更好更快。

  • 15573742616

    swoole的table不能销毁这是个很大的问题啊,我用table来处理进程间的通信,table分配到空间只能执行一次代码,第一次执行完成程序后,由于服务器是一直在运行的,即使用table的遍历删除table里的数据,可是程序第二次运行,就直接运行到table这里死了,请问如何让table释放空间?

  • 15573742616

    swoole的table不能销毁这是个很大的问题啊,每次都要退出服务才能释放table的空间? 我用table来处理进程间的通信,table分配到空间只能执行一次代码,第一次执行完成程序后,由于服务器是一直在在后台运行的,即使我用table的遍历删除table里的数据了,可是程序第二次被唤醒运行时,运行到table这里死了,请问如何让table释放空间?

  • J.M. Yuan

    这个swoole_table创建的表,在进程销毁后就自动移除了。实测是这样,不知道官方文档有没有写?

  • 13074895556

    晦涩难懂

  • 13074895556

    “Table一个基于共享内存和锁实现的超高性能,并发数据结构” 具体是什么样的数据结构呢?

  • 13757199220

    @Sin 确实是煞笔,伸手党还这么理直气壮的吗?还带人身攻击了,活久见,这么low还是退圈