当前位置: 首页 > 后端技术 > PHP

set_limit_time(),ini_set()分析

时间:2023-03-29 22:53:19 PHP

问题发现今天写了个脚本,景哥提交代码的时候给我cr,果断帮我指出这个脚本的运行时间限制,别写ini_set('max_execution_time','30');写set_limit_time(30);然后给我讲了一堆原理,什么set_limit_time()直接进内存,ini_set('max_execution_time',)需要临时修改原来的配置。。。嗯,我还是高级工程师知道的比较多,所以我开始测试这两个功能。测试测试代码如下:modifiable;已修改=ini_entry->已修改;if(stage==ZEND_INI_STAGE_ACTIVATE&&modify_type==ZEND_INI_SYSTEM){ini_entry->modifiable=ZEND_INI_SYSTEM;}if(!force_change){if(!(ini_entry->modifiable){modify_type)返回失败;}}if(!EG(modified_ini_directives)){ALLOC_HASHTABLE(EG(modified_ini_directives));zend_hash_init(EG(modified_ini_directives),8,NULL,NULL,0);}//无论我们调用多少次下一个ini_set,只有第一个ini_set会进入这个逻辑,从第二次ini_set调用开始设置orig_value,这个分支不会再执行,因为此时modified已经设置为1.所以ini_entry->orig_value总是保存第一次修改前的配置值(即最原始的配置)ini_entry->orig_modifiable=可修改;ini_entry->modified=1;zend_hash_add_ptr(EG(modified_ini_directives),ini_entry->name,ini_entry);}duplicate=zend_string_copy(new_value);//调用on_modify来更新模块的全局变量。每个ini_entry存储了模块全局变量的地址和对应的偏移量,方便on_modify快速修改内存。如果(!ini_entry->on_modify||ini_entry->on_modify(ini_entry,duplicate,ini_entry->mh_arg1,ini_entry->mh_arg2,ini_entry->mh_arg3,stage)==SUCCESS){if(modified&&ini_entry->orig_value!=ini_entry->value){/*我们已经改变了值,释放改变的值*/zend_string_release(ini_entry->value);}ini_entry->value=重复;}else{zend_string_release(复制);返回失败;}returnSUCCESS;}可以看出这个函数是通过on_modify回调函数直接修改内存中的全局变量来达到控制执行时间的目的,所以这也解释了为什么ini_set会在执行结束后失效。先说这个吧。过几天我会详细梳理和总结整个PHP生命周期的ini加载过程。参考文章:http://www.cnblogs.com/driftc...