[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/libraries/vendor/symfony/var-dumper/Server/ -> Connection.php (source)

   1  <?php
   2  
   3  /*
   4   * This file is part of the Symfony package.
   5   *
   6   * (c) Fabien Potencier <[email protected]>
   7   *
   8   * For the full copyright and license information, please view the LICENSE
   9   * file that was distributed with this source code.
  10   */
  11  
  12  namespace Symfony\Component\VarDumper\Server;
  13  
  14  use Symfony\Component\VarDumper\Cloner\Data;
  15  use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface;
  16  
  17  /**
  18   * Forwards serialized Data clones to a server.
  19   *
  20   * @author Maxime Steinhausser <[email protected]>
  21   */
  22  class Connection
  23  {
  24      private $host;
  25      private $contextProviders;
  26  
  27      /**
  28       * @var resource|null
  29       */
  30      private $socket;
  31  
  32      /**
  33       * @param string                     $host             The server host
  34       * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name
  35       */
  36      public function __construct(string $host, array $contextProviders = [])
  37      {
  38          if (!str_contains($host, '://')) {
  39              $host = 'tcp://'.$host;
  40          }
  41  
  42          $this->host = $host;
  43          $this->contextProviders = $contextProviders;
  44      }
  45  
  46      public function getContextProviders(): array
  47      {
  48          return $this->contextProviders;
  49      }
  50  
  51      public function write(Data $data): bool
  52      {
  53          $socketIsFresh = !$this->socket;
  54          if (!$this->socket = $this->socket ?: $this->createSocket()) {
  55              return false;
  56          }
  57  
  58          $context = ['timestamp' => microtime(true)];
  59          foreach ($this->contextProviders as $name => $provider) {
  60              $context[$name] = $provider->getContext();
  61          }
  62          $context = array_filter($context);
  63          $encodedPayload = base64_encode(serialize([$data, $context]))."\n";
  64  
  65          set_error_handler([self::class, 'nullErrorHandler']);
  66          try {
  67              if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) {
  68                  return true;
  69              }
  70              if (!$socketIsFresh) {
  71                  stream_socket_shutdown($this->socket, \STREAM_SHUT_RDWR);
  72                  fclose($this->socket);
  73                  $this->socket = $this->createSocket();
  74              }
  75              if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) {
  76                  return true;
  77              }
  78          } finally {
  79              restore_error_handler();
  80          }
  81  
  82          return false;
  83      }
  84  
  85      private static function nullErrorHandler(int $t, string $m)
  86      {
  87          // no-op
  88      }
  89  
  90      private function createSocket()
  91      {
  92          set_error_handler([self::class, 'nullErrorHandler']);
  93          try {
  94              return stream_socket_client($this->host, $errno, $errstr, 3, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT);
  95          } finally {
  96              restore_error_handler();
  97          }
  98      }
  99  }


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer