Upgrading/Installing Addon with Wincache Enabled Crashes XenForo

benFF

Active member
Affected version
2.2.8
When using Wincache as the config.php cache option, if you install/upgrade an add-on then XenForo will crash at the final step and stay crashed until you clear the Wincache usercache.

Checking the php_errors.log, the crash is caused by the cache not being flushed/updated and being invalid when xF tries to come back online.

The work around is to disable cache, do the upgrade, clear the Wincache usercache then re-enable it - but this is a right pain, so it would be nice if this could be done automatically as part of the install/upgrade routine (possibly only needs the wincache_ucache_clear function to be run).
 

benFF

Active member
CLI Search index rebuild crashes as well

Code:
An exception occurred: [ErrorException] [E_WARNING] array_key_exists() expects parameter 2 to be array, bool given in src\vendor\doctrine\cache\lib\Doctrine\Common\Cache\CacheProvider.php on line 98
#0 [internal function]: XF::handlePhpError(2, '[E_WARNING] arr...', 'W:\\HostingSpace...', 98, Array)
#1 src\vendor\doctrine\cache\lib\Doctrine\Common\Cache\CacheProvider.php(98): array_key_exists('xf[data_codeEve...', false)
#2 src\XF\DataRegistry.php(115): Doctrine\Common\Cache\CacheProvider->fetchMultiple(Array)
#3 src\XF\DataRegistry.php(83): XF\DataRegistry->readFromCache(Array, Array)
#4 src\XF\DataRegistry.php(228): XF\DataRegistry->get(Array)
#5 src\XF\App.php(1796): XF\DataRegistry->offsetGet('codeEventListen...')
#6 src\XF\Container.php(31): XF\App->XF\{closure}(Object(XF\Container))
#7 src\XF\App.php(1580): XF\Container->offsetGet('extension.liste...')
#8 src\XF\Container.php(31): XF\App->XF\{closure}(Object(XF\Container))
#9 src\XF\App.php(2839): XF\Container->offsetGet('extension')
#10 src\XF\App.php(2867): XF\App->extension()
#11 src\XF\App.php(1407): XF\App->extendClass('XF\\AddOn\\Manage...')
#12 src\XF\Container.php(31): XF\App->XF\{closure}(Object(XF\Container))
#13 src\XF\App.php(2323): XF\Container->offsetGet('addon.manager')
#14 src\XF\App.php(1895): XF\App->setupAddOnComposerAutoload()
#15 src\XF\Cli\App.php(25): XF\App->setup()
#16 src\XF.php(490): XF\Cli\App->setup(Array)
#17 src\XF\Cli\Runner.php(54): XF::setupApp('XF\\Cli\\App')
#18 cmd.php(15): XF\Cli\Runner->run()#19 {main}
 

Brogan

XenForo moderator
Staff member
Yes, but until the bug is resolved/this thread is responded to, to prevent the site from crashing, disable the cache.
 

benFF

Active member
Ah gotcha!

For day to day end user running it seems to be fine on production, I catch all the crashes when making admin changes on staging first :)
 

Jeremy P

XenForo developer
Staff member
It looks like this might actually be a bug in WinCache. According to the documentation, passing an array to win_ucache_get should give back an empty array when there are no matching items, but it seems to be returning false instead. I don't have a Windows environment handy to test with, but can you see if replacing line 80 of src/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php with the following line fixes this for you?

PHP:
        return wincache_ucache_get($keys) ?: [];

If so then we can include this as a work-around, but I would caution that WinCache seems like it may have been abandoned so it's probably worth looking into a different cache provider soon.
 

benFF

Active member
I don't have a Windows environment handy to test with, but can you see if replacing line 80 of src/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php with the following line fixes this for you?
Perfect! Thank you - that will save me so much time :)
If so then we can include this as a work-around, but I would caution that WinCache seems like it may have been abandoned so it's probably worth looking into a different cache provider soon.
Yes, there is still work going on bringing it to PHP 8 - but for now, I'm ok running 7.4 :)

thank you again!
 

XF Bug Bot

XenForo bug fixer bot
Staff member
Thank you for reporting this issue, it has now been resolved. We are aiming to include any changes that have been made in a future XF release (2.2.9).

Change log:
Work around an upstream issue in WinCache
There may be a delay before changes are rolled out to the XenForo Community.
 

Jeremy P

XenForo developer
Staff member
Oh is there an updated hashes file I can use, so I don't get the "modified file" errors now?
I'm reluctant to advise this officially, but you can edit src/addons/XF/hashes.json to update the sha256 hash of the file if it's especially bothersome.
 

benFF

Active member
2.2.9 didn't fix this.

Error:

Code:
An exception occurred: [ErrorException] [E_WARNING] array_key_exists() expects parameter 2 to be array, bool given in src\vendor\doctrine\cache\lib\Doctrine\Common\Cache\CacheProvider.php on line 98
#0 [internal function]: XF::handlePhpError(2, '[E_WARNING] arr...', 'W:\\HostingSpace...', 98, Array)
#1 src\vendor\doctrine\cache\lib\Doctrine\Common\Cache\CacheProvider.php(98): array_key_exists('xf[data_codeEve...', false)
#2 src\XF\DataRegistry.php(115): Doctrine\Common\Cache\CacheProvider->fetchMultiple(Array)
#3 src\XF\DataRegistry.php(83): XF\DataRegistry->readFromCache(Array, Array)
#4 src\XF\DataRegistry.php(228): XF\DataRegistry->get(Array)
#5 src\XF\App.php(1797): XF\DataRegistry->offsetGet('codeEventListen...')
#6 src\XF\Container.php(31): XF\App->XF\{closure}(Object(XF\Container))
#7 src\XF\App.php(1581): XF\Container->offsetGet('extension.liste...')
#8 src\XF\Container.php(31): XF\App->XF\{closure}(Object(XF\Container))
#9 src\XF\App.php(2840): XF\Container->offsetGet('extension')
#10 src\XF\App.php(2868): XF\App->extension()
#11 src\XF\App.php(1408): XF\App->extendClass('XF\\AddOn\\Manage...')
#12 src\XF\Container.php(31): XF\App->XF\{closure}(Object(XF\Container))
#13 src\XF\App.php(2324): XF\Container->offsetGet('addon.manager')
#14 src\XF\App.php(1896): XF\App->setupAddOnComposerAutoload()
#15 src\XF\Pub\App.php(93): XF\App->setup(Array)
#16 src\XF.php(497): XF\Pub\App->setup(Array)
#17 countryUpdate.php(11): XF::setupApp('XF\\Pub\\App')
#18 {main}

(countryUpdate.php is a file I am running in root to update a few things - the lines before and including the crash are)

PHP:
<?php

error_reporting(E_ALL & ~E_NOTICE);

/** @var  $fileDir */
$fileDir = __DIR__;

require($fileDir . '/src/XF.php');

XF::start($fileDir);
$app = XF::setupApp('XF\Pub\App'); #crashes here

Runs fine with Wincache disabled.
 

Jeremy P

XenForo developer
Staff member
Strange, testing locally shows that our patched class is loaded with exactly the same fix as above. I'll have to take a closer look, moving this back to open bugs for now.
 
Top