Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
PHP Äں˷ÖÎö£ºZend ÐéÄâ»ú
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ 2017-4-11
  2039  次浏览      27
 

PHP ÊÇһÎâÊÍÐ͵ÄÓïÑÔ¡£ÖîÈç Java¡¢Python¡¢Ruby¡¢Javascript µÈ½âÊÍÐÍÓïÑÔ£¬ÎÒÃDZàдµÄ´úÂë²»»á±»±àÒë³É»úÆ÷ÂëÔËÐУ¬¶øÊǻᱻ±àÒëÖмäÂëÔËÐÐÔÚÐéÄâ»ú£¨VM£©ÉÏ¡£ÔËÐÐ PHP µÄÐéÄâ»ú£¬³ÆÖ®Îª Zend ÐéÄâ»ú£¬½ñÌìÎÒÃǽ«ÉîÈëÄںˣ¬Ì½¾¿ Zend ÐéÄâ»úÔËÐеÄÔ­Àí¡£

OPCODE

ʲôÊÇ OPCODE£¿ËüÊÇÒ»ÖÖÐéÄâ»úÄܹ»Ê¶±ð²¢´¦ÀíµÄÖ¸Áî¡£Zend ÐéÄâ»ú°üº¬ÁËһϵÁÐµÄ OPCODE£¬Í¨¹ý OPCODE ÐéÄâ»úÄܹ»×öºÜ¶àÊÂÇ飬Áоټ¸¸ö OPCODE µÄÀý×Ó£º

ZEND_ADD ½«Á½¸ö²Ù×÷ÊýÏà¼Ó¡£

ZEND_NEW ´´½¨Ò»¸ö PHP ¶ÔÏó¡£

ZEND_ECHO ½«ÄÚÈÝÊä³öµ½±ê×¼Êä³öÖС£

ZEND_EXIT Í˳ö PHP¡£

ÖîÈç´ËÀàµÄ²Ù×÷£¬PHP ¶¨ÒåÁË186¸ö£¨Ëæ×Å PHP µÄ¸üУ¬¿Ï¶¨»áÖ§³Ö¸ü¶àÖÖÀàµÄ OPCODE£©£¬ËùÓÐµÄ OPCODE µÄ¶¨ÒåºÍʵÏÖ¶¼¿ÉÒÔÔÚÔ´ÂëµÄ zend/zend_vm_def.h Îļþ£¨Õâ¸öÎļþµÄÄÚÈݲ¢²»ÊÇÔ­ÉúµÄ C ´úÂ룬¶øÊÇÒ»¸öÄ£°å£¬ºóÃæ»á˵Ã÷Ô­Òò£©ÖвéÔĵ½¡£

ÎÒÃÇÀ´¿´Ï PHP ÊÇÈçºÎÉè¼Æ OPCODE Êý¾Ý½á¹¹£º

struct _zend_op {
const void *handler;
znode_op op1;
znode_op op2;
znode_op result;
uint32_t extended_value;
uint32_t lineno;
zend_uchar opcode;
zend_uchar op1_type;
zend_uchar op2_type;
zend_uchar result_type;
};

×Ðϸ¹Û²ì OPCODE µÄÊý¾Ý½á¹¹£¬ÊDz»ÊÇÄÜÕÒµ½»ã±àÓïÑԵĸоõ¡£Ã¿Ò»¸ö OPCODE ¶¼°üº¬Á½¸ö²Ù×÷Êý£¬op1ºÍ op2£¬handler Ö¸ÕëÔòÖ¸ÏòÁËÖ´Ðиà OPCODE ²Ù×÷µÄº¯Êý£¬º¯Êý´¦ÀíºóµÄ½á¹û£¬»á±»±£´æÔÚ result ÖС£

ÎÒÃǾÙÒ»¸ö¼òµ¥µÄÀý×Ó£º

<?php
$b = 1;
$a = $b + 2;

