【问题标题】:phpMyAdmin Fatal error: Call to undefined function __()phpMyAdmin 致命错误:调用未定义函数 __()
【发布时间】:2015-02-16 17:04:15
【问题描述】:

运行 RHEL 7 和 PHP 5.4.16 的服务器。当我尝试在浏览器中打开 /phpMyAdmin 时,出现错误:

Fatal error: Call to undefined function __() in /usr/share/phpMyAdmin/libraries/core.lib.php on line 242

Call Stack
#   Time    Memory  Function    Location
1   0.0008  348000  {main}( )   ../index.php:0
2   0.0018  503144  require_once( '/usr/share/phpMyAdmin/libraries/common.inc.php' )    ../index.php:12
3   0.0252  4224464 PMA_Config->__construct( )  ../common.inc.php:304
4   0.0252  4224712 PMA_Config->load( ) ../Config.class.php:100
5   0.0265  4309888 PMA_Config->checkConfigSource( )    ../Config.class.php:849
6   0.0265  4311088 PMA_fatalError( )   ../Config.class.php:1169

我相信我已经安装了所有必需的库,并且 apache 对 session.save_path 目录具有适当的权限,这是之前提出这个问题的问题。见:Call to undefined function __() error - phpMyAdmin

有人可以根据该调用堆栈给我一个提示吗? 以下是堆栈跟踪引用的行中的函数,相关行写在左边距:

core.lib.php 第 242 行:

   /**
   * displays the given error message on phpMyAdmin error page in foreign language,
   * ends script execution and closes session
   *
   * loads language file if not loaded already
   *
   * @param string       $error_message  the error message or named error message
   * @param string|array $message_args   arguments applied to $error_message
   * @param boolean      $delete_session whether to delete session cookie
   *
   * @return void
   */
   function PMA_fatalError(
       $error_message, $message_args = null, $delete_session = true
   ) {
   /* Use format string if applicable */
   if (is_string($message_args)) {
       $error_message = sprintf($error_message, $message_args);
   } elseif (is_array($message_args)) {
       $error_message = vsprintf($error_message, $message_args);
   }

   if ($GLOBALS['is_ajax_request']) {
       $response = PMA_Response::getInstance();
       $response->isSuccess(false);
       $response->addJSON('message', PMA_Message::error($error_message));
   } else {
       $error_message = strtr($error_message, array('<br />' => '[br]'));

       /* Load gettext for fatal errors */
       if (!function_exists('__')) {
           // It is possible that PMA_fatalError() is called before including
           // vendor_config.php which defines GETTEXT_INC. See bug #4557
           if (defined(GETTEXT_INC)) {
               include_once GETTEXT_INC;
           } else {
               include_once './libraries/php-gettext/gettext.inc';
           }
       }

       // these variables are used in the included file libraries/error.inc.php
242    $error_header = __('Error');
       $lang = $GLOBALS['available_languages'][$GLOBALS['lang']][1];
       $dir = $GLOBALS['text_dir'];

       // on fatal errors it cannot hurt to always delete the current session
       if ($delete_session
           && isset($GLOBALS['session_name'])
           && isset($_COOKIE[$GLOBALS['session_name']])
       ) {
           $GLOBALS['PMA_Config']->removeCookie($GLOBALS['session_name']);
       }

       // Displays the error message
       include './libraries/error.inc.php';
    }
    if (! defined('TESTSUITE')) {
       exit;
   }
   }

common.inc.php 在第 304 行:

304  $GLOBALS['PMA_Config'] = new PMA_Config(CONFIG_FILE);
     if (!defined('PMA_MINIMUM_COMMON')) {
         $GLOBALS['PMA_Config']->checkPmaAbsoluteUri();
     }

Config.class.php 第 100 行:

    /**
    * constructor
    *
    * @param string $source source to read config from
    */
   function __construct($source = null)
   {
       $this->settings = array();

       // functions need to refresh in case of config file changed goes in
       // PMA_Config::load()
100    $this->load($source);

       // other settings, independent from config file, comes in
       $this->checkSystem();

       $this->isHttps();

       $this->base_settings = $this->settings;
   }

