| 
<?php
 namespace App;
 
 class ContentLoader implements ContentLoaderInterface
 {
 static private $instance;
 
 /**
 * Singleton pattern
 *
 * @return ContentLoader instance of ContentLoader class.
 */
 public static function getInstance(): self
 {
 if (null === self::$instance) {
 self::$instance = new self();
 }
 
 return self::$instance;
 }
 
 private $headers = [];
 
 /**
 * Set headers for all CURL requests.
 *
 * @param array $headers
 */
 public function setHeaders(array $headers): void
 {
 $this->headers = $headers;
 }
 
 /**
 * Get content for all URLs in $urlArray.
 *
 * @param array $urlArray
 *
 * @return array content of URLs
 */
 public function loadContent(array $urlArray): array
 {
 $curlHandlers = [];
 $multiHandler = curl_multi_init();
 foreach ($urlArray as $url) {
 $curlHandlers[$url] = $ch = curl_init($url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 foreach ($this->headers as $header) {
 curl_setopt($ch, CURLOPT_HEADER, $header);
 }
 curl_multi_add_handle($multiHandler, $ch);
 }
 
 do {
 $status = curl_multi_exec($multiHandler, $active);
 if ($active) {
 curl_multi_select($multiHandler);
 }
 } while ($active && $status === CURLM_OK);
 
 foreach ($curlHandlers as $ch) {
 curl_multi_remove_handle($multiHandler, $ch);
 }
 curl_multi_close($multiHandler);
 
 foreach ($curlHandlers as $url => $ch) {
 $curlHandlers[$url] = curl_multi_getcontent($ch);
 curl_close($ch);
 }
 
 return $curlHandlers;
 }
 }
 |