ʹ�� PHP �� DTrace

��֧�� DTrace ��̬���ٵ�ƽ̨�ϣ��������� PHP �� DTrace ��̬̽�롣

PHP DTrace ��̬̽������

��ο�����ϵͳ�ĵ���ȡ���ò���ϵͳ DTrace ֧�ֵ���Ϣ�� ���磬�� Oracle Linux ϵͳ������ UEK3 �ںˣ����������²�����

# modprobe fasttrap
# chmod 666 /dev/dtrace/helper

���� chmod �����Ҳ����ʹ�� ACL �������������ض��û������豸�ķ���Ȩ�ޡ�

ʹ�� --enable-dtrace ���ò������� PHP��

# ./configure --enable-dtrace ...
# make
# make install

������������ PHP ���ĵľ�̬̽�롣�����ṩ������̽��� PHP ��չ��Ҫ�ֱ𹹽���

PHP ���ĵ� DTrace ��̬̽��

PHP �а������¿��õľ�̬̽��
̽������ ̽������ ̽�����
request-startup ����ʼʱ������ char *file, char *request_uri, char *request_method
request-shutdown ����ر�ʱ������ char *file, char *request_uri, char *request_method
compile-file-entry �ű���ʼ����ʱ������ char *compile_file, char *compile_file_translated
compile-file-return �ű���ɱ���ʱ������ char *compile_file, char *compile_file_translated
execute-entry ���������鿪ʼִ��ʱ���������磺�������ã��ļ������Լ��������ָ�ʱ�ᱻ������ char *request_file, int lineno
execute-return ����������ִ�����֮�󴥷��� char *request_file, int lineno
function-entry PHP ������� PHP �������߷�������ʱ������ char *function_name, char *request_file, int lineno, char *classname, char *scope
function-return PHP ����� PHP �������߷������÷��غ󴥷���. char *function_name, char *request_file, int lineno, char *classname, char *scope
exception-thrown ���쳣�׳�ʱ������ char *classname
exception-caught ���쳣������ʱ������ char *classname
error ���� error_reporting ���趨��Σ��ڷ�������ʱ���ᴥ���� char *errormsg, char *request_file, int lineno

PHP ��չ����ӵ�ж���ľ�̬̽�롣

�г� PHP �п��õľ�̬̽��

Ҫ�г� PHP �п��õľ�̬̽�룬����һ�� PHP ���̣�Ȼ�����У�

# dtrace -l

�����Ϣ����������ʾ��

   ID   PROVIDER            MODULE                          FUNCTION NAME
   [ . . . ]
    4   php15271               php               dtrace_compile_file compile-file-entry
    5   php15271               php               dtrace_compile_file compile-file-return
    6   php15271               php                        zend_error error
    7   php15271               php  ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught
    8   php15271               php     zend_throw_exception_internal exception-thrown
    9   php15271               php                 dtrace_execute_ex execute-entry
   10   php15271               php           dtrace_execute_internal execute-entry
   11   php15271               php                 dtrace_execute_ex execute-return
   12   php15271               php           dtrace_execute_internal execute-return
   13   php15271               php                 dtrace_execute_ex function-entry
   14   php15271               php                 dtrace_execute_ex function-return
   15   php15271               php              php_request_shutdown request-shutdown
   16   php15271               php               php_request_startup request-startup

Provider һ���� php �͵�ǰ���� id ����ɡ�

������е��� Apache web ����������ôģ�����ƿ����� libphp5.so�� ���ҿ��ܻ���ֶ����Ϣ��ÿ�������е� Apache ���̶�Ӧһ������顣

Function Name һ�б�ʾ Provider ��Ӧ�� PHP �ڲ� C ʵ�ֺ������ơ�

���û�������κ� PHP ���̣���ô�Ͳ�����ʾ�κ� PHP ̽�롣

PHP DTrace ʾ��

����չʾ�˻����� DTrace D �ű���

Example #1 all_probes.d for tracing all PHP Static Probes with DTrace

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

php*:::compile-file-entry
{
    printf("PHP compile-file-entry\n");
    printf("  compile_file              %s\n", copyinstr(arg0));
    printf("  compile_file_translated   %s\n", copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("PHP compile-file-return\n");
    printf("  compile_file              %s\n", copyinstr(arg0));
    printf("  compile_file_translated   %s\n", copyinstr(arg1));
}

php*:::error
{
    printf("PHP error\n");
    printf("  errormsg                  %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
}

php*:::exception-caught
{
    printf("PHP exception-caught\n");
    printf("  classname                 %s\n", copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("PHP exception-thrown\n");
    printf("  classname                 %s\n", copyinstr(arg0));
}

php*:::execute-entry
{
    printf("PHP execute-entry\n");
    printf("  request_file              %s\n", copyinstr(arg0));
    printf("  lineno                    %d\n", (int)arg1);
}

php*:::execute-return
{
    printf("PHP execute-return\n");
    printf("  request_file              %s\n", copyinstr(arg0));
    printf("  lineno                    %d\n", (int)arg1);
}

php*:::function-entry
{
    printf("PHP function-entry\n");
    printf("  function_name             %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
    printf("  classname                 %s\n", copyinstr(arg3));
    printf("  scope                     %s\n", copyinstr(arg4));
}

php*:::function-return
{
    printf("PHP function-return\n");
    printf("  function_name             %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
    printf("  classname                 %s\n", copyinstr(arg3));
    printf("  scope                     %s\n", copyinstr(arg4));
}

php*:::request-shutdown
{
    printf("PHP request-shutdown\n");
    printf("  file                      %s\n", copyinstr(arg0));
    printf("  request_uri               %s\n", copyinstr(arg1));
    printf("  request_method            %s\n", copyinstr(arg2));
}

php*:::request-startup
{
    printf("PHP request-startup\n");
    printf("  file                      %s\n", copyinstr(arg0));
    printf("  request_uri               %s\n", copyinstr(arg1));
    printf("  request_method            %s\n", copyinstr(arg2));
}

�˽ű��� dtrace ������ʹ���� -Z ѡ� ��ѡ�֤��ʹ��û���κ� PHP �������е�ʱ��ű�Ҳ�ܹ���ȷִ�С� ���ʡ���˴�ѡ���û���κ�̽��ɼ�ص�ʱ�򣬽ű���������ִֹ�С�

�����д˽ű��Ĺ����У��������ȫ�� PHP ���ľ�̬̽�롣 ���� D �ű���

# ./all_probes.d

������һ�� PHP �ű����� PHP Ӧ�ã��������м�ص� D �ű������ÿ��̽�뱻����ʱ��Я���IJ�����

������֮��ʹ�� ^C ����ֹ D �ű���ִ�С�

�ڶ� CPU �������ϣ�̽�����ʾ˳����ܲ��������ģ���ȡ�����Ŀ� CPU ִ��̽���Լ���� CPU ֮����߳�Ǩ������� ����ͨ����ʾ̽��ʱ��������ٻ��������磺

php*:::function-entry
{
      printf("%lld: PHP function-entry ", walltimestamp);
      [ . . .]
}