自动加载 php 代码在 Lando 环境内部编辑后未更新

Autoloaded php code not updating after edits inside of Lando environment

问题的症结在于我编辑了一个代码文件,但直到我重建整个环境后更改才生效。奇怪的是,到目前为止,我几个月的开发都没有遇到这个问题。我刚决定在这周重新开始这个项目并开始工作,突然间编辑文件不再有效(没有重建)。

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

我正在使用 Lando 运行 一个 运行ning PHP 7.3 的容器。当我通过 SSH 进入 运行ning 容器并执行我的脚本 php worker.php 我的脚本 运行 没问题。然后如果我编辑它,比如添加一个 var_dump('hello world!'),我会得到预期的输出。但是,如果我编辑一个自动加载的 class 文件,比如说 MyClass.php,并在那里添加一个 var_dump,什么也不会发生。事实上,我必须用 lando rebuild 完全重建环境才能让 var_dump 出现。很奇怪吧?

好的,下面是我尝试过的一些方法:

好的,最后,我的一些理论:

所以我知道人们可能会要求一些东西: 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 然后 运行ning composer install 似乎可以清除缓存。我希望我能从这里弄清楚,但答案仍然让我望而却步。 symfony 控制台与自动加载缓存代码有什么关系??我不知道。

我终于弄明白了,但是花了我一整天的时间。我希望有人偶然发现这一点,它可以节省您的时间。这是我必须做的,非常简单:

只需将以下代码放入您的 composer.json 文件和 运行 composer install!

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

虽然我不知道为什么会这样。我有点假设启用优化器会导致缓存,但它似乎禁用了它。老实说,我不知道为什么会这样。如果其他人能比我更好地解释这一点,那么我会投票赞成你的答案。