Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动加载的php代码在Lando环境内部编辑后不更新_Php_Docker_Docker Compose_Composer Php_Lando - Fatal编程技术网

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

自动加载的php代码在Lando环境内部编辑后不更新,php,docker,docker-compose,composer-php,lando,Php,Docker,Docker Compose,Composer Php,Lando,问题的关键在于,我编辑了一个代码文件,而更改只有在重建整个环境后才会生效。奇怪的是,到目前为止,我已经有好几个月没有遇到这个问题了。我刚决定在本周完成这个项目,但突然间编辑文件不再有效(没有重建) 我甚至不知道从哪里开始尝试解决这个问题。任何建议都会有所帮助,尤其是那些有兰多和多克经验的人。好吧,因为我不知道是什么导致了这一切,我将试着解释我的整个设置并从那里开始: 我使用Lando运行一个运行PHP7.3的容器。当我SSH到正在运行的容器中并执行脚本php worker.php时,我的脚本运行

问题的关键在于,我编辑了一个代码文件,而更改只有在重建整个环境后才会生效。奇怪的是,到目前为止,我已经有好几个月没有遇到这个问题了。我刚决定在本周完成这个项目,但突然间编辑文件不再有效(没有重建)

我甚至不知道从哪里开始尝试解决这个问题。任何建议都会有所帮助,尤其是那些有兰多和多克经验的人。好吧,因为我不知道是什么导致了这一切,我将试着解释我的整个设置并从那里开始:

我使用Lando运行一个运行PHP7.3的容器。当我SSH到正在运行的容器中并执行脚本
php worker.php
时,我的脚本运行没有问题。然后,如果我编辑它,比如说添加一个var_dump('helloworld!'),我就会得到预期的输出。但是,如果我编辑一个自动加载的类文件,比如MyClass.php,并在其中添加一个var_转储,那么什么都不会发生。事实上,我必须使用
lando rebuild
完全重建环境,才能显示var_转储。奇怪吧

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

  • 我试着重新启动Docker
  • 我试着重新启动我的电脑
  • 我尝试了
    lando destroy
    lando rebuild
    重新开始
  • 我已经尝试将SSHing放入容器并运行
    catmylib/MyClass.php
    ,我看到了添加的var\u dump语句!!但是,当我运行
    php worker.php
    时,添加到MyClass的var_转储不在那里。它怎么可能存在于文件系统中,而在执行过程中却不存在?这真是让我大吃一惊
  • 我尝试将MyClass.php重命名为MyClass2.php,这一次解决了这个问题。也就是说,在它更新之后,每次有更改时,我都需要一次又一次地重命名它。这显然不是一个真正的解决方案,但值得深思
  • 我尝试过使用
    include\u一次性手动加载类。这非常有效,编辑一旦发生就会生效。问题是我不想手动包含所有文件,我想使用composer autoloader。我已经使用它很长时间了,我更愿意修复它突然出现的问题
好的,最后,我的一些理论:

  • 显然有些东西在缓存东西,但我不知道是什么。我认为这可能和PHP操作码缓存有关,但据我所知,我并没有启用PHP操作码缓存
  • 另一种理论是,可能文件系统装载不起作用。但是,它正在工作,因为当我编辑worker.php时,每次都会立即发生更改。如果没有文件系统装载,就不会发生这种情况
  • 还有一种理论认为,要么Docker在某种程度上缓存某些东西(我不知道如何缓存),要么Lando在缓存?我不完全了解兰多。也许它有某种我不知道的缓存方案
  • 最后一个理论是,自动加载的类是由PHP本身或我的composer之类的东西缓存的。我也不知道这是怎么可能的,但我不是composer或php内部工作的专家,所以如果这里有代码缓存,我不知道
所以我知道人们可能会要求一些东西: Dockerfile

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
兰多·伊梅尔先生

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安装

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

但我不知道为什么会这样。我有点认为启用优化器会导致缓存,但它似乎禁用了缓存。我真的不知道为什么会这样。如果有人能比我更好地解释这一点,那么我会投票支持你的答案,而不是我的答案。

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

只需将以下代码放入composer.json文件并运行
composer安装

    "config": {
        "optimize-autoloader": true
    },
但我不知道为什么会这样。我有点认为启用优化器会导致缓存,但它似乎禁用了缓存。我真的不知道为什么会这样。如果有人能比我更好地解释这一点,那么我会投票支持你的答案而不是我的答案