�ڴ�������

�� C ���Ա��ʱ��������Ҫ�ֹ��ؽ����ڴ������Ϊ PHP �������� Web ��������ģ�飬�ڴ������Ԥ���ڴ�й©���ܹ���������Ҫ֪�� PHP ���������̻߳����У�����ζ��ȫ�ֱ������ܵ��¾���״�����й��߳���ȫ�����ݴ������Ϣ��μ���Ϊ�̸߳�����ʩ�� �̰߳�ȫ����Դ��������

���⣬Zend ����Ҫ���һ��ʮ�������ʹ��ģʽ����һ�αȽ϶̵�ʱ���ڣ���� zval �ṹ��С���ڴ���������С�ڴ�鱻�������ٱ��ͷš�PHP ���ڴ����Ҳ������ memory_limit(�ڴ�����)��

Ϊ���������ϵ�����Zend �����ṩΪ�˴���������������ṩ��һ��������ڴ���������������������ָֻ��Ҫ�����ڵ���������ٻ����������ʱ�ͷŵ����ݡ���չ��������Ҫ�Ӵ��±����г��Ĺ�������ȻһЩ���ṩ�ı�ݹ������ú�ʵ�ֵģ����ڱ����л�����һ���Դ���

��Ҫ���ڴ� APIs
ԭ�� ˵��
void *emalloc(size_t size) ���� size �ֽڵ��ڴ档
void *ecalloc(size_t nmemb, size_t size) �� nmemb Ԫ�ط��� size �ֽڵĻ���������ʼ��Ϊ�㡣
void *erealloc(void *ptr, size_t size) �޸�ʹ�� emalloc ����Ļ����� ptr �Ĵ�СΪ size �ֽڡ�
void efree(void *ptr) �ͷ� ptr ָ��Ļ��������������������� emalloc ����ġ�
void *safe_emalloc(size_t nmemb, size_t size, size_t offset) ���仺���������ÿ���СΪ size �ֽڵ� nmemb �飬������ offset �ֽڡ������� emalloc(nmemb * size + offset)���������������������Ᵽ����
char *estrdup(const char *s) ����һ���ɴ�� NULL ��β���ַ��� s �Ļ����������� s ���Ƶ��������ڡ�
char *estrndup(const char *s, unsigned int length) ������ estrdup���� NULL ��β���ַ�����������֪�ġ�

Note: ���� C ��׼�����ƵIJ��ֲ�ͬ���������������ڴ����Zend ������ڴ���������᷵�� NULL ֵ��������������ֹ��ǰ����

������������ֹ���ڴ�й©�������ܿ���ͷ������ڴ����ڴ�������Ҫ��ɲ��֡���Ϊ��ȫԭ�����������ʱ�� Zend ������ͷ������������ᵽ�� API ��������ڴ档��� PHP ʹ�� --enable-debug ����ѡ����й������⽫����һ�����档

Example #1 PHP ������

ZEND_FUNCTION(leak)
{
    long leakbytes = 3;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &leakbytes) == FAILURE) {
        return;
    }

    emalloc(leakbytes);
}

�������̵���������ڣ�

[Thu Oct 22 02:14:57 2009]  Script:  '-'
/home/johannes/src/PHP_5_3/Zend/zend_builtin_functions.c(1377) :  Freeing 0x088888D4 (3 bytes), script=-
=== Total 1 memory leaks detected ===

Note: ��ʹ�� PHP ����ʱ����Ҫȷ�ϱ������ڴ�Ҫʹ�� emalloc �����䣬��ע�����ü��������ϸ����鿴 ������ʹ����

Note: �ڴ�й©�������Է����� emalloc �����ڴ�鵼�µ�й©��Ϊ����������������ʹ���ڴ��������� valgrind �� libumem �ȡ�Ҫ�򻯴˷��������� PHP ����ʱͨ�����û������� USE_ZEND_ALLOC=0 ������ PHP ���ڴ��������