ÎÒÃÇͨ¹ý vld À©Õ¹¿´µ½£¬¾­¹ý±àÒëµÄºó£¬ÉÏÃæµÄ´úÂëÉú³ÉÁË ZEND_ADD Ö¸ÁîµÄ OPCODE¡£

compiled vars:  !0 = $b, !1 = $a
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 1
3 1 ADD ~3 !0, 2
2 ASSIGN !1, ~3
8 3 > RETURN 1

ÆäÖУ¬µÚ¶þÐÐÊÇ ZEND_ADD Ö¸ÁîµÄ OPCODE¡£ÎÒÃÇ¿´µ½£¬Ëü½ÓÊÕ2¸ö²Ù×÷Êý£¬op1 ÊDZäÁ¿ $b£¬op2 ÊÇÊý×Ö³£Á¿1£¬·µ»ØµÄ½á¹û´æÈëÁËÁÙʱ±äÁ¿ÖС£ÔÚ zend/zend_vm_def.h ÎļþÖУ¬ÎÒÃÇ¿ÉÒÔÕÒµ½ ZEND_ADD Ö¸Áî¶ÔÓ¦µÄº¯ÊýʵÏÖ£º

ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2, *result;

op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {

...
}

ÉÏÃæµÄ´úÂë²¢²»ÊÇÔ­ÉúµÄ C ´úÂ룬¶øÊÇÒ»ÖÖÄ£°å¡£

ΪʲôÕâÑù×ö£¿ÒòΪ PHP ÊÇÈõÀàÐÍÓïÑÔ£¬¶øÆäʵÏÖµÄ C ÔòÊÇÇ¿ÀàÐÍÓïÑÔ¡£ÈõÀàÐÍÓïÑÔÖ§³Ö×Ô¶¯ÀàÐÍÆ¥Å䣬¶ø×Ô¶¯ÀàÐÍÆ¥ÅäµÄʵÏÖ·½Ê½£¬¾ÍÏñÉÏÊö´úÂëÒ»Ñù£¬Í¨¹ýÅжÏÀ´´¦Àí²»Í¬ÀàÐ͵IJÎÊý¡£ÊÔÏëһϣ¬Èç¹ûÿһ¸ö OPCODE ´¦ÀíµÄʱºò¶¼ÐèÒªÅжϴ«ÈëµÄ²ÎÊýÀàÐÍ£¬ÄÇôÐÔÄÜÊÆ±Ø³ÉΪ¼«´óµÄÎÊÌ⣨һ´ÎÇëÇóÐèÒª´¦ÀíµÄ OPCODE ¿ÉÄÜÄÜ´ïµ½³ÉǧÉÏÍò¸ö£©¡£

ÄÄÓÐʲô°ì·¨Âð£¿ÎÒÃÇ·¢ÏÖÔÚ±àÒëµÄʱºò£¬ÒѾ­Äܹ»È·¶¨Ã¿¸ö²Ù×÷ÊýµÄÀàÐÍ£¨¿ÉÄÜÊdz£Á¿»¹ÊDZäÁ¿£©¡£ËùÒÔ£¬PHP ÕæÕýÖ´ÐÐʱµÄ C ´úÂ룬²»Í¬ÀàÐͲÙ×÷Êý½«·Ö³É²»Í¬µÄº¯Êý£¬¹©ÐéÄâ»úÖ±½Óµ÷Óá£Õⲿ·Ö´úÂë·ÅÔÚÁË zend/zend_vm_execute.h ÖУ¬Õ¹¿ªºóµÄÎļþÏ൱´ó£¬¶øÇÒÎÒÃÇ×¢Òâµ½»¹ÓÐÕâÑùµÄ´úÂ룺

