用cpu接近100%時,你如何找到導致cpu飙升的原因?我的思路是,首先找到進程正在執行的代碼行,從而確定可能有問題的代碼段。然後,再仔細分析有問題的代碼段,從而找出原因。
如果你的程序使用的是c、c++編寫,那麼你可以很容易的找到正在執行的代碼行。但是,程序是php編寫的,如何找到可能有問題的代碼行呢?這個問題就是本文要解決的問題。
背景知識:
大家都知道php是一個解釋性語言。用戶編寫的php代碼會生成opcode,由解釋器引擎去解釋執行。在解釋執行過程中,有一個全局變量包含了執行過 程中用到的各種數據。它就是executor_globals。在源碼的Zend/zend_globals.h 文件中可以找到他的類型定義。
代碼如下struct _zend_executor_globals {
zval **return_value_ptr_ptr;
zval uninitialized_zval;
zval *uninitialized_zval_ptr;
zval error_zval;
zval *error_zval_ptr;
zend_ptr_stack arg_types_stack;
/* symbol table cache */
HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
HashTable **symtable_cache_limit;
HashTable **symtable_cache_ptr;
zend_op **opline_ptr;
HashTable *active_symbol_table;
HashTable symbol_table; /* main symbol table */
HashTable included_files; /* files already included */
JMP_BUF *bailout;
int error_reporting;
int orig_error_reporting;
int exit_status;
zend_op_array *active_op_array;
HashTable *function_table; /* function symbol table */
HashTable *class_table; /* class table */
HashTable *zend_constants; /* constants table */
zend_class_entry *scope;
zend_class_entry *called_scope; /* Scope of the calling class */
zval *This;
long precision;
int ticks_count;
zend_bool in_execution;
HashTable *in_autoload;
zend_function *autoload_func;
zend_bool full_tables_cleanup;
/* for extended information support */
zend_bool no_extensions;
#ifdef ZEND_WIN32
zend_bool timed_out;
OSVERSIONINFOEX windows_version_info;
#endif
HashTable regular_list;
HashTa