Linux 的 PHP 扩展 : reality check needed!

标签 php c memory-management php-extension

好的,我已经编写了我的第一个功能性 PHP 扩展。它有效,但它只是一个概念验证。现在我正在写另一个实际上做老板想要的。

我想从所有 PHP 专家那里了解这段代码是否有意义。我是否很好地掌握了 emalloc 之类的东西,或者那里有什么东西会在稍后转身并试图咬掉我的手?

下面是其中一个函数的代码。它返回也经过 Blowfish 加密的字符串的 base64。调用该函数时,会为其提供两个字符串,即要加密和编码的文本,以及加密阶段的 key 。它没有使用 PHP 自己的 base64 函数,因为在这一点上,我不知道如何链接到它们。出于同样的原因,它没有使用 PHP 自己的 mcrypt 函数。相反,它链接到 SSLeay BF_ecb_encrypt 函数中。

PHP_FUNCTION(Blowfish_Base64_encode)
{
    char *psData = NULL;
    char *psKey = NULL;
    int argc = ZEND_NUM_ARGS();
    int psData_len;
    int psKey_len;

    char *Buffer = NULL;
    char *pBuffer = NULL;

    char *Encoded = NULL;

    BF_KEY Context;

    int i = 0;

    unsigned char Block[ 8 ];
    unsigned char * pBlock = Block;

    char *plaintext;
    int plaintext_len;
    int cipher_len = 0;

    if (zend_parse_parameters(argc TSRMLS_CC, "ss", &psData, &psData_len, &psKey, &psKey_len) == FAILURE) 
        return;

    Buffer = (char *) emalloc( psData_len * 2 );
    pBuffer = Buffer;

    Encoded = (char *) emalloc( psData_len * 4 );

    BF_set_key( &Context, psKey_len, psKey );

    plaintext = psData;
    plaintext_len = psData_len;

    for (;;)
    {
        if (plaintext_len--)
        {
            Block[ i++ ] = *plaintext++;
            if (i == 8 )
            {
                BF_ecb_encrypt( Block, pBuffer, &Context, BF_ENCRYPT );
                pBuffer += 8;
                cipher_len += 8;
                memset( Block, 0, 8 );
                i = 0;
            }
        } else {
            BF_ecb_encrypt( Block, pBuffer, &Context, BF_ENCRYPT );
            cipher_len += 8;
            break;
        }
    }
    b64_encode( Encoded, Buffer, cipher_len );
    RETURN_STRINGL( Encoded, strlen( Encoded ), 0 );
}

您会注意到我有两个 emalloc 调用,用于 EncodedBuffer。只有 Encoded 被传回给调用者,所以我担心 Buffer 不会被释放。是这样吗?我应该为 Buffer 使用 malloc/free 吗?

如果有任何其他明显的错误,我将不胜感激。

最佳答案

emalloc() 为每个请求分配内存,并在运行时结束时自动 free()。

但是,您应该使用

编译 PHP

--enable-debug --enable-maintainer-zts

如果出现任何问题,它会告诉您(如果您使用了 e*() 函数并且在 php.ini 中设置了 report_memleaks,它可以检测到内存泄漏)。

是的,你应该使用 efree() 缓冲区。

关于Linux 的 PHP 扩展 : reality check needed!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810056/

相关文章:

php - javascript中的表达式引擎字段

php - 将wordpress中的数据插入到mysql中

c - 如何使用bin2h?

c - c中矩阵的重新分配

php - 带有 date_add 的 Mysql unix_timestamp 没有给出正确的时间戳

c - 将指针传递给头指针,void insertNode 函数?

c - 在循环倒计时中使用 size_t 时的无限循环

memory-management - 应如何正确使用 Staging Buffer 以提高性能?

objective-c - 打印 NSInteger 时出现奇怪的 BAD_ACCESS

php - 在 PDO 中使用 where 选择使用 php mysql