if (IS_CONST == IS_CV) {

ÍêȫûÓÐʲôÒâÒåÊǰɣ¿²»¹ýûÓйØÏµ£¬C µÄ±àÒëÆ÷»á×Ô¶¯ÓÅ»¯ÕâÑùÅжϡ£´ó¶àÊýÇé¿ö£¬ÎÒÃÇÏ£ÍûÁ˽âij¸ö OPCODE ´¦ÀíµÄÂß¼­£¬»¹ÊÇͨ¹ýÔĶÁÄ£°åÎļþ zend/zend_vm_def.h ±È½ÏÈÝÒס£Ë³±ã˵һÏ£¬¸ù¾ÝÄ£°åÉú³É C ´úÂëµÄ³ÌÐò¾ÍÊÇÓà PHP ʵÏֵġ£

Ö´Ðйý³Ì

׼ȷµÄÀ´Ëµ£¬PHP µÄÖ´ÐзֳÉÁËÁ½´ó²¿·Ö£º±àÒëºÍÖ´ÐС£ÕâÀïÎÒ½«²»»áÏêϸչ¿ª±àÒëµÄ²¿·Ö£¬¶øÊǰѽ¹µã·ÅÔÚÖ´ÐеĹý³Ì¡£

ͨ¹ýÓï·¨¡¢´Ê·¨·ÖÎöµÈһϵÁеıàÒë¹ý³Ìºó£¬ÎÒÃǵõ½ÁËÒ»¸öÃûΪ OPArray µÄÊý¾Ý£¬Æä½á¹¹ÈçÏ£º

struct _zend_op_array {
/* Common elements */
zend_uchar type;
zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
uint32_t fn_flags;
zend_string *function_name;
zend_class_entry *scope;
zend_function *prototype;
uint32_t num_args;
uint32_t required_num_args;
zend_arg_info *arg_info;
/* END of common elements */

uint32_t *refcount;

uint32_t last;
zend_op *opcodes;

int last_var;
uint32_t T;
zend_string **vars;

int last_live_range;
int last_try_catch;
zend_live_range *live_range;
zend_try_catch_element *try_catch_array;

/* static variables support */
HashTable *static_variables;

zend_string *filename;
uint32_t line_start;
uint32_t line_end;
zend_string *doc_comment;
uint32_t early_binding; /* the linked list of delayed declarations */

int last_literal;
zval *literals;

int cache_size;
void **run_time_cache;

void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};

ÄÚÈݳ¬¶à¶Ô°É£¿¼òµ¥µÄÀí½â£¬Æä±¾ÖʾÍÊÇÒ»¸ö OPCODE Êý×éÍâ¼ÓÖ´Ðйý³ÌÖÐËùÐèÒªµÄ»·¾³Êý¾ÝµÄ¼¯ºÏ¡£½éÉܼ¸¸öÏà¶ÔÀ´Ëµ±È½ÏÖØÒªµÄ×ֶΣº

opcodes ´æ·Å OPCODE µÄÊý×é¡£

filename µ±Ç°Ö´ÐеĽű¾µÄÎļþÃû¡£

function_name µ±Ç°Ö´Ðеķ½·¨Ãû³Æ¡£

static_variables ¾²Ì¬±äÁ¿ÁÐ±í¡£

last_try_catch try_catch_array µ±Ç°ÉÏÏÂÎÄÖУ¬Èç¹û³öÏÖÒì³£ try-catch-finally Ìø×ªËùÐèµÄÐÅÏ¢¡£

literals ËùÓÐÖîÈç×Ö·û´® foo »òÕßÊý×Ö23£¬ÕâÑùµÄ³£Á¿×ÖÃæÁ¿¼¯ºÏ¡£

ΪʲôÐèÒªÉú³ÉÕâÑùÅÓ´óµÄÊý¾Ý£¿ÒòΪ±àÒëʱÆÚÉú³ÉµÄÐÅÏ¢Ô½¶à£¬Ö´ÐÐʱÆÚËùÐèÒªµÄʱ¼ä¾ÍÔ½ÉÙ¡£

½ÓÏÂÀ´£¬ÎÒÃÇ¿´Ï PHP ÊÇÈçºÎÖ´ÐÐ OPCODE¡£OPCODE µÄÖ´Ðб»·ÅÔÚÒ»¸ö´óÑ­»·ÖУ¬Õâ¸öÑ­»·Î»ÓÚ zend/zend_vm_execute.h ÖÐµÄ execute_ex º¯Êý£º

ZEND_API void execute_ex(zend_execute_data *ex)
{
DCL_OPLINE

zend_execute_data *execute_data = ex;

LOAD_OPLINE();
ZEND_VM_LOOP_INTERRUPT_CHECK();

while (1) {
if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0)) {
if (EXPECTED(ret > 0)) {
execute_data = EG(current_execute_data);
ZEND_VM_LOOP_INTERRUPT_CHECK();
} else {
return;
}
}
}

