如何在C(PHP扩展)中使用PHP gzonflate函数



我不确定在C(PHP扩展(中调用PHP函数gzinflate的最佳方式。目前,我正在使用zlib来实现类似的gzonflate函数(我重用了zlib PHP扩展中的代码(。然而,我得到了";致命错误:允许的134217728字节的内存大小已用尽";问题这是我的代码:

H文件:

#define PHP_ZLIB_ENCODING_RAW -0xf
#define PHP_ZLIB_ENCODING_GZIP 0x1f
#define PHP_ZLIB_ENCODING_DEFLATE 0x0f
#define PHP_ZLIB_ENCODING_ANY 0x2f
#define PHP_ZLIB_BUFFER_SIZE_GUESS(in_len) (((size_t) ((double) in_len * (double) 1.015)) + 10 + 8 + 4 + 1)

C文件:

#include "zlib.h"
static voidpf php_zlib_alloc(voidpf opaque, uInt items, uInt size)
{
return (voidpf)safe_emalloc(items, size, 0);
}
static void php_zlib_free(voidpf opaque, voidpf address)
{
efree((void*)address);
}
static zend_string *php_zlib_encode(const char *in_buf, size_t in_len, int encoding, int level)
{
int status;
z_stream Z;
zend_string *out;
memset(&Z, 0, sizeof(z_stream));
Z.zalloc = php_zlib_alloc;
Z.zfree = php_zlib_free;
if (Z_OK == (status = deflateInit2(&Z, level, Z_DEFLATED, encoding, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY))) {
out = zend_string_alloc(PHP_ZLIB_BUFFER_SIZE_GUESS(in_len), 0);
Z.next_in = (Bytef *) in_buf;
Z.next_out = (Bytef *) ZSTR_VAL(out);
Z.avail_in = in_len;
Z.avail_out = ZSTR_LEN(out);
status = deflate(&Z, Z_FINISH);
deflateEnd(&Z);
if (Z_STREAM_END == status) {
/* size buffer down to actual length */
out = zend_string_truncate(out, Z.total_out, 0);
ZSTR_VAL(out)[ZSTR_LEN(out)] = '';
return out;
} else {
zend_string_efree(out);
}
}
php_error_docref(NULL, E_WARNING, "%s", zError(status));
return NULL;
}

使用功能:

zval data;
char *v;
v = "{"ok":1}";
php_json_decode_ex(&data, v, sizeof(v) - 1, 1, 512);
ZSTR_VAL(php_zlib_encode(Z_STRVAL_P(&data), Z_STRLEN_P(&data), PHP_ZLIB_ENCODING_DEFLATE, -1))

您需要使用Zlib。PHP中的Zlib支持默认情况下不启用。您需要使用zlib[=DIR]配置PHP。Windows版本的PHP内置了对该扩展的支持。您不需要加载任何额外的扩展就可以使用这些函数。您需要根据您的发行版安装php5-Zlib或php7-Zlib。

直接调用gzinflate函数,而不是实现zlib函数

zval function, output, args[1];
ZVAL_STRING(&args[0], Z_STRVAL_P("/* The gz data */"));
ZVAL_STRING(&function, "gzinflate");
call_user_function(NULL, NULL, &function, &output, 1, args);

您可以使用相同的方式调用C 中的任何现有PHP函数

相关内容

  • 没有找到相关文章

最新更新