【问题标题】:Get the name of running script from a PHP extension从 PHP 扩展中获取运行脚本的名称
【发布时间】:2012-08-14 00:33:17
【问题描述】:

我正在为 PHP 编写一个小扩展。有没有办法在运行时知道正在运行的脚本文件的名称(例如:test.php)?也许是一些全局或环境变量?

【问题讨论】:

    标签: php c php-extension php-internals


    【解决方案1】:

    我试过这个脚本,但它对我不起作用。第一条语句:

    if (!zend_hash_exists(&EG(symbol_table), "_SERVER", 8)

    失败。我正在从 CLI 运行 PHP。但是,我确实通过我的 PHP 脚本设置了变量,当我通过同一个脚本使用 print_r($_SERVER) 时,我得到了一个完整的值数组。

    我认为在这种情况下,zend_hash_exists() 之前的否定是不必要的。

    【讨论】:

      【解决方案2】:

      您可以获取$_SERVER['PHP_SELF'](或任何其他 $_SERVER 变量,如果需要),如下所示:

      // This code makes sure $_SERVER has been initialized
      if (!zend_hash_exists(&EG(symbol_table), "_SERVER", 8)) {
          zend_auto_global* auto_global;
          if (zend_hash_find(CG(auto_globals), "_SERVER", 8, (void **)&auto_global) != FAILURE) {
              auto_global->armed = auto_global->auto_global_callback(auto_global->name, auto_global->name_len TSRMLS_CC);
          }
      }
      
      // This fetches $_SERVER['PHP_SELF']
      zval** arr;
      char* script_name;
      if (zend_hash_find(&EG(symbol_table), "_SERVER", 8, (void**)&arr) != FAILURE) {
          HashTable* ht = Z_ARRVAL_P(*arr);
          zval** val;
          if (zend_hash_find(ht, "PHP_SELF", 9, (void**)&val) != FAILURE) {
              script_name = Z_STRVAL_PP(val);
          }
      }
      

      script_name 变量将包含脚本的名称。

      如果您想知道,初始化 $_SERVER 的第一个块是必要的,因为某些 SAPI(例如:Apache 处理程序)只会在用户脚本访问它时初始化 $_SERVER(即时)。如果没有该代码块,如果您在脚本尝试访问$_SERVER 之前尝试读取$_SERVER['PHP_SELF'],您最终会得到一个空值。

      显然,您应该在上面的代码中添加错误处理以防万一失败,这样您在尝试访问script_name 时就不会调用未定义的行为。

      【讨论】:

      • 感谢这个 sn-p:我试图通过使用 'zend_auto_global_disable_jit' 来初始化 '_SERVER',但不知何故它不起作用。这也帮助我确认了我在另一个问题中发现的内容:哈希查找函数需要密钥的大小,包括终止字符,而 'disable_jit 函数不是这种情况。我说的问题在这里:stackoverflow.com/questions/1906565/…
      【解决方案3】:

      试试变量$argv。该数组中的第一项包含脚本的名称。

      编辑

      对于 C 函数

      int main 接受两个参数argcargv(请参阅here)。与上述情况相同。即argv[0] 是命令名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-18
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多