1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/language/fibers.xml
2025-03-05 03:18:21 +03:00

104 lines
5.8 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: 376d3f9c2ef7fcd64d8b8503d552013acefb8b5b Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="language.fibers" xmlns="http://docbook.org/ns/docbook">
<title>Fibers</title>
<simplesect xml:id="language.fibers.overview">
<title>Обзор файберов</title>
<?phpdoc print-version-for="fiber"?>
<para>
Файберы — механизм управления функциями, который умеет прерывать выполнение функций с сохранением полного внутреннего стека вызовов.
Файберы разрешается приостанавливать в произвольном месте внутреннего стека вызовов, при этом выполнение кода внутри файбера
приостанавливается, пока файбер не возобновит работу.
</para>
<para>
Файберы приостанавливают весь внутренний стек выполнения, поэтому коду, который работает с файберами,
не придётся изменять логику вызова методов файбера (тогда как в других языках программирования
при взаимодействии с асинхронными сопрограммами вызывающий код вынужденно изменяет способ вызова функций — прим. перев.).
</para>
<para>
Выполнение файбера разрешается прерывать методом <methodname>Fiber::suspend</methodname> в произвольном месте стека вызовов,
вызвать метод <methodname>Fiber::suspend</methodname> можно в глубоко вложенной функции
или не вызывать вовсе.
</para>
<para>
В отличие от бесстековых <classname>Generator</classname>'ов, под каждый <classname>Fiber</classname>
внутренне выделяется отдельный стек вызовов, что разрешает приостанавливать стеки внутри глубоко вложенных вызовов функций.
Функция, которая вызовом метода <methodname>Fiber::suspend</methodname> объявляет точку прерывания файбера,
не изменяет тип значения, которое она возвращает, в отличие от функций, которые содержат ключевое слово &yield;
и потому возвращают экземпляр класса <classname>Generator</classname>.
</para>
<para>
Приостановка файберов доступна как в пользовательских функциях, так и в функциях,
которые вызываются внутри виртуальной машины языка PHP, наподобие callback-функции,
которую передают как аргумент функции <function>array_map</function>, или методов, которые цикл &foreach;
вызывает на объекте класса <classname>Iterator</classname>.
</para>
<para>
Выполнение приостановленного файбера возобновляют либо вызовом метода <methodname>Fiber::resume</methodname>,
который умеет передавать в точку приостановки файбера произвольное значение, либо вызовом метода <methodname>Fiber::throw</methodname>,
который передаёт исключение в ту же точку. При возобновлении работы файбера с передачей значения это значение
возвращается в точке прерывания файбера как результат вызова метода <methodname>Fiber::suspend</methodname>,
а при передаче исключения — файбер возобновляет выполнение в той же точке и выбрасывает это исключение.
</para>
<note>
<simpara>
До PHP 8.4.0 запрещалось переключать файбер <link linkend="language.oop5.decon.destructor">в деструкторе</link> объекта.
</simpara>
</note>
<example xml:id="language.fiber.example.basic"><!-- {{{ -->
<title>Стандартный пример работы с файбером</title>
<programlisting role="php">
<![CDATA[
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Значение возобновлённого файбера: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Значение приостановленного файбера: ", $value, PHP_EOL;
$fiber->resume('test');
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Значение приостановленного файбера: fiber
Значение возобновлённого файбера: test
]]>
</screen>
</example><!-- }}} -->
</simplesect>
</chapter>
<!-- 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
-->