Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

CurlHandler.php

Zuletzt modifiziert: 09.10.2024, 12:57 - Dateigröße: 3.97 KiB


001  <?php
002  namespace GuzzleHttp\Ring\Client;
003   
004  use GuzzleHttp\Ring\Future\CompletedFutureArray;
005  use GuzzleHttp\Ring\Core;
006   
007  /**
008   * HTTP handler that uses cURL easy handles as a transport layer.
009   *
010   * Requires PHP 5.5+
011   *
012   * When using the CurlHandler, custom curl options can be specified as an
013   * associative array of curl option constants mapping to values in the
014   * **curl** key of the "client" key of the request.
015   */
016  class CurlHandler
017  {
018      /** @var callable */
019      private $factory;
020   
021      /** @var array Array of curl easy handles */
022      private $handles = [];
023   
024      /** @var array Array of owned curl easy handles */
025      private $ownedHandles = [];
026   
027      /** @var int Total number of idle handles to keep in cache */
028      private $maxHandles;
029   
030      /**
031       * Accepts an associative array of options:
032       *
033       * - factory: Optional callable factory used to create cURL handles.
034       *   The callable is passed a request hash when invoked, and returns an
035       *   array of the curl handle, headers resource, and body resource.
036       * - max_handles: Maximum number of idle handles (defaults to 5).
037       *
038       * @param array $options Array of options to use with the handler
039       */
040      public function __construct(array $options = [])
041      {
042          $this->handles = $this->ownedHandles = [];
043          $this->factory = isset($options['handle_factory'])
044              ? $options['handle_factory']
045              : new CurlFactory();
046          $this->maxHandles = isset($options['max_handles'])
047              ? $options['max_handles']
048              : 5;
049      }
050   
051      public function __destruct()
052      {
053          foreach ($this->handles as $handle) {
054              if (is_resource($handle)) {
055                  curl_close($handle);
056              }
057          }
058      }
059   
060      /**
061       * @param array $request
062       *
063       * @return CompletedFutureArray
064       */
065      public function __invoke(array $request)
066      {
067          return new CompletedFutureArray(
068              $this->_invokeAsArray($request)
069          );
070      }
071   
072      /**
073       * @internal
074       *
075       * @param array $request
076       *
077       * @return array
078       */
079      public function _invokeAsArray(array $request)
080      {
081          $factory = $this->factory;
082   
083          // Ensure headers are by reference. They're updated elsewhere.
084          $result = $factory($request, $this->checkoutEasyHandle());
085          $h = $result[0];
086          $hd =& $result[1];
087          $bd = $result[2];
088          Core::doSleep($request);
089          curl_exec($h);
090          $response = ['transfer_stats' => curl_getinfo($h)];
091          $response['curl']['error'] = curl_error($h);
092          $response['curl']['errno'] = curl_errno($h);
093          $response['transfer_stats'] = array_merge($response['transfer_stats'], $response['curl']);
094          $this->releaseEasyHandle($h);
095   
096          return CurlFactory::createResponse([$this, '_invokeAsArray'], $request, $response, $hd, $bd);
097      }
098   
099      private function checkoutEasyHandle()
100      {
101          // Find an unused handle in the cache
102          if (false !== ($key = array_search(false, $this->ownedHandles, true))) {
103              $this->ownedHandles[$key] = true;
104              return $this->handles[$key];
105          }
106   
107          // Add a new handle
108          $handle = curl_init();
109          $id = (int) $handle;
110          $this->handles[$id] = $handle;
111          $this->ownedHandles[$id] = true;
112   
113          return $handle;
114      }
115   
116      private function releaseEasyHandle($handle)
117      {
118          $id = (int) $handle;
119          if (count($this->ownedHandles) > $this->maxHandles) {
120              curl_close($this->handles[$id]);
121              unset($this->handles[$id], $this->ownedHandles[$id]);
122          } else {
123              // curl_reset doesn't clear these out for some reason
124              static $unsetValues = [
125                  CURLOPT_HEADERFUNCTION   => null,
126                  CURLOPT_WRITEFUNCTION    => null,
127                  CURLOPT_READFUNCTION     => null,
128                  CURLOPT_PROGRESSFUNCTION => null,
129              ];
130              curl_setopt_array($handle, $unsetValues);
131              curl_reset($handle);
132              $this->ownedHandles[$id] = false;
133          }
134      }
135  }
136