vQmod无法写入OpenCart上的vqcache目录

vQmod无法写入OpenCart上的vqcache目录,opencart,iis-8,vqmod,Opencart,Iis 8,Vqmod,有人能解释一下为什么vQmod无法写入缓存文件,而是将一个名为vq2-C的空文件写入/vQmod/vqcache吗 环境 Windows Server 2012 普莱斯克面板12.5 PHP 5.3.2.9 MySQL 5.6.26 OpenCart 2.1.0.1 vQmod 2.6.1 问题 vQmod无法保存对/vQmod/vqcache/vq2-*.php的修改 在每次页面加载时,它应用/vqmod/xml/*.xml中指定的修改,并将名为vq2-C的空文件写入/vqmod/vqcach

有人能解释一下为什么vQmod无法写入缓存文件,而是将一个名为vq2-C的空文件写入/vQmod/vqcache吗

环境 Windows Server 2012 普莱斯克面板12.5 PHP 5.3.2.9 MySQL 5.6.26 OpenCart 2.1.0.1 vQmod 2.6.1

问题 vQmod无法保存对/vQmod/vqcache/vq2-*.php的修改

在每次页面加载时,它应用/vqmod/xml/*.xml中指定的修改,并将名为vq2-C的空文件写入/vqmod/vqcache

背景 受影响的网站是从另一个具有类似配置的Windows box迁移的

简而言之,旧服务器运行Plesk Panel 12.0,新服务器是Plesk 12.5,因此对软件版本进行了少量更新

这两个站点都运行在PHP5.3.2.9上,新服务器更严格地遵循OWASP的建议,因此禁用了更多的PHP函数,例如fopen_with_path

到目前为止的调查 再次运行vQmod安装程序会报告:vQmod已安装

文件权限 /vqmod/logs和/vqmod/vqcache具有修改权限,文件写入此处。权限通过Plesk面板应用,通过远程桌面检查,通过Plesk在web根目录上启用全局写入权限不会改变任何内容

日志 vQmod日志没有有用的信息,只记录了跳过的文件,例如VQModObject::parseMods-无法解析[catalog/language/english/module/featured.php]的路径(跳过)

没有生成php_error.log文件

失败的请求跟踪不会发现任何问题

测试 除了vqmod_opencart.xml和一个修改列_left.tpl的文件外,所有/vqmod/xml文件都已删除。这些修改已成功应用,但在/vqmod/vqcache中未生成缓存文件

如果我删除/vqmod/checked.cache和/vqmod/mods.cache,文件将在下一页加载时重新生成

vQmod版本-回滚到2.5.1,但问题仍然存在

其他注意事项 当启用一个特定的vQmod修改时,页面加载时间慢得令人无法接受(最多20秒)。修改将在父类别页面上显示子类别中的前4个产品。我还没有看过代码,但假设它对数据库的影响很大


在原始服务器上,页面加载时间小于2秒。我怀疑这与缓存问题有关,因为这似乎是一个权限问题。

我的问题是这样的,我后来发现问题与目录权限有关,在这种情况下,可能是移动造成的。将vqcache文件夹的权限递归设置为777。这对我很有效。

对不起,我应该早点更新

该问题与区分大小写的preg_替换有关

将vqmod.php的第120行从

$stripped_filename = preg_replace('~^' . preg_quote(self::getCwd(), '~i') . '~', '', $sourcePath)

表示已写入/vqmod/vqcache/vq2-*.php缓存文件,网站正常运行

详细解释请参见


我不认为preg_quote应该有I参数,但它在原始代码中,所以我保留了它。

vQmod开发人员接受了拉取请求。事实证明,preg_quote中的~i参数在v2.4.1中被错误引入
$stripped_filename = preg_replace('~^' . preg_quote(self::getCwd(), '~i') . '~i', '', $sourcePath);