diff --git a/README.md b/README.md index 1b71bc4e..eea9a054 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Arsse has the following requirements: - A Web server; example configuration currently exists for: - nginx - Apache 2 -- PHP 7.0 or newer with the following extensions: +- PHP 7.0.7 or newer with the following extensions: - [intl](http://php.net/manual/en/book.intl.php) - [json](http://php.net/manual/en/book.json.php) - [hash](http://php.net/manual/en/book.hash.php) diff --git a/lib/Service/Curl/Driver.php b/lib/Service/Curl/Driver.php new file mode 100644 index 00000000..a1f25f5f --- /dev/null +++ b/lib/Service/Curl/Driver.php @@ -0,0 +1,72 @@ +msg("Driver.Service.Curl.Name"); + } + + static function requirementsMet(): bool { + return extension_loaded("curl"); + } + + function __construct() { + //default curl options for individual requests + $this->options = [ + \CURLOPT_URL => Data::$serviceCurlBase."index.php/apps/news/api/v1-2/feeds/update", + \CURLOPT_CUSTOMREQUEST => "GET", + \CURLOPT_FAILONERROR => false, + \CURLOPT_FOLLOWLOCATION => false, + \CURLOPT_FORBID_REUSE => false, + \CURLOPT_CONNECTTIMEOUT => 20, + \CURLOPT_DNS_CACHE_TIMEOUT => 360, // FIXME: this should probably be twice the update-check interval so that the DNS cache is always in memory + \CURLOPT_PROTOCOLS => \CURLPROTO_HTTP | \CURLPROTO_HTTPS, + \CURLOPT_DEFAULT_PROTOCOL => "https", + \CURLOPT_USERAGENT => Data::$conf->fetchUserAgentString, + \CURLMOPT_MAX_HOST_CONNECTIONS => Data::$conf->serviceQueueWidth, + \CURLOPT_HTTPHEADER => [ + 'Accept: application/json', + 'Content-Type: application/json', + ], + \CURLOPT_HEADER => false, + ]; + // start an async session + $this->queue = curl_multi_init(); + // enable pipelining + curl_multi_setopt($this->queue, \CURLMOPT_PIPELINING, 1); + } + + function qeueue(int ...$feeds): int { + foreach($feeds as $id) { + $h = curl_init(); + curl_setopt($h, \CURLOPT_POSTFIELDS, json_encode(['userId' => "", 'feedId' => $id])); + $this->handles[] = $h; + curl_multi_add_handle($this->queue, $h); + } + return sizeof($this->handles); + } + + function exec(): int { + $active = 0; + do { + curl_multi_exec($this->queue, $active); + curl_multi_select($this->queue); + } while ($active > 0); + return Data::$conf->serviceQueueWidth - $active; + } + + function clean(): bool { + foreach($this->handles as $h) { + curl_multi_remove_handle($this->queue, $h); + curl_close($h); + } + $this->handles = []; + return true; + } +} \ No newline at end of file