自动加载 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。
- 我试过重新启动计算机。
- 我已经尝试
lando destroy
和 lando rebuild
重新开始。
- 我已经尝试通过 SSH 进入容器并 运行ning
cat mylib/MyClass.php
并且我看到了添加的 var_dump 语句!!但是,当我 运行 php worker.php
添加到 MyClass 的 var_dump 不存在时。它如何存在于文件系统中,但在执行期间却不存在?这真的让我陷入困境。
- 我试过将 MyClass.php 重命名为 MyClass2.php,这一次解决了这个问题。 IE。更新后,每次有更改时,我都需要一次又一次地重命名它。这显然不是真正的解决方案,但值得深思。
- 我试过使用
include_once
手动加载 classes。这非常有效,编辑一旦发生就会立即生效。问题是我不想手动包含所有文件,我想使用作曲家自动加载器。我已经使用它很长时间了,我宁愿只修复它突然出现的问题。
好的,最后,我的一些理论:
- 显然有东西在缓存东西,但我不知道是什么。我认为这可能与 PHP 操作码缓存有关,但据我所知,我没有启用 php 操作码缓存。
- 另一种理论是文件系统挂载可能无法正常工作。但是,它正在工作,因为当我编辑 worker.php 时,每次更改都会立即出现。如果没有文件系统挂载,就不会发生这种情况。
- 另一种理论是 Docker 正在以某种方式缓存某些内容(我不知道如何缓存),或者 Lando 是?我不了解兰多。也许它有某种我不知道的缓存方案。
- 最后的理论是,自动加载的 classes 由 PHP 本身或我的作曲家或类似的东西缓存。我也不知道这是怎么可能的,但我不是 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
然后 运行ning composer install
似乎可以清除缓存。我希望我能从这里弄清楚,但答案仍然让我望而却步。 symfony 控制台与自动加载缓存代码有什么关系??我不知道。
我终于弄明白了,但是花了我一整天的时间。我希望有人偶然发现这一点,它可以节省您的时间。这是我必须做的,非常简单:
只需将以下代码放入您的 composer.json 文件和 运行 composer install
!
"config": {
"optimize-autoloader": true
},
虽然我不知道为什么会这样。我有点假设启用优化器会导致缓存,但它似乎禁用了它。老实说,我不知道为什么会这样。如果其他人能比我更好地解释这一点,那么我会投票赞成你的答案。
问题的症结在于我编辑了一个代码文件,但直到我重建整个环境后更改才生效。奇怪的是,到目前为止,我几个月的开发都没有遇到这个问题。我刚决定在这周重新开始这个项目并开始工作,突然间编辑文件不再有效(没有重建)。
我什至不知道从哪里开始尝试解决这个问题。任何建议都有帮助,尤其是来自对 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。
- 我试过重新启动计算机。
- 我已经尝试
lando destroy
和lando rebuild
重新开始。 - 我已经尝试通过 SSH 进入容器并 运行ning
cat mylib/MyClass.php
并且我看到了添加的 var_dump 语句!!但是,当我 运行php worker.php
添加到 MyClass 的 var_dump 不存在时。它如何存在于文件系统中,但在执行期间却不存在?这真的让我陷入困境。 - 我试过将 MyClass.php 重命名为 MyClass2.php,这一次解决了这个问题。 IE。更新后,每次有更改时,我都需要一次又一次地重命名它。这显然不是真正的解决方案,但值得深思。
- 我试过使用
include_once
手动加载 classes。这非常有效,编辑一旦发生就会立即生效。问题是我不想手动包含所有文件,我想使用作曲家自动加载器。我已经使用它很长时间了,我宁愿只修复它突然出现的问题。
好的,最后,我的一些理论:
- 显然有东西在缓存东西,但我不知道是什么。我认为这可能与 PHP 操作码缓存有关,但据我所知,我没有启用 php 操作码缓存。
- 另一种理论是文件系统挂载可能无法正常工作。但是,它正在工作,因为当我编辑 worker.php 时,每次更改都会立即出现。如果没有文件系统挂载,就不会发生这种情况。
- 另一种理论是 Docker 正在以某种方式缓存某些内容(我不知道如何缓存),或者 Lando 是?我不了解兰多。也许它有某种我不知道的缓存方案。
- 最后的理论是,自动加载的 classes 由 PHP 本身或我的作曲家或类似的东西缓存。我也不知道这是怎么可能的,但我不是 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
然后 运行ning composer install
似乎可以清除缓存。我希望我能从这里弄清楚,但答案仍然让我望而却步。 symfony 控制台与自动加载缓存代码有什么关系??我不知道。
我终于弄明白了,但是花了我一整天的时间。我希望有人偶然发现这一点,它可以节省您的时间。这是我必须做的,非常简单:
只需将以下代码放入您的 composer.json 文件和 运行 composer install
!
"config": {
"optimize-autoloader": true
},
虽然我不知道为什么会这样。我有点假设启用优化器会导致缓存,但它似乎禁用了它。老实说,我不知道为什么会这样。如果其他人能比我更好地解释这一点,那么我会投票赞成你的答案。