swoole源码分析之swoole_buffer的append操作

swoole_buffer提供的append操作用于将一个字符串数据追加到缓存区末尾。

int swoole_buffer->append(string $data);
  • $data是要写入的数据,支持二进制内容
  • 执行成功后,会返回新的长度

下面我们分析下其流程。

static PHP_METHOD(swoole_buffer, append)
{
    swString str;//定义swString变量
    bzero(&str, sizeof(str));//变量内存空间初始化

    //解析输入参数,这里的参数包括要追加字符串和字符串长度信息
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str.str, &str.length) == FAILURE)
    {
        RETURN_FALSE;
    }
   
    if (str.length < 1)//参数有效性检查,输入数据异常
    {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "string empty.");
        RETURN_FALSE;
    }
    swString *buffer = swoole_get_object(getThis());//获取swoole内部封装对象buffer

    //判断buffer目前已有的空间是否能容纳新追加的字符串,这里buffer空间有最大值限制
    if ((str.length + buffer->length) > buffer->size && (str.length + buffer->length) > SW_STRING_BUFFER_MAXLEN)
    {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "buffer size can't exceed %d", SW_STRING_BUFFER_MAXLEN);
        RETURN_FALSE;
    }

    size_t size_old = buffer->size;
    if (swString_append(buffer, &str) == SW_OK)//执行追加的操作,这里可能会扩容
    {
        if (buffer->size > size_old)//目前buffer的size比追加之前大,也就是发生了扩容
        {
            zend_update_property_long(swoole_buffer_class_entry_ptr, getThis(), ZEND_STRL("capacity"), buffer->size TSRMLS_CC);//更新swoole_buffer的capacity的属性
        }
        zend_update_property_long(swoole_buffer_class_entry_ptr, getThis(), ZEND_STRL("length"),
                buffer->length - buffer->offset TSRMLS_CC);//更新swoole_buffer的length属性
        RETURN_LONG(buffer->length - buffer->offset);
    }
    else
    {
        RETURN_FALSE;
    }
}
int swString_append(swString *str, swString *append_str)
{
    int new_size = str->length + append_str->length;//新的size大小
    if (new_size > str->size)//新的size大于目前buffer的size,则执行扩容
    {
        //执行扩容,关于扩容我们后续文章讨论
        if (swString_extend(str, swoole_size_align(new_size * 2, sysconf(_SC_PAGESIZE))) < 0)
        {
            return SW_ERR;
        }
    }

    memcpy(str->str + str->length, append_str->str, append_str->length);//进行内存空间拷贝
    str->length += append_str->length;//更新buffer的length大小
    return SW_OK;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
swoole_loader72_nzts_x64是一个针对PHP语言的扩展库,用于提供高性能的异步网络通信能力。Swoole是基于C语言开发的,可以让PHP程序实现多进程、多线程、协程等高并发处理的特性。 swoole_loader72_nzts_x64是针对PHP 7.2版本的64位操作系统的扩展库。目前,PHP7已经在性能上有了很大的提升,而swoole_loader72_nzts_x64进一步增强了PHP的并发处理能力。64位操作系统的支持能够更好地利用内存资源,提高程序运行效率。 通过使用swoole_loader72_nzts_x64,可以方便地开发一些高性能的网络应用,比如服务器、Web服务、游戏服务器等。swoole_loader72_nzts_x64提供了一系列的API函数,可以轻松实现TCP/UDP服务器,WebSocket服务器,定时器等功能。 相比于传统的PHP开发方式,swoole_loader72_nzts_x64的优势主要体现在以下几个方面: 1. 高并发:采用多进程/多线程/协程模型,可以同时处理成千上万的并发连接,大大提高了执行效率。 2. 高性能:通过底层C/C++编写,性能优越,能够在高负载的情况下依然保持稳定的性能表现。 3. 异步IO:支持异步非阻塞IO操作,减少了等待时间,提高了性能。 4. 内存管理:有效控制内存的使用,避免了内存泄漏和垃圾回收导致的性能损失。 5.易于使用:提供丰富的API函数和文档,开发者可以快速上手并使用。 总之,swoole_loader72_nzts_x64是一个非常有用的PHP扩展库,可以帮助开发者轻松实现高性能的网络应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值