gpt4 book ai didi

php - 在Lando环境中进行编辑后,自动加载的php代码未更新

转载 作者:行者123 更新时间:2023-12-02 21:04:55 27 4
gpt4 key购买 nike

问题的症结在于,我编辑一个代码文件,并且该更改直到我重建整个环境后才生效。奇怪的是,到目前为止,我已经有好几个月没有开发这个问题了。我刚刚决定尘埃落定这个项目并在本周进行此工作,并且突然之间的编辑文件不再起作用(无需重建)。

我什至不知道从哪里开始尝试解决这个问题。任何建议都会有所帮助,尤其是对那些拥有Lando和Docker经验的人。好吧,因为我不知道是什么原因造成的,所以我将尝试解释我的整个设置并从那里开始:

我正在使用Lando运行运行PHP 7.3的容器。当我通过SSH进入正在运行的容器并执行脚本php worker.php时,脚本不会出现任何问题。然后,如果我编辑它,说添加一个var_dump('hello world!'),我将得到预期的输出。但是,如果我编辑一个自动加载的类文件,例如说MyClass.php,并在其中添加一个var_dump,则什么也不会发生。实际上,我必须使用lando rebuild完全重建环境,以便显示var_dump。对吗?

好的,这是我尝试过的一些事情:

  • 我尝试重新启动Docker。
  • 我尝试重新启动计算机。
  • 我已经尝试lando destroylando rebuild重新开始。
  • 我尝试通过SSH进入容器并运行cat mylib/MyClass.php,然后看到添加的var_dump语句!但是,当我运行php worker.php时,添加到MyClass的var_dump不存在。它如何存在于文件系统中,但在执行过程中却不存在?这真的让我陷入困境。
  • 我尝试将MyClass.php重命名为MyClass2.php,这可以解决此问题。即更新后,我需要在每次更改时一次又一次重命名。这显然不是真正的解决方案,但值得深思。
  • 我尝试使用include_once手动加载类。这非常有效,编辑一旦发生即生效。问题是我不想手动包含所有文件,而是想使用composer自动加载器。我已经使用了很长时间,我更愿意修复突然出现问题的任何东西。

  • 最后,我的一些理论:
  • 有些东西显然正在缓存内容,但我不知道该怎么办。我以为可能与PHP Opcode缓存有关,但是据我所知,我没有启用php opcode缓存。
  • 另一个理论是,文件系统挂载可能无法正常工作。但是,它起作用了,因为当我编辑worker.php时,每次都立即存在更改。如果没有文件系统挂载,则不会发生这种情况。
  • 还有一个理论是Docker以某种方式(我不知道如何)缓存某种东西,或者Lando是?我不知道兰多内外。也许它有某种我不知道的缓存方案。
  • 最后一个理论是,PHP本身或我的 Composer 或类似的东西会以某种方式缓存自动加载的类。我也不知道怎么可能,但是我不是composer或php内部工作的专家,所以如果这里不涉及代码缓存,我就不会意识到。

  • 因此,我知道有些人可能会要求:
    Docker文件
    FROM php:7.3-apache

    RUN apt-get update \
    && apt-get install -y \
    git \
    zip \
    unzip \
    libzip-dev \
    libxml2-dev \
    libssl-dev \
    libc-client-dev \
    libkrb5-dev \
    && docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
    && CFLAGS="-I/usr/src/php" docker-php-ext-install zip mysqli pdo pdo_mysql xmlreader imap

    RUN curl --silent --show-error https://getcomposer.org/installer | php
    RUN mv composer.phar /usr/local/bin/composer

    # Bake composer dependencies into the image for production
    WORKDIR /app

    COPY composer.json ./
    COPY composer.lock ./

    RUN export COMPOSER_ALLOW_SUPERUSER=1 && \
    composer install --no-scripts --no-autoloader --no-dev

    COPY . ./

    RUN export COMPOSER_ALLOW_SUPERUSER=1 && \
    composer dump-autoload --optimize && \
    composer run-script post-install-cmd

    COPY vhost.conf /etc/apache2/sites-available/000-default.conf

    RUN chown -R www-data:www-data ./ && \
    a2enmod rewrite

    EXPOSE 80

    .lando.yml
    name: mysite
    env_file:
    - .env
    proxy:
    appserver:
    - mysite.lndo.site
    database:
    - db.mysite.lndo.site
    services:
    appserver:
    type: compose
    services:
    build: .
    command: apache2-foreground
    database:
    type: mysql
    portforward: 3306
    creds:
    ---super secret---

    composer.json
    {
    "name": "MySite/MySite",
    "description": "Would work great if not for caching issues. :(",
    "type": "project",
    "require": {
    "ext-json": "*",
    "ext-imap": "*",
    "doctrine/orm": "^2.6.2",
    "doctrine/migrations": "^2.0",
    "zbateson/mail-mime-parser": "^1.1",
    "rct567/dom-query": "^0.7.0",
    "sabre/xml": "^2.1",
    "phpmailer/phpmailer": "^6.0"
    },
    "autoload": {
    "psr-4": {
    "MySite\\": "./lib"
    }
    }
    }

    更新:
    我发现通过删除 vendor/symfony/console然后运行 composer install似乎可以清除缓存。我希望我能从这里弄清楚,但是答案仍然无法理解。 symfony控制台与自动加载缓存代码有什么关系?我不知道。

    最佳答案

    我终于想通了,但是花了我整天的时间。希望有人偶然发现此问题并为您节省时间。这是我要做的,很简单:

    只需将以下代码放入您的composer.json文件中,然后运行composer install即可!

        "config": {
    "optimize-autoloader": true
    },

    我不知道为什么会这样。我有点假设启用优化器会导致缓存,但相反似乎禁用了它。老实说,我不知道为什么会这样。如果其他人可以比我更好地解释这一点,那么我会投票支持我。

    关于php - 在Lando环境中进行编辑后,自动加载的php代码未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677094/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com