zend_error_noreturn(E_CORE_ERROR, "Arrived at end of main loop which shouldn't happen");
}

ÕâÀÎÒÈ¥µôÁËһЩ»·¾³±äÁ¿ÅжϷÖÖ§£¬±£ÁôÁËÔËÐеÄÖ÷Á÷³Ì¡£¿ÉÒÔ¿´µ½£¬ÔÚÒ»¸öÎÞÏÞÑ­»·ÖУ¬ÐéÄâ»ú»á²»¶Ïµ÷Óà OPCODE Ö¸¶¨µÄ handler º¯Êý´¦ÀíÖ¸Á£¬Ö±µ½Ä³´ÎÖ¸Áî´¦ÀíµÄ½á¹û ret СÓÚ0¡£×¢Òâµ½£¬ÔÚÖ÷Á÷³ÌÖв¢Ã»ÓÐÒÆ¶¯ OPCODE Êý×éµÄµ±Ç°Ö¸Õ룬¶øÊǰÑÕâ¸ö¹ý³Ì·Åµ½Ö¸ÁîÖ´ÐеľßÌ庯ÊýµÄ½áβ¡£ËùÒÔ£¬ÎÒÃÇÔÚ´ó¶àÊý OPCODE µÄʵÏÖº¯ÊýµÄĩ⣬¶¼ÄÜ¿´µ½µ÷ÓÃÕâ¸öºê£º

ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

ÔÚ֮ǰÄǸö¼òµ¥Àý×ÓÖУ¬ÎÒÃÇ¿´µ½ vld ´òÓ¡³öµÄÖ´ÐÐ OPCODE Êý×éÖУ¬×îºóÓÐÒ»ÏîÖ¸ÁîΪ ZEND_RETURN µÄ OPCODE¡£µ«ÎÒÃDZàдµÄ PHP ´úÂëÖв¢Ã»ÓÐÕâÑùµÄÓï¾ä¡£ÔÚ±àÒëʱÆÚ£¬ÐéÄâ»ú»á×Ô¶¯½«Õâ¸öÖ¸Áî¼Óµ½ OPCODE Êý×éµÄ½áβ¡£ZEND_RETURN Ö¸Áî¶ÔÓ¦µÄº¯Êý»á·µ»Ø -1£¬ÅжÏÖ´ÐеĽá¹ûСÓÚ0ʱ£¬¾Í»áÍ˳öÑ­»·£¬´Ó¶ø½áÊø³ÌÐòµÄÔËÐС£

·½·¨µ÷ÓÃ

Èç¹ûÎÒÃǵ÷ÓÃÒ»¸ö×Ô¶¨ÒåµÄº¯Êý£¬ÐéÄâ»ú»áÈçºÎ´¦ÀíÄØ£¿

<?php
function foo() {
echo 'test';
}

foo();

ÎÒÃÇͨ¹ý vld ²é¿´Éú³ÉµÄ OPCODE¡£³öÏÖÁËÁ½¸ö OPCODE Ö¸ÁîÖ´ÐÐÕ»£¬ÊÇÒòΪÎÒÃÇ×Ô¶¨ÒåÁËÒ»¸ö PHP º¯Êý¡£ÔÚµÚÒ»¸öÖ´ÐÐÕ»ÉÏ£¬µ÷ÓÃ×Ô¶¨Ò庯Êý»áÖ´ÐÐÁ½¸ö OPCODE Ö¸ÁINIT_FCALL ºÍ DO_FCALL¡£