Config.class.php 在第 849 行:

    /**
    * loads configuration from $source, usually the config file
    * should be called on object creation
    *
    * @param string $source config file
    *
    * @return bool
    */
   function load($source = null)
   {
       $this->loadDefaults();

       if (null !== $source) {
           $this->setSource($source);
       }

       /**
        * We check and set the font size at this point, to make the font size
        * selector work also for users without a config.inc.php
        */
       $this->checkFontsize();

       if (! $this->checkConfigSource()) {
849       return false;
       }

Config.class.php 在第 1169 行:

     /**
     * check config source
     *
     * @return boolean whether source is valid or not
     */
    function checkConfigSource()
    {
        if (! $this->getSource()) {
            // no configuration file set at all
            return false;
        }

        if (! file_exists($this->getSource())) {
            $this->source_mtime = 0;
            return false;
        }

        if (! is_readable($this->getSource())) {
            // manually check if file is readable
            // might be bug #3059806 Supporting running from CIFS/Samba shares

            $contents = false;
            $handle = @fopen($this->getSource(), 'r');
            if ($handle !== false) {
                $contents = @fread($handle, 1); // reading 1 byte is enough to test
                @fclose($handle);
            }
            if ($contents === false) {
                $this->source_mtime = 0;
                PMA_fatalError(
                    sprintf(
                        function_exists('__')
                        ? __('Existing configuration file (%s) is not readable.')
                        : 'Existing configuration file (%s) is not readable.',
                        $this->getSource()
                    )
1169            );
                return false;
            }
        }

        return true;
    }

【问题讨论】:

  • 如何检查 whar core.lib.php on line 242 是
  • 更新帖子以包含调用堆栈中引用的行的函数。

标签: php phpmyadmin


【解决方案1】:

问题是/etc/phpMyAdmin 目录的权限错误。 Web 服务器用户 apache 对 session.save_path 目录具有适当的权限,但 apache 无法从我的 config.inc.php 文件中读取。将 /etc/phpMyAdmin 的所有者更改为 apache 用户并将权限更改为 755 即可解决问题。

查看Config.class.php 中的checkConfigSource() 函数让我相信,如果问题在于访问配置文件,那么我会收到错误'Existing configuration file (%s) is not readable.' 而不是Call to undefined function __() 有谁知道为什么会这样?是这样吗?

这是一个非常基本的问题/解决方案,但除非有人另有建议,否则我想我会保留它,因为在尝试启动 phpMyAdmin 后,在其他讨论 Fatal error: Call to undefined function __() in /usr/share/phpMyAdmin/libraries/core.lib.php 错误时没有解决这个确切的问题/解决方案安装。

【讨论】:

  • 非常感谢。我遇到了同样的问题 - 将 CenOS 7 与 EPEL 的 phpmyadmin 包(v4.9.3-1)一起使用。将 /etc/phpMyAdmin/config.inc.php 的权限更改为 644 就可以了
  • 非常感谢!我在 CentOS 7.5.1804 下遇到了同样的问题
【解决方案2】:

从 phpMyAdmin 收到相同的错误消息 :: FastCGI 在标准错误中发送:“PHP 消息:PHP 致命错误:调用第 245 行 /usr/share/phpMyAdmin/libraries/core.lib.php 中的未定义函数 __()”,同时从上游、客户端读取响应标头:

使用 nginx 在我的 Fedora 22 服务器 x86_64 上运行的解决方案: 在文件 /var/lib/php/session
上从 root:apache 更改所有者和组标识符 到根目录:nginx
使用命令sudo chown -Rfv root:nginx /var/lib/php/session。

【讨论】:

    【解决方案3】:

    如果 phpmyadmin 工作正常,然后突然无缘无故停止工作并出现奇怪且无用的错误消息,您可以尝试删除您的 php 会话。

    rm -rf /var/lib/php/sessions/*
    

    确切位置可能取决于操作系统和版本,这将删除所有活动会话,而不仅仅是您的会话,但它可以解决一些“突然停止工作”的问题,如果您没有更改任何内容并且之前工作正常.

    【讨论】:

      【解决方案4】:

      对我来说,这是不同的问题。我已授予 phpMyAdmin forlder 777 权限。当我将其更改为 755 时,它工作正常。

      希望这会对某人有所帮助。

      【讨论】:

        【解决方案5】:

        错误“连接已重置”
        文件: /usr/share/phpmyadmin/libraries/common.inc.php

        搜索:

        $GLOBALS['PMA_Config'] = new PMA_Config(CONFIG_FILE);<br>
        

        替换为:

        $GLOBALS['PMA_Config'] = new PMA_Config();
        

        【讨论】:

        • 你的回答不是很懂
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        • 2014-02-10
        • 2017-01-06
        相关资源
        最近更新 更多