Инструменты пользователя

Инструменты сайта


rowset-definition

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
rowset-definition [2026/02/25 20:12] – [Раздел autoexec] madminrowset-definition [2026/02/26 14:15] (текущий) – [Раздел autoexec] madmin
Строка 369: Строка 369:
   * На входе в сервис автоматически приходит параметр timeout - время выполнения в секундах. Под него сервис должен подстроиться   * На входе в сервис автоматически приходит параметр timeout - время выполнения в секундах. Под него сервис должен подстроиться
   * Необходимо предотвратить остановку работы PHP скрипта Apache по max_execution_time, для этого max_execution_time должно быть больше, чем timeout   * Необходимо предотвратить остановку работы PHP скрипта Apache по max_execution_time, для этого max_execution_time должно быть больше, чем timeout
-  * Необходимо останавливать PHP скрипт при разрыве соединения с клиентом. Для этого надо тестировать наличие соединения, пытаясь отправить клиенту сообщения, пустое сообщение достаточно для тестирования соединения.+  * Необходимо останавливать PHP скрипт при разрыве соединения с клиентом. Для этого надо тестировать наличие соединения, пытаясь отправить клиенту сообщения. Пустое сообщение достаточно для тестирования соединения.
   * При возникновении события надо послать клиенту 1 и остановить выполнение PHP скрипта   * При возникновении события надо послать клиенту 1 и остановить выполнение PHP скрипта
   * При превышении времени необходимо остановить работу PHP скрипта, ничего не отправляя клиенту   * При превышении времени необходимо остановить работу PHP скрипта, ничего не отправляя клиенту
 +
 +=== mode=socket ===
 +В этом режиме запрос вызывается по указанию сервера, через WebSocket.
 +Для реализации такого способа необходим сервер, поддерживающий socket соединение, технологии PHP+Apache недостаточно. Например, на PHP такой сервер можно написать на Ratchet, но это будет отдельный сервис, работающий независимо от Apache.
 +
 +<code>
 +  <autoexec
 +    enabled="1|0"
 +    request="<имя запроса>"
 +    mode="socket"
 +    url="<url socket соединения>"
 +    pingtimeout="<периодичность отправки ping запросов для проверки соединения, в секундах>"
 +    ignoreerror="0|1"
 +  >
 +    <param name="<имя параметра>" value="<значение параметра>"/>
 +    ...
 +    <param name="<имя параметра>" value="<значение параметра>"/>
 +  </autoexec>
 +</code>
 +  * url - адрес socket соединения
 +  * pingtimeout - если параметр задан, то клиент будет периодически посылать сообщение ping серверу, для проверки соединения
 +  * параметры param - добавляются в url polling запроса
 +
 +Пример реализации WebSocket сервера на Ratchet
 +<code>
 +<?php
 +require_once('.lss-init.php');
 +$path=pathRootConcat(
 + getCfg('path.root.extlib'),
 + 'Ratchet',
 + 'autoload.php'
 +);
 +require_once($path);
 +
 +use Ratchet\MessageComponentInterface;
 +use Ratchet\ConnectionInterface;
 +use Ratchet\Http\HttpServer;
 +use Ratchet\WebSocket\WsServer;
 +use Ratchet\Server\IoServer;
 +use React\EventLoop\Factory;
 +
 +class MyServer implements MessageComponentInterface {
 +    protected $clients;
 +
 +    public function __construct() {
 + $this->clients = new \SplObjectStorage;
 +    }
 +
 +    public function onOpen(ConnectionInterface $conn) {
 + $queryString = $conn->httpRequest->getUri()->getQuery();
 + parse_str($queryString, $info);
 + $conn->info=$info;
 + $this->clients->attach($conn);
 + echo '- open'."\n";
 +    }
 +
 +    public function onClose(ConnectionInterface $conn) {
 + $this->clients->detach($conn);
 + echo '- close'."\n";
 +    }
 +
 +    public function onMessage(ConnectionInterface $from, $msg) {
 + if ($msg=='ping') {
 + $from->send('pong');
 + echo '- ping - pong'."\n";
 + }
 + }
 +
 +    public function onError(ConnectionInterface $conn, \Exception $e) {
 + $conn->close();
 + echo '- error'."\n";
 +    }
 +
 +    public function broadcast($msg) {
 + echo '- отправка сообщений всем пользователям'."\n";
 + foreach ($this->clients as $client) {
 + $client->send($msg);
 + }
 +    }
 +}
 +
 +$loop = Factory::create();
 +$serverComponent = new MyServer();
 +
 +$loop->addPeriodicTimer(5, function() use ($serverComponent) {
 +    $serverComponent->broadcast('1');
 +});
 +
 +$webSock = new React\Socket\Server('0.0.0.0:8080', $loop);
 +
 +$server = new Ratchet\Server\IoServer(
 +    new HttpServer(
 +        new WsServer($serverComponent)
 +    ),
 +    $webSock,
 +    $loop
 +);
 +
 +echo "\n".'WebSocket запущен'."\n";
 +$loop->run();
 +</code>
rowset-definition.1772039561.txt.gz · Последнее изменение: 2026/02/25 20:12 — madmin

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki