_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:
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
case ZEND_REQUIRE_ONCE: ...{
zend_file_handle file_handle;
char cwd[MAXPATHLEN];
cwd_state state;
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
if (IS_ABSOLUTE_PATH(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename))) ...{
cwd[0] = '';
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
} else if (!VCWD_GETCWD(cwd, MAXPATHLEN)) ...{
cwd[0] = '';
}
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
state.cwd_length = strlen(cwd);
state.cwd = zend_strndup(cwd, state.cwd_length);
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
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));
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
free(state.cwd);
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
if (failure_retval) ...{
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
/**//* do nothing */
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
} else if (SUCCESS == zend_stream_open(Z_STRVAL_P(inc_filename), &file_handle TSRMLS_CC)) ...{
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
if (!file_handle.opened_path) ...{
file_handle.opened_path = estrndup(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename));
}
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
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);
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
} else ...{
zend_file_handle_dtor(&file_handle);
failure_retval=1;
}
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
} else ...{
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) ...{
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename));
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
} 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;
![](http://img.e-com-net.com/image/info5/b188521f3aa84b57a8056a8c8b5b6aab.gif)
case ZEND_EVAL: ...{
char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
![](http://img.e-com-net.com/image/info5/a346b1749c914b45a8a28b734475a530.gif)
new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
efree(eval_desc);
}
break;
EMPTY_SWITCH_DEFAULT_CASE()
}