Skip to content

Commit e3d897e

Browse files
Merge pull request #4 from webscale-networks/scheduled-full-cache-flush
Implemented: New feature to schedule cache flush by cron
2 parents 9529f9c + d4425f5 commit e3d897e

File tree

23 files changed

+701
-79
lines changed

23 files changed

+701
-79
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
/**
3+
* Copyright © Webscale. All rights reserved.
4+
* See LICENSE for license details.
5+
*/
6+
7+
namespace Webscale\Varnish\Block\Adminhtml\Form\Renderer\Config;
8+
9+
use Magento\Framework\View\Element\AbstractBlock;
10+
use Magento\Config\Model\Config\CommentInterface;
11+
use Magento\Framework\View\Element\Context;
12+
use Webscale\Varnish\Helper\Config;
13+
14+
class ScheduleEveryFieldComment extends AbstractBlock implements CommentInterface
15+
{
16+
/**
17+
* @param Context $context
18+
* @param array $data
19+
* @param Config $config
20+
*/
21+
public function __construct(
22+
Context $context,
23+
Config $config
24+
) {
25+
$this->config = $config;
26+
27+
parent::__construct($context);
28+
}
29+
30+
/**
31+
* @param $elementValue
32+
* @return string
33+
*/
34+
public function getCommentText($elementValue)
35+
{
36+
return 'Cron Expression: <span style="color:grey;">none</span>';
37+
}
38+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* Copyright © Webscale. All rights reserved.
4+
* See LICENSE for license details.
5+
*/
6+
7+
namespace Webscale\Varnish\Block\Adminhtml\Form\Renderer\Config;
8+
9+
use Magento\Config\Block\System\Config\Form\Field;
10+
use Magento\Backend\Block\Template\Context;
11+
use Magento\Framework\Data\Form\Element\AbstractElement;
12+
use Magento\Framework\Data\Form\Element\Select;
13+
14+
class ScheduleEveryFieldConfig extends Field
15+
{
16+
public function __construct(
17+
Context $context,
18+
Select $select
19+
) {
20+
$this->select = $select;
21+
22+
parent::__construct($context);
23+
}
24+
25+
/**
26+
* @param AbstractElement $element
27+
* @return string
28+
*/
29+
protected function _getElementHtml(AbstractElement $element) {
30+
$name = $element->getName();
31+
32+
$element->setStyle('width: 100px; margin-right: 20px;')->setName($name . '[]');
33+
34+
if ($element->getValue()) {
35+
$values = explode(',', $element->getValue());
36+
} else {
37+
$values = [];
38+
}
39+
40+
$field = $element->setValue(isset($values[0]) ? $values[0] : null)->getElementHtml();
41+
42+
$units = $this->select->setName($name . '[]')
43+
->setStyle('width: 142px;')
44+
->setForm($element->getForm())
45+
->setValues([
46+
['value' => 'min', 'label' => 'minute(s)'],
47+
['value' => 'hour', 'label' => 'hour(s)']
48+
])
49+
->setId('webscale_varnish_flush_cache_schedule_time')
50+
->setValue(isset($values[1]) ? $values[1] : null)
51+
->getElementHtml();
52+
53+
return '<div style="float: left;">' . $field . '</div>'
54+
. '<div style="float: left;">' . $units . '</div>'
55+
. '<div style="clear: both"></div>';
56+
}
57+
}

Block/System/Config/Scheduled.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
/**
3+
* Copyright © Webscale. All rights reserved.
4+
* See LICENSE for license details.
5+
*/
6+
7+
namespace Webscale\Varnish\Block\System\Config;
8+
9+
/**
10+
* @SuppressWarnings(PHPMD.CamelCaseMethodName)
11+
*/
12+
class Scheduled extends \Webscale\Varnish\Block\System\Config\SettingsAbstract
13+
{
14+
/**
15+
* Return header comment part of html for fieldset
16+
*
17+
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
18+
* @return string
19+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
20+
*/
21+
protected function _getHeaderCommentHtml($element): string
22+
{
23+
return $this->getCacheConfigMessage() . $this->getScheduledConfigMessage();
24+
}
25+
26+
/**
27+
* Check if account and application is configured
28+
*
29+
* @return string
30+
*/
31+
private function getScheduledConfigMessage(): string
32+
{
33+
return $this->getMessageWrapper(
34+
__('Enabling this feature will disable partial cache invalidation.' .
35+
' Full varnish cache flush will be executed instead, according to the cron expression configured below.'
36+
), 'warning'
37+
);
38+
}
39+
}

Block/System/Config/Settings.php

Lines changed: 2 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -6,54 +6,17 @@
66

77
namespace Webscale\Varnish\Block\System\Config;
88

9-
use Webscale\Varnish\Helper\Config;
10-
use Magento\Backend\Block\Context;
11-
use Magento\Backend\Model\Auth\Session;
12-
use Magento\Config\Block\System\Config\Form\Fieldset;
13-
use Magento\Framework\View\Helper\Js;
14-
use Magento\Backend\Model\UrlInterface;
159
use Magento\PageCache\Model\Config as CacheConfig;
16-
use Magento\Framework\Data\Form\Element\AbstractElement;
1710

1811
/**
1912
* @SuppressWarnings(PHPMD.CamelCaseMethodName)
2013
*/
21-
class Settings extends Fieldset
14+
class Settings extends \Webscale\Varnish\Block\System\Config\SettingsAbstract
2215
{
23-
/**
24-
* @var Config $config
25-
*/
26-
protected $config;
27-
28-
/**
29-
* @param Context $context
30-
* @param Session $authSession
31-
* @param Js $jsHelper
32-
* @param Config $config
33-
* @param UrlInterface $urlBuilder
34-
* @param CacheConfig $cacheConfig
35-
* @param array $data
36-
*/
37-
public function __construct(
38-
Context $context,
39-
Session $authSession,
40-
Js $jsHelper,
41-
Config $config,
42-
UrlInterface $urlBuilder,
43-
CacheConfig $cacheConfig,
44-
array $data = []
45-
) {
46-
$this->config = $config;
47-
$this->urlBuilder = $urlBuilder;
48-
$this->cacheConfig = $cacheConfig;
49-
50-
parent::__construct($context, $authSession, $jsHelper, $data);
51-
}
52-
5316
/**
5417
* Return header comment part of html for fieldset
5518
*
56-
* @param AbstractElement $element
19+
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
5720
* @return string
5821
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
5922
*/
@@ -105,22 +68,4 @@ private function getApplicationConfigMessage(): string
10568

10669
return '';
10770
}
108-
109-
/**
110-
* Get message wrapper
111-
*
112-
* @param string $message
113-
* @param string $severity
114-
* @return string
115-
*/
116-
private function getMessageWrapper(string $message = '', string $severity = 'notice'): string
117-
{
118-
$html = '<div style="padding:10px;"><div class="messages">';
119-
$html .= '<div class="message message-' . $severity . ' ' . $severity . '" style="margin-bottom: 0;">';
120-
$html .= '<div data-ui-id="messages-message-' . $severity . '">';
121-
$html .= $message;
122-
$html .= '</div></div></div></div>';
123-
124-
return $html;
125-
}
12671
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
/**
3+
* Copyright © Webscale. All rights reserved.
4+
* See LICENSE for license details.
5+
*/
6+
7+
namespace Webscale\Varnish\Block\System\Config;
8+
9+
use Magento\Backend\Block\Context;
10+
use Magento\Backend\Model\Auth\Session;
11+
use Magento\Backend\Model\UrlInterface;
12+
use Magento\Config\Block\System\Config\Form\Fieldset;
13+
use Magento\Framework\View\Helper\Js;
14+
use Magento\PageCache\Model\Config as CacheConfig;
15+
use Webscale\Varnish\Helper\Config;
16+
17+
abstract class SettingsAbstract extends Fieldset
18+
{
19+
/**
20+
* @var Config $config
21+
*/
22+
protected $config;
23+
24+
/**
25+
* @param Context $context
26+
* @param Session $authSession
27+
* @param Js $jsHelper
28+
* @param Config $config
29+
* @param UrlInterface $urlBuilder
30+
* @param CacheConfig $cacheConfig
31+
* @param array $data
32+
*/
33+
public function __construct(
34+
Context $context,
35+
Session $authSession,
36+
Js $jsHelper,
37+
Config $config,
38+
UrlInterface $urlBuilder,
39+
CacheConfig $cacheConfig
40+
)
41+
{
42+
$this->config = $config;
43+
$this->urlBuilder = $urlBuilder;
44+
$this->cacheConfig = $cacheConfig;
45+
46+
parent::__construct($context, $authSession, $jsHelper);
47+
}
48+
49+
/**
50+
* Get message wrapper
51+
*
52+
* @param string $message
53+
* @param string $severity
54+
* @return string
55+
*/
56+
public function getMessageWrapper(string $message = '', string $severity = 'notice'): string
57+
{
58+
$html = '<div style="padding:10px;"><div class="messages">';
59+
$html .= '<div class="message message-' . $severity . ' ' . $severity . '" style="margin-bottom: 0;">';
60+
$html .= '<div data-ui-id="messages-message-' . $severity . '">';
61+
$html .= $message;
62+
$html .= '</div></div></div></div>';
63+
64+
return $html;
65+
}
66+
}

Cron/CacheFlushScheduled.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
/**
3+
* Copyright © Webscale. All rights reserved.
4+
* See LICENSE for license details.
5+
*/
6+
7+
namespace Webscale\Varnish\Cron;
8+
9+
use Webscale\Varnish\Helper\Config;
10+
use Magento\PageCache\Model\Config as CacheConfig;
11+
use Webscale\Varnish\Model\PurgeCache;
12+
13+
class CacheFlushScheduled
14+
{
15+
const EVENT_NAME = 'webscale_varnish_flush_all_scheduled';
16+
17+
/** @var Config $config */
18+
private $config;
19+
20+
/** @var CacheConfig $cacheConfig */
21+
private $cacheConfig;
22+
23+
/** @var PurgeCache $purgeCache */
24+
private $purgeCache;
25+
26+
/**
27+
* @param Config $config
28+
*/
29+
public function __construct(
30+
CacheConfig $cacheConfig,
31+
Config $config,
32+
PurgeCache $purgeCache
33+
) {
34+
$this->config = $config;
35+
$this->cacheConfig = $cacheConfig;
36+
$this->purgeCache = $purgeCache;
37+
}
38+
39+
/**
40+
* @return void
41+
*/
42+
public function execute() {
43+
try {
44+
if (
45+
$this->cacheConfig->getType() == CacheConfig::VARNISH
46+
&& $this->config->isAvailable()
47+
&& !empty($this->config->getCronExpression())
48+
) {
49+
$this->purgeCache->sendPurgeRequest(['tagsPattern' => ['.*'], 'event' => self::EVENT_NAME]);
50+
$this->config->log('Executed scheduled varnish cache flush.');
51+
}
52+
} catch (\Exception $e) {
53+
$this->config->log('Unable to execute scheduled varnish cache flush.');
54+
$this->config->log($e->getMessage() . PHP_EOL . $e->getTraceAsString(), 'critical');
55+
}
56+
57+
}
58+
}

Documentation/cache-events.png

201 KB
Loading
86 KB
Loading

0 commit comments

Comments
 (0)