PHP中require/include与require_once/include_once的性能对比

_once是要比非once要慢的,因为_once添加了一些条件判断,在zend的内部hash表中进行查找,只有当查找不到的时候才进行包含,
代码部分见 http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?view=markup

关键抄录如下:

switch  (Z_LVAL(opline -> op2.u.constant))  {
        
case ZEND_INCLUDE_ONCE:
        
case ZEND_REQUIRE_ONCE: {
                zend_file_handle file_handle;
                
char cwd[MAXPATHLEN];
                cwd_state state;

                
if (IS_ABSOLUTE_PATH(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename))) {
                    cwd[
0= '';
                }
 else if (!VCWD_GETCWD(cwd, MAXPATHLEN)) {
                    cwd[
0= '';
                }


                state.cwd_length 
= strlen(cwd);
                state.cwd 
= zend_strndup(cwd, state.cwd_length);

                failure_retval 
= (!virtual_file_ex(&state, Z_STRVAL_P(inc_filename), NULL, 1&&
                    zend_hash_exists(
&EG(included_files), state.cwd, state.cwd_length+1));

                free(state.cwd);

                
if (failure_retval) {
                    
/* do nothing */
                }
 else if (SUCCESS == zend_stream_open(Z_STRVAL_P(inc_filename), &file_handle TSRMLS_CC)) {
                    
if (!file_handle.opened_path) {
                        file_handle.opened_path 
= estrndup(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename));
                    }


                    
if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
                        new_op_array 
= zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
                        zend_destroy_file_handle(
&file_handle TSRMLS_CC);
                    }
 else {
                        zend_file_handle_dtor(
&file_handle);
                        failure_retval
=1;
                    }

                }
 else {
                    
if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
                        zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename));
                    }
 else {
                        zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename));
                    }

                }

            }

            
break;
        
case ZEND_INCLUDE:
        
case ZEND_REQUIRE:
            new_op_array 
= compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
            
break;
        
case ZEND_EVAL: {
                
char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);

                new_op_array 
= zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
                efree(eval_desc);
            }

            
break;
        EMPTY_SWITCH_DEFAULT_CASE()
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值