对于任何有兴趣的人,我想我可以为这个问题提供一些启示。当设置了var / .regenerate标志并且多个进程/请求尝试清理生成的文件时,这似乎是\ Magento \ Framework \ Code \ GeneratedFiles :: cleanGeneratedFiles中的并发(争用条件)问题。
启用cron以及使用use_separate_process配置的许多cron组时,更可能发生这种情况。当多个进程试图清除同一进程时,FileIterator失败,并显示以下类似的不同消息:FilesystemIterator::__construct(/Users/adrianmartinez/Sites/r2-project-develop-b2b/environments/2-2-develop-b2b/magento/generated/code): failed to open dir: No such file or directory.
将$this->write->delete(self::REGENERATE_FLAG);
标志存在检查后,将调用移至即可解决问题,因为第一个到达的进程将其自身标记为负责清理文件。
我在这里留下了有关如何复制问题的演示视频:https :
//youtu.be/9-X1cIIY7y8
和用于它的脚本:
#!/bin/bash
# \Magento\Framework\Code\GeneratedFiles has a concurrency problem
# Create regenerate flag and launch parallel commands that try to regenerate at the same time
# This is a real case, cron:run launches stand alone processes in parallel
# Created by magento composer installer upon code install or module enable/disable
touch var/.regenerate
# Launch parallel commands
# Error differs each execution, sometimes it even works
bin/magento cron:run --group=ddg_automation --bootstrap=standaloneProcessStarted=1 2>&1 &
bin/magento cron:run --group=index --bootstrap=standaloneProcessStarted=1 2>&1 &
wait
echo "All done"
setup:upgrade
则缓存将自动禁用