php语言 百分网手机站

PHP程序的执行流程怎么样

时间:2020-08-09 09:35:19 php语言 我要投稿

PHP程序的执行流程怎么样

  为了以后能开发PHP扩展,就一定要了解PHP的执行顺序。这篇文章就是为C开发PHP扩展做铺垫。

  Web环境我们假设为Apache。在编译PHP的`时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块。Apache加载这个模块,在url访问.php文件的时候,就会转给mod_php5.so模块来处理。这个就是我们常说的SAPI。英文名字是:Server Application Programming Interface。SAPI其实是一个统称,其下有 ISAPI,CLI SAPI,CGI等。有了它,就可以很容易的跟其他东西交互,比如APACHE,IIS,CGI等。

  Apache启动后会将mod_pho5.so模块的hook handler注册进来,当Apache检测到访问的url是一个php文件时,这时候就会把控制权交给SAPI。进入到SAPI后,首先会执行sapi/apache/mod_php5.c 文件的php_init_handler函数,这里摘录一段代码:

  static void php_init_handler(server_rec *s, pool *p)

  {

  register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);

  if (!apache_php_initialized) {

  apache_php_initialized = 1;

  #ifdef ZTS

  tsrm_startup(1, 1, 0, NULL);

  #endif

  sapi_startup(&apache_sapi_module);

  php_apache_startup(&apache_sapi_module);

  }

  #if MODULE_MAGIC_NUMBER >= 19980527

  {

  TSRMLS_FETCH();

  if (PG(expose_php)) {

  ap_add_version_component("PHP/" PHP_VERSION);

  }

  }

  #endif

  }

  该函数主要调用两个函数:sapi_startup(&apache_sapi_module); php_apache_startup(&apache_sapi_module);

  SAPI_API void sapi_startup(sapi_module_struct *sf)

  {

  sf->ini_entries = NULL;

  sapi_module = *sf;

  .................

  sapi_globals_ctor(&sapi_globals);

  ................

  virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */

  ..................

  reentrancy_startup();

  }

  sapi_startup创建一个 sapi_globals_struct结构体。sapi_globals_struct保存了Apache请求的基本信息,如服务器信息,Header,编码等。sapi_startup执行完毕后再执行php_apache_startup。

  static int php_apache_startup(sapi_module_struct *sapi_module)

  {

  if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {

  return FAILURE;

  } else {

  return SUCCESS;

  }

  }