compiled vars:  none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > NOP
6 1 INIT_FCALL 'foo'
2 DO_FCALL 0
3 > RETURN 1

compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > ECHO 'test'
4 1 > RETURN null

ÆäÖУ¬INIT_FCALL ×¼±¸ÁËÖ´Ðк¯ÊýʱËùÐèÒªµÄÉÏÏÂÎÄÊý¾Ý¡£DO_FCALL ¸ºÔðÖ´Ðк¯Êý¡£DO_FCALL µÄ´¦Àíº¯Êý¸ù¾Ý²»Í¬µÄµ÷ÓÃÇé¿ö´¦ÀíÁË´óÁ¿Âß¼­£¬ÎÒժȡÁËÆäÖÐÖ´ÐÐÓû§¶¨ÒåµÄº¯ÊýµÄÂß¼­²¿·Ö£º

ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
{
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
zend_object *object;
zval *ret;

...

if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
ret = NULL;
if (RETURN_VALUE_USED(opline)) {
ret = EX_VAR(opline->result.var);
ZVAL_NULL(ret);
}

call->prev_execute_data = execute_data;
i_init_func_execute_data(call, &fbc->op_array, ret);

if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
}

...

ZEND_VM_SET_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
}

¿ÉÒÔ¿´µ½£¬DO_FCALL Ê×ÏȽ«µ÷Óú¯ÊýǰµÄÉÏÏÂÎÄÊý¾Ý±£´æµ½ call->prev_execute_data£¬È»ºóµ÷Óà i_init_func_execute_data º¯Êý£¬½«×Ô¶¨Ò庯Êý¶ÔÏóÖÐµÄ op_array£¨Ã¿¸ö×Ô¶¨Ò庯Êý»áÔÚ±àÒëµÄʱºòÉú³É¶ÔÓ¦µÄÊý¾Ý£¬ÆäÊý¾Ý½á¹¹Öаüº¬Á˺¯ÊýµÄ OPCODE Êý×飩 ¸³Öµ¸øÐµÄÖ´ÐÐÉÏÏÂÎĶÔÏó¡£

È»ºó£¬µ÷Óà zend_execute_ex º¯Êý£¬¿ªÊ¼Ö´ÐÐ×Ô¶¨ÒåµÄº¯Êý¡£zend_execute_ex ʵ¼ÊÉϾÍÊÇÇ°ÃæÌáµ½µÄ execute_ex º¯Êý£¨Ä¬ÈÏÊÇÕâÑù£¬µ«À©Õ¹¿ÉÄÜÖØÐ´ zend_execute_ex Ö¸Õ룬Õâ¸ö API Èà PHP À©Õ¹¿ª·¢Õß¿ÉÒÔͨ¹ý¸²Ð´º¯Êý´ïµ½À©Õ¹¹¦ÄܵÄÄ¿µÄ£¬²»ÊDZ¾ÆªµÄÖ÷Ì⣬²»×¼±¸ÉîÈë̽ÌÖ£©£¬Ö»ÊÇÉÏÏÂÎÄÊý¾Ý±»Ìæ»»³Éµ±Ç°º¯ÊýËùÔÚµÄÉÏÏÂÎÄÊý¾Ý¡£

ÎÒÃÇ¿ÉÒÔÕâÑùÀí½â£¬×îÍâ²ãµÄ´úÂë¾ÍÊÇÒ»¸öĬÈÏ´æÔڵĺ¯Êý£¨ÀàËÆ C ÓïÑÔÖÐµÄ main()º¯Êý£©£¬ºÍÓû§×Ô¶¨ÒåµÄº¯Êý±¾ÖÊÉÏÊÇûÓÐÇø±ðµÄ¡£

