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



问题的关键是我编辑了一个代码文件,直到重建了整个环境之后,更改才会生效。奇怪的是,到目前为止,我已经有几个月没有遇到这个问题了。我刚决定在本周结束这个项目并继续工作,突然编辑文件不再有效(没有重建(。

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

我使用Lando来运行一个运行PHP7.3的容器。当我将SSH连接到正在运行的容器并执行脚本php worker.php时,我的脚本运行没有问题。然后,如果我编辑它,比如添加一个var_dump("你好世界!"(,我就会得到预期的输出。但是,如果我编辑一个自动加载的类文件,比如MyClass.php,并在其中添加一个var_dump,则不会发生任何事情。事实上,我必须使用lando rebuild完全重建环境,才能显示var_dump。奇怪吧?

好的,下面是我尝试过的一些东西:

  • 我已尝试重新启动Docker
  • 我试着重新启动电脑
  • 我已经尝试过lando destroylando rebuild来重新开始
  • 我已经在容器中尝试SSHing并运行cat mylib/MyClass.php,我看到了添加的var_dump语句!!但是,当我运行php worker.php时,添加到MyClass的var_dump不存在。它怎么可能存在于文件系统中,但在执行过程中却不存在?这真是让我大吃一惊
  • 我试着将MyClass.php重命名为MyClass2.php,这一次解决了这个问题。也就是说,在它更新后,我需要一次又一次地重命名它。这显然不是一个真正的解决方案,但值得思考
  • 我尝试过使用include_once手动加载类。这非常有效,编辑一发生就会生效。问题是我不想手动包含我的所有文件,我想使用composer自动加载器。我已经使用它很长时间了,我更喜欢修复它突然出现的问题

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

  • 显然有东西在缓存东西,但我不知道是什么。我想这可能和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

.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
},

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

相关内容

  • 没有找到相关文章

最新更新