- Adds session support
- Renames Queue to Daemon - Updates router methods
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
namespace MailPoet\Config;
|
||||
|
||||
use MailPoet\Queue\Queue;
|
||||
use MailPoet\Queue\Daemon;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
|
||||
@@ -33,7 +33,7 @@ class PublicAPI {
|
||||
}
|
||||
|
||||
function queue() {
|
||||
$queue = new Queue($this->payload);
|
||||
$queue = new Daemon($this->payload);
|
||||
if(method_exists($queue, $this->action)) {
|
||||
call_user_func(
|
||||
array(
|
||||
|
@@ -8,7 +8,7 @@ require_once(ABSPATH . 'wp-includes/pluggable.php');
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
|
||||
class Queue {
|
||||
class Daemon {
|
||||
function __construct($payload = array()) {
|
||||
set_time_limit(0);
|
||||
ignore_user_abort();
|
||||
@@ -18,9 +18,10 @@ class Queue {
|
||||
}
|
||||
|
||||
function start() {
|
||||
if(!isset($this->payload['token'])) {
|
||||
$this->abortWithError('missing token');
|
||||
if(!isset($this->payload['session'])) {
|
||||
$this->abortWithError('missing session ID');
|
||||
}
|
||||
$this->manageSession('start');
|
||||
$queue = $this->queue;
|
||||
$queueData = $this->queueData;
|
||||
if(!$queue) {
|
||||
@@ -29,33 +30,30 @@ class Queue {
|
||||
$queue->value = serialize(array('status' => 'stopped'));
|
||||
$queue->save();
|
||||
}
|
||||
if(!preg_match('!stopped|paused!', $queueData['status'])
|
||||
) {
|
||||
if($queueData['status'] !== 'started') {
|
||||
$_SESSION['queue'] = 'started';
|
||||
$queueData = array(
|
||||
'status' => 'started',
|
||||
'token' => $this->refreshedToken,
|
||||
'executionCounter' => ($queueData['status'] === 'paused') ?
|
||||
$queueData['executionCounter']
|
||||
: 0,
|
||||
'log' => array(
|
||||
'token' => $this->payload['token'],
|
||||
'message' => 'started'
|
||||
)
|
||||
: 0
|
||||
);
|
||||
$_SESSION['queue'] = array('result' => true);
|
||||
$this->manageSession('end');
|
||||
$queue->value = serialize($queueData);
|
||||
$queue->save();
|
||||
$this->callSelf();
|
||||
} else {
|
||||
$queueData['log'] = array(
|
||||
'token' => $this->payload['token'],
|
||||
'status' => 'already started'
|
||||
$_SESSION['queue'] = array(
|
||||
'result' => false,
|
||||
'error' => 'already started'
|
||||
);
|
||||
$queue->value = serialize($queueData);
|
||||
$queue->save();
|
||||
}
|
||||
$this->manageSession('end');
|
||||
}
|
||||
|
||||
function process() {
|
||||
function run() {
|
||||
if(!$this->queue || $this->queueData['status'] !== 'started') {
|
||||
$this->abortWithError('not running');
|
||||
}
|
||||
@@ -88,7 +86,7 @@ class Queue {
|
||||
);
|
||||
wp_remote_get(
|
||||
site_url() .
|
||||
'/?mailpoet-api§ion=queue&action=process&payload=' . urlencode($payload),
|
||||
'/?mailpoet-api§ion=queue&action=run&payload=' . urlencode($payload),
|
||||
$args
|
||||
);
|
||||
exit;
|
||||
@@ -122,4 +120,19 @@ class Queue {
|
||||
function refreshToken() {
|
||||
return Security::generateRandomString(5);
|
||||
}
|
||||
|
||||
function manageSession($action) {
|
||||
switch ($action) {
|
||||
case 'start':
|
||||
if(session_id()) {
|
||||
session_write_close();
|
||||
}
|
||||
session_id($this->payload['session']);
|
||||
session_start();
|
||||
break;
|
||||
case 'end':
|
||||
session_write_close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
@@ -4,7 +4,6 @@ namespace MailPoet\Queue;
|
||||
use Carbon\Carbon;
|
||||
use MailPoet\Config\Env;
|
||||
use MailPoet\Models\Setting;
|
||||
use MailPoet\Util\Security;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
|
||||
@@ -21,7 +20,8 @@ class Supervisor {
|
||||
} else {
|
||||
if(!$this->forceStart && ($this->queueData['status'] === 'paused' ||
|
||||
$this->queueData['status'] === 'stopped'
|
||||
)) {
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
$currentTime = Carbon::now('UTC');
|
||||
@@ -39,14 +39,16 @@ class Supervisor {
|
||||
}
|
||||
|
||||
function startQueue() {
|
||||
if(!session_id()) session_start();
|
||||
$sessionId = session_id();
|
||||
session_write_close();
|
||||
$args = array(
|
||||
'timeout' => 1,
|
||||
'user-agent' => 'MailPoet (www.mailpoet.com)'
|
||||
);
|
||||
$token = Security::generateRandomString(5);
|
||||
$payload = json_encode(
|
||||
array(
|
||||
'token' => $token
|
||||
'session' => $sessionId
|
||||
)
|
||||
);
|
||||
wp_remote_get(
|
||||
@@ -55,8 +57,11 @@ class Supervisor {
|
||||
urlencode($payload),
|
||||
$args
|
||||
);
|
||||
list ($queue, $queueData) = $this->getQueue();
|
||||
return ($queueData && $queueData['token'] === $token) ? true : false;
|
||||
session_start();
|
||||
$queueStatus = $_SESSION['queue'];
|
||||
unset($_SESSION['queue']);
|
||||
session_write_close();
|
||||
return $queueStatus;
|
||||
}
|
||||
|
||||
function getQueue() {
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace MailPoet\Router;
|
||||
|
||||
use MailPoet\Queue\Daemon;
|
||||
use MailPoet\Queue\Supervisor;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
@@ -17,35 +18,27 @@ class Queue {
|
||||
);
|
||||
}
|
||||
|
||||
function pause() {
|
||||
wp_send_json(
|
||||
array(
|
||||
'result' => ($this->updateQueueStatus('paused') ?
|
||||
true :
|
||||
false
|
||||
)
|
||||
)
|
||||
);
|
||||
function update($data) {
|
||||
switch ($data['action']) {
|
||||
case 'stop':
|
||||
$status = 'stopped';
|
||||
break;
|
||||
default:
|
||||
$status = 'paused';
|
||||
break;
|
||||
}
|
||||
|
||||
function stop() {
|
||||
wp_send_json(
|
||||
array(
|
||||
'result' => ($this->updateQueueStatus('stopped') ?
|
||||
true :
|
||||
false
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private function updateQueueStatus($status) {
|
||||
$queue = new \MailPoet\Queue\Queue();
|
||||
$queue = new Daemon();
|
||||
if(!$queue->queue || $queue->queueData['status'] !== 'started') {
|
||||
return false;
|
||||
}
|
||||
$result = false;
|
||||
} else {
|
||||
$queue->queueData['status'] = $status;
|
||||
$queue->queue->value = serialize($queue->queueData);
|
||||
return $queue->queue->save();
|
||||
$result = $queue->queue->save();
|
||||
}
|
||||
wp_send_json(
|
||||
array(
|
||||
'result' => $result
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user