Âß¼­Ìø×ª

ÎÒÃÇÖªµÀÖ¸Áî¶¼ÊÇ˳ÐòÖ´Ðе쬶øÎÒÃǵijÌÐò£¬Ò»°ã¶¼°üº¬²»ÉÙµÄÂß¼­ÅжϺÍÑ­»·£¬Õⲿ·ÖÓÖÊÇÈçºÎͨ¹ý OPCODE ʵÏÖµÄÄØ£¿

<?php
$a = 10;
if ($a == 10) {
echo 'success';
} else {
echo 'failure';
}

ÎÒÃÇ»¹ÊÇͨ¹ý vld ²é¿´ OPCODE£¨²»µÃ²»Ëµ vld À©Õ¹ÊÇ·ÖÎö PHP µÄÉñÆ÷£©¡£

compiled vars:  !0 = $a
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 10
3 1 IS_EQUAL ~2 !0, 10
2 > JMPZ ~2, ->5
4 3 > ECHO 'success'
4 > JMP ->6
6 5 > ECHO 'failure'
7 6 > > RETURN 1

ÎÒÃÇ¿´µ½£¬JMPZ ºÍ JMP ¿ØÖÆÁËÖ´ÐÐÁ÷³Ì¡£JMP µÄÂß¼­·Ç³£¼òµ¥£¬½«µ±Ç°µÄ OPCODE Ö¸ÕëÖ¸ÏòÐèÒªÌø×ªµÄ OPCODE¡£

ZEND_VM_HANDLER(42, ZEND_JMP, JMP_ADDR, ANY)
{
USE_OPLINE

ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1));
ZEND_VM_CONTINUE();
}

JMPZ ½ö½öÊǶàÁËÒ»´ÎÅжϣ¬¸ù¾Ý½á¹ûÑ¡ÔñÊÇ·ñÌø×ª£¬ÕâÀï¾Í²»ÔÙÖØ¸´ÁоÙÁË¡£¶ø´¦ÀíÑ­»·µÄ·½Ê½ÓëÅжϻù±¾ÉÏÊÇÀàËÆµÄ¡£

<?php
$a = [1, 2, 3];
foreach ($a as $n) {
echo $n;
}

compiled vars:  !0 = $a, !1 = $n
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, <array>
3 1 > FE_RESET_R $3 !0, ->5
2 > > FE_FETCH_R $3, !1, ->5
4 3 > ECHO !1
4 > JMP ->2
5 > FE_FREE $3
5 6 > RETURN 1

Ñ­»·Ö»ÐèÒª JMP Ö¸Áî¼´¿ÉÍê³É£¬Í¨¹ý FE_FETCH_R Ö¸ÁîÅжÏÊÇ·ñÒѾ­µ½´ïÊý×éµÄ½á⣬Èç¹ûµ½´ïÔòÍ˳öÑ­»·¡£

½áÓï

ͨ¹ýÁ˽â Zend ÐéÄâ»ú£¬ÏàÐÅÄã¶Ô PHP ÊÇÈçºÎÔËÐе쬻áÓиüÉî¿ÌµÄÀí½â¡£Ïëµ½ÎÒÃÇдµÄÒ»ÐÐÐдúÂ룬×îºó»úÆ÷Ö´ÐеÄʱºò»á±ä³ÉÊý²»Ê¤ÊýµÄÖ¸Áÿ¸öÖ¸ÁîÓÖ½¨Á¢ÔÚ¸´ÔӵĴ¦ÀíÂß¼­Ö®ÉÏ¡£ÄÇЩ´ÓÇ°ËæÒâдϵĴúÂ룬ÏÖÔڻ᲻»áÔÚÄÔº£Àï²»×Ô¾õµÄת»»³É OPCODE ÔÙÆ·Î¶Ò»·¬ÄØ£¿

   
2039 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