From a08339059b06bcfb673b13a380b6f199abfb5983 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sun, 5 Jun 2016 14:19:07 -0400 Subject: Improve background workers --- app/Core/Http/Client.php | 43 +++++++++++++++++++++++++++++++++++++++++-- app/Core/Queue/JobHandler.php | 21 ++++++++++++++++++++- app/Job/HttpAsyncJob.php | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 app/Job/HttpAsyncJob.php (limited to 'app') diff --git a/app/Core/Http/Client.php b/app/Core/Http/Client.php index 12b0a1cb..16e423dc 100644 --- a/app/Core/Http/Client.php +++ b/app/Core/Http/Client.php @@ -3,6 +3,7 @@ namespace Kanboard\Core\Http; use Kanboard\Core\Base; +use Kanboard\Job\HttpAsyncJob; /** * HTTP client @@ -79,6 +80,24 @@ class Client extends Base ); } + /** + * Send a POST HTTP request encoded in JSON (Fire and forget) + * + * @access public + * @param string $url + * @param array $data + * @param string[] $headers + */ + public function postJsonAsync($url, array $data, array $headers = array()) + { + $this->queueManager->push(HttpAsyncJob::getInstance($this->container)->withParams( + 'POST', + $url, + json_encode($data), + array_merge(array('Content-type: application/json'), $headers) + )); + } + /** * Send a POST HTTP request encoded in www-form-urlencoded * @@ -98,22 +117,41 @@ class Client extends Base ); } + /** + * Send a POST HTTP request encoded in www-form-urlencoded (fire and forget) + * + * @access public + * @param string $url + * @param array $data + * @param string[] $headers + */ + public function postFormAsync($url, array $data, array $headers = array()) + { + $this->queueManager->push(HttpAsyncJob::getInstance($this->container)->withParams( + 'POST', + $url, + http_build_query($data), + array_merge(array('Content-type: application/x-www-form-urlencoded'), $headers) + )); + } + /** * Make the HTTP request * - * @access private + * @access public * @param string $method * @param string $url * @param string $content * @param string[] $headers * @return string */ - private function doRequest($method, $url, $content, array $headers) + public function doRequest($method, $url, $content, array $headers) { if (empty($url)) { return ''; } + $startTime = microtime(true); $stream = @fopen(trim($url), 'r', false, stream_context_create($this->getContext($method, $content, $headers))); $response = ''; @@ -128,6 +166,7 @@ class Client extends Base $this->logger->debug('HttpClient: payload='.$content); $this->logger->debug('HttpClient: metadata='.var_export(@stream_get_meta_data($stream), true)); $this->logger->debug('HttpClient: response='.$response); + $this->logger->debug('HttpClient: executionTime='.(microtime(true) - $startTime)); } return $response; diff --git a/app/Core/Queue/JobHandler.php b/app/Core/Queue/JobHandler.php index a2c4a2c7..f8736cce 100644 --- a/app/Core/Queue/JobHandler.php +++ b/app/Core/Queue/JobHandler.php @@ -26,6 +26,7 @@ class JobHandler extends Base return new Job(array( 'class' => get_class($job), 'params' => $job->getJobParams(), + 'user_id' => $this->userSession->getId(), )); } @@ -39,12 +40,30 @@ class JobHandler extends Base { $payload = $job->getBody(); $className = $payload['class']; + $this->prepareJobSession($payload['user_id']); if (DEBUG) { - $this->logger->debug(__METHOD__.' Received job => '.$className); + $this->logger->debug(__METHOD__.' Received job => '.$className.' ('.getmypid().')'); } $worker = new $className($this->container); call_user_func_array(array($worker, 'execute'), $payload['params']); } + + /** + * Create the session for the job + * + * @access protected + * @param integer $user_id + */ + protected function prepareJobSession($user_id) + { + $session = array(); + $this->sessionStorage->setStorage($session); + + if ($user_id > 0) { + $user = $this->userModel->getById($user_id); + $this->userSession->initialize($user); + } + } } diff --git a/app/Job/HttpAsyncJob.php b/app/Job/HttpAsyncJob.php new file mode 100644 index 00000000..9e5cf107 --- /dev/null +++ b/app/Job/HttpAsyncJob.php @@ -0,0 +1,43 @@ +jobParams = array($method, $url, $content, $headers); + return $this; + } + + /** + * Set job parameters + * + * @access public + * @param string $method + * @param string $url + * @param string $content + * @param array $headers + * @return $this + */ + public function execute($method, $url, $content, array $headers) + { + $this->httpClient->doRequest($method, $url, $content, $headers); + } +} -- cgit v1.2.3