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

phpCLI源码介绍

时间:2023-03-30 01:33:22 PHP

phpcliphpcli是sapi的具体实现之一,是在特定的终端上实现的。另外cgi、fpm、embed也是sapi的具体实现。这里sapi可以理解为php的外部环境显示的界面。每个具体模式的实现都会有一个选择,去实现他声明的一些方法。cli实现逻辑相对简单。cli主程序入口在\sapi\cli\php_cli.c中。此外,还有一个内置的网络服务器。在sapi\cli\php_cli_server.c中有一个独立的cli_server_sapi_module结构赋值实现。它还调用了php_module_startup,可以类比cli脚本执行。sapi_module_structoverviewcliprocessoperationOS环境判断->初始化变量->加载cli环境特殊函数(eg:cli_set_process_title)->thread-safeTSRM*->signal[(non)reliablesignal]屏蔽处理zend_signal_startup->命令行参数parse->startsapi_module->startup(cli_sapi_module)->executedo_cli()一些命令行解析和初始化...sapi_module->ini_defaults=sapi_cli_ini_defaults;//初始化INI默认设置sapi_module->php_ini_path_override=ini_path_override;//cli下载php.ini路径,设置重写的ini_path地址,php-c|可以指定一个路径sapi_module->phpinfo_as_text=1;sapi_module->php_ini_ignore_cwd=1;//默认是不在php中查找当前路径.inisapi_startup(sapi_module);//sapi启动initsapi_started=1;//标志已经启动sapi_module->php_ini_ignore=ini_ignore;//由启动开始!if(sapi_module->startup(sapi_module)==FAILURE){...cli_sapi_modulesapi_module_struct*sapi_module=&cli_sapi_module;staticsapi_module_structcli_sapi_module={"cli",/*name*/"CommandLineInterface",/*漂亮的名字*/php_cli_startup,/*启动*/php_module_shutdown_wrapper,/*关闭*/NULL,/*激活*/sapi_cli_deactivate,/*停用*/sapi_cli_ub_write,/*无缓冲写入*/sapi_cli_flush,/*刷新*/NULL,/*获取uid*/NULL,/*getenv*/php_error,/*错误处理器*/sapi_cli_header_handler,/*头处理器*/sapi_cli_send_headers,/*发送头处理器*/sapi_cli_send_header,/*发送头处理器*/NULL,/*读取POST数据*/sapi_cli_read_cookies,/*读取Cookies*/sapi_cli_register_variables,/*注册服务器变量像$_SERVER中注册表??变量*/sapi_cli_log_message,/*日志消息*/NULL,/*获取请求时间*/NULL,/*子终止*/STANDARD_SAPI_MODULE_PROPERTIES};执行核心do_cli#开始涉及zend_file_handle结构体typedefstruct_zend_file_handle{union{intfd;//文件描述符FILE*fp;//文件句柄zend_stream流;//zend自己的流}handle;constchar*filename;//文件名zend_string*opened_pa??th;//打开的路径zend_stream_typetype;//type为具体类型,为枚举包括下面的ZEND_HANDLE_FILENAME,ZEND_HANDLE_FD,ZEND_HANDLE_FP,ZEND_HANDLE_STREAM,ZEND_HANDLE_MAPPEDzend_boolfree_filename;//销毁时是否释放文件名}zend_file_handle;/*接下来是phpcli的一些特殊命令行参数的处理,比如-r-i-v-m;-a-c-f等等,这些参数的传递导致了行为的switchcase(默认是PHP_MODE_STANDARD)*/switch(behavior){casePHP_MODE_STANDARD://defaultPHP文件执行这里.filename,"Standardinputcode")){cli_register_file_handles();//标准输入、输出、错误}if(interactive&&cli_shell_callbacks.cli_shell_run){exit_status=cli_shell_callbacks.cli_shell_run();}else{php_execute_script(&file_handle);//传入PHP文件开始执行PHP并返回执行状态exit_status=EG(exit_status);}休息;casePHP_MODE_LINT://检查语法错误exit_status=php_lint_script(&file_handle);如果(退出状态==成功S){zend_printf("%s中没有检测到语法错误\n",file_handle.filename);}else{zend_printf("错误解析%s\n",file_handle.filename);}break;...请求结束。..if(request_started){//结束请求php_request_shutdown((void*)0);}...最美少年就是他↓

最新推荐
猜你喜欢