This repository has been archived by the owner on Jan 29, 2020. It is now read-only.
/
IgnoreUserAbort.php
118 lines (99 loc) · 5.02 KB
/
IgnoreUserAbort.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Cache\Storage\Plugin;
use Zend\Cache\Exception;
use Zend\Cache\Storage\Event;
use Zend\EventManager\EventManagerInterface;
class IgnoreUserAbort extends AbstractPlugin
{
/**
* The storage who activated ignore_user_abort.
*
* @var null|\Zend\Cache\Storage\StorageInterface
*/
protected $activatedTarget = null;
/**
* {@inheritDoc}
*/
public function attach(EventManagerInterface $events, $priority = 1)
{
$cbOnBefore = array($this, 'onBefore');
$cbOnAfter = array($this, 'onAfter');
$this->listeners[] = $events->attach('setItem.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('setItem.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('setItem.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('setItems.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('setItems.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('setItems.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('addItem.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('addItem.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('addItem.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('addItems.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('addItems.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('addItems.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('replaceItem.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('replaceItem.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('replaceItem.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('replaceItems.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('replaceItems.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('replaceItems.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('checkAndSetItem.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('checkAndSetItem.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('checkAndSetItem.exception', $cbOnAfter, $priority);
// increment / decrement item(s)
$this->listeners[] = $events->attach('incrementItem.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('incrementItem.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('incrementItem.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('incrementItems.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('incrementItems.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('incrementItems.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('decrementItem.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('decrementItem.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('decrementItem.exception', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('decrementItems.pre', $cbOnBefore, $priority);
$this->listeners[] = $events->attach('decrementItems.post', $cbOnAfter, $priority);
$this->listeners[] = $events->attach('decrementItems.exception', $cbOnAfter, $priority);
}
/**
* Activate ignore_user_abort if not already done
* and save the target who activated it.
*
* @param Event $event
* @return void
*/
public function onBefore(Event $event)
{
if ($this->activatedTarget === null && !ignore_user_abort(true)) {
$this->activatedTarget = $event->getTarget();
}
}
/**
* Reset ignore_user_abort if it's activated and if it's the same target
* who activated it.
*
* If exit_on_abort is enabled and the connection has been aborted
* exit the script.
*
* @param Event $event
* @return void
*/
public function onAfter(Event $event)
{
if ($this->activatedTarget === $event->getTarget()) {
// exit if connection aborted
if ($this->getOptions()->getExitOnAbort() && connection_aborted()) {
exit;
}
// reset ignore_user_abort
ignore_user_abort(false);
// remove activated target
$this->activatedTarget = null;
}
}
}