【问题标题】:Cannot redeclare CodeIgniter Helper Class无法重新声明 CodeIgniter Helper 类
【发布时间】:2018-07-27 03:22:34
【问题描述】:
  [Fri Jul 27 03:08:18.935217 2018] [:error] [pid 11] [client 172.18.0.1:54146] PHP Fatal error:  Cannot redeclare CreateUniqeSlugOfuser() (previously declared in /var/www/public_html/livesite/application/helpers/MY_url_helper.php:111) in /var/www/public_html/livesite/application/helpers/my_url_helper.php on line 111

上面是错误,我想这可能是一个简单的将我目录中的文件重命名为大写的 MY_url_helper 但这并没有像某些网站所说的那样修复错误。就目前而言,我不知道如何解决这个问题,但我确实有一些线索。

我不是代码点火专家,我从另一个开发人员那里接手了这个项目,但它目前可以在他们的服务器上运行。但是,它在我的服务器上不起作用。看到问题可能与自动加载有关,我做错了什么? PHP 中的不同版本是否会导致此问题?

另一个预感可能是我必须更改一些缓存?不过我不确定……任何想法都值得赞赏。

我会说更改文件名后,错误仍然认为我使用的是小写版本?我知道它正在读取文件,因为我可以在文件中抛出 phpinfo,它似乎因此触发我因此上传的图片。

更新:: 是否回显 CI_VERSION 命令来找到这个 (2.2.0)。可能这个版本不兼容 PHP 7.0?

php56 肯定是另一台服务器上的版本......我会看看我是否能以某种方式获得这个 docker 图像。

嗯 5.6 还是报错。

Dockerfile

FROM php:5.6-apache
MAINTAINER Joe Astrahan <jastrahan@poolservice.software>

RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y \
    bzip2 curl git less mysql-client sudo unzip zip \
    libbz2-dev libfontconfig1 libfontconfig1-dev \
    libfreetype6-dev libjpeg62-turbo-dev libpng-dev libzip-dev && \
    rm -rf /var/lib/apt/lists/*


RUN docker-php-ext-install bz2 && \
    docker-php-ext-configure gd \
        --with-freetype-dir=/usr/include/ \
        --with-jpeg-dir=/usr/include/ && \
    docker-php-ext-install gd && \
    docker-php-ext-install iconv && \
    docker-php-ext-install opcache && \
    docker-php-ext-install pdo_mysql && \
    docker-php-ext-install zip

RUN curl -sS https://getcomposer.org/installer \
    | php -- --install-dir=/usr/local/bin --filename=composer

# Set environment variables for Apache so we know its user and group names
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data

# Configure Apache SSL and Standard Virtualhosts
COPY config/apache_default.conf /etc/apache2/sites-available/000-default.conf
COPY config/apache_default-ssl.conf /etc/apache2/sites-available/default-ssl.conf
COPY config/run /usr/local/bin/run

# Configure SSL Directories & Create Temporary SSL Keys
RUN mkdir /etc/apache2/ssl
RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt  -subj "/C=US/ST=Florida/L=Fort Lauderdale/O=Pool Service Software LLC/OU=IT Department/CN=dev.poolservice.software.local"

RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite

#Configure SSL On Apache2 & Headers Mod
RUN a2enmod ssl
RUN a2enmod headers
RUN service apache2 restart
RUN a2ensite default-ssl.conf
RUN service apache2 restart

#Install Zip & Unzip
RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install zip unzip -y

#Install NodeJS
RUN apt-get update \
     && DEBIAN_FRONTEND=noninteractive apt-get install -y \
     software-properties-common

EXPOSE 80
EXPOSE 443

CMD ["/usr/local/bin/run"]

【问题讨论】:

  • 我意识到的错误在转到 5.6 后确实发生了变化,现在我得到了......致命错误:无法重新声明 external_redirect()(之前在 /var/www/public_html/livesite/application/helpers/ 中声明) MY_url_helper.php:6) 在第 6 行的 /var/www/public_html/livesite/application/helpers/my_url_helper.php 中
  • 您是否在代码中搜索过 CreateUniqeSlugOfuser 和 external_redirect 的实际物理声明位置,以确保它们不会被多次声明?
  • 我认为这不是因为代码现在可以在另一台服务器上运行,对吧?我认为这是一个服务器配置问题
  • 我附上了描述我的设置的 Docker 文件,我也可以很快附上源代码

标签: php codeigniter docker redeclare


【解决方案1】:

也许您已经在自动加载中加载了帮助程序,或者在您尝试再次加载之前已初始化的类。 CI 能够防止类重复,但不能防止纯 php 帮助文件。这就是为什么他们用:

if (!function_exists('functionname')) { ... }

我建议你也这样做。

【讨论】:

  • 我是这么想的,但在其他服务器上也可以使用相同的代码
  • 你实际实现了吗?
  • 我刚刚用 php 5.6 实现了,但仍然有错误,但至少这次它在视觉上显示了它。我会把我的 docker 文件给你们看看
  • 我不确定你所说的实现是什么意思?你能澄清一下吗?我更新了问题以显示 PHP 5.6,但仍然显示错误。
  • 我认为这是只有遇到问题的人才能真正解决的问题之一,因为它似乎高度本地化。与此同时,我建议将文件重命名为像“super_helper”这样的良性文件并加载它
【解决方案2】:

所以我解决了这个问题。原来 PHP 版本并没有真正产生影响,我的 docker 文件已更改为 PHP 7.0,因为它可以使用它,我将在下面附上它。

原来 CodeIgniter 2.x 使用的是 mysql 而不是 mysqli,所以我相应地更改了代码中的所有引用。此外,我必须将文件 my_url_helper 重命名为 urlhelper_helper ,然后在自动加载文件中相应地更改它,以便加载正确的文件。出于某种原因,即使它可以在旧服务器上运行,我也必须这样做才能使其适用于任一版本的 PHP。

这些修复是修复它所必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-03-22
    • 2023-03-29
    • 2016-02-24
    • 2018-02-16
    相关资源
    最近更新 更多