swoole原始碼分析之Buffer的substr操作
阿新 • • 發佈:2018-12-13
swoole_buffer提供的substr操作用於從緩衝區中取出內容。
string swoole_buffer->substr(int $offset, int $length = -1, bool $remove = false);
$offset
表示偏移量,如果為負數,表示倒數計算偏移量$length
表示讀取資料的長度,預設為從 $offset 到整個快取區末尾$remove
表示從緩衝區的頭部將此資料移除。只有 $offset = 0 時此引數才有效
下面我們分析下其流程。
static PHP_METHOD(swoole_buffer, substr) { long offset; long length = -1; zend_bool remove = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|lb", &offset, &length, &remove) == FAILURE) { RETURN_FALSE; } swString *buffer = swoole_get_object(getThis()); if (remove && !(offset == 0 && length <= buffer->length)) { remove = 0; } if (offset < 0) { offset = buffer->length + offset; } offset += buffer->offset; if (length < 0) { length = buffer->length - offset; } if (offset + length > buffer->length) { swoole_php_error(E_WARNING, "offset(%ld, %ld) is out of bounds.", offset, length); RETURN_FALSE; } if (remove) { buffer->offset += length; zend_update_property_long(swoole_buffer_class_entry_ptr, getThis(), ZEND_STRL("length"), buffer->length - buffer->offset TSRMLS_CC); if (buffer->offset > SW_STRING_BUFFER_GARBAGE_MIN && buffer->offset * SW_STRING_BUFFER_GARBAGE_RATIO > buffer->size) { swoole_buffer_recycle(buffer); } } SW_RETURN_STRINGL(buffer->str + offset, length, 1); }