1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/reference/event/eventhttpconnection/setclosecallback.xml
2025-02-12 15:34:12 +03:00

195 lines
6.1 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 22583751fbfdaa3eaa41aeb6470d1343f5cb2c78 Maintainer: lex Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="eventhttpconnection.setclosecallback" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>EventHttpConnection::setCloseCallback</refname>
<refpurpose>Устанавливает callback-функцию при закрытии соединения</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier>
<type>void</type>
<methodname>EventHttpConnection::setCloseCallback</methodname>
<methodparam>
<type>callable</type>
<parameter>callback</parameter>
</methodparam>
<methodparam choice="opt">
<type>mixed</type>
<parameter>data</parameter>
</methodparam>
</methodsynopsis>
<para>
Устанавливает callback-функцию при закрытии соединения.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term>
<parameter>callback</parameter>
</term>
<listitem>
<para>
Устанавливает callback-функцию при закрытии соединения, которая должна
соответствовать прототипу:
</para>
<methodsynopsis>
<type>void</type>
<methodname>callback</methodname>
<methodparam
choice="opt">
<type>EventHttpConnection</type>
<parameter>conn</parameter>
<initializer>&null;</initializer>
</methodparam>
<methodparam
choice="opt">
<type>mixed</type>
<parameter>arg</parameter>
<initializer>&null;</initializer>
</methodparam>
</methodsynopsis>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.void;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>
Пример использования <methodname>EventHttpConnection::setCloseCallback</methodname></title>
<programlisting role="php">
<![CDATA[
<?php
/*
* Устанавливаем callback-функцию, при закрытии соединения
*
* Скрипт обрабатывает закрытые соединения, используя HTTP API.
*
* Использование:
* 1) Запустите сервер:
* $ php examples/http_closecb.php 4242
*
* 2) Запустите клиента в другом терминале. Наподобие Telnet
* Сессия должна выглядеть следующим образом:
*
* $ nc -t 127.0.0.1 4242
* GET / HTTP/1.0
* Connection: close
*
* Сервер выведет что-то похожее на следующее:
*
* HTTP/1.0 200 OK
* Content-Type: multipart/x-mixed-replace;boundary=boundarydonotcross
* Connection: close
*
* <html>
*
* 3) Завершите соединение с клиентом внезапно,
* то есть завершите процесс, или просто нажмите Ctrl-C
*
* 4) Проверьте, вызывается ли _close_callback.
* Скрипт должен вывести строку "_close_callback" стандартным выводом.
*
* 5) Проверьте, не имеет ли процесс сервера потерянных соединений,
* например с утилитой `lsof`.
*/
function _close_callback($conn)
{
echo __FUNCTION__, PHP_EOL;
}
function _http_default($req, $dummy)
{
$conn = $req->getConnection();
$conn->setCloseCallback('_close_callback', NULL);
/*
Включив Event::READ, мы защищаем сервер от незакрытых соединений.
Это особенность Libevent. Библиотека отключает события Event::READ для текущего соединения
и сервер не уведомляется о разорванных соединениях.
Таким образом, каждый раз, когда клиент прерывает соединение, мы получаем потерянное соединение.
Например, следующее является частью `lsof -p $PID | grep TCP` после того,
как клиент разорвал соединение:
57-php 15057 ruslan 6u unix 0xffff8802fb59c780 0t0 125187 socket
58:php 15057 ruslan 7u IPv4 125189 0t0 TCP *:4242 (LISTEN)
59:php 15057 ruslan 8u IPv4 124342 0t0 TCP localhost:4242->localhost:37375 (CLOSE_WAIT)
где $PID наш ID процесса.
Следующий блок кода исправляет такие потерянные соединения.
*/
$bev = $req->getBufferEvent();
$bev->enable(Event::READ);
// Мы должны явно это освободить. Смотрите
$bev->free(); // освобождаем
$req->addHeader(
'Content-Type',
'multipart/x-mixed-replace;boundary=boundarydonotcross',
EventHttpRequest::OUTPUT_HEADER
);
$buf = new EventBuffer();
$buf->add('<html>');
$req->sendReply(200, "OK");
$req->sendReplyChunk($buf);
}
$port = 4242;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Invalid port");
}
$base = new EventBase();
$http = new EventHttp($base);
$http->setDefaultCallback("_http_default", NULL);
$http->bind("0.0.0.0", $port);
$base->loop();
?>
]]>
</programlisting>
</example>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->