Por ejemplo este código
<?php if (some_condition()) { header('Location: /'); exit(); } // do a lot of things...En el código anterior PHP FPM clásico funciona bien. Pero en PHP+Swoole, obtenemos este error
swoole exit {"exception":"[object] (Swoole\\ExitException(code: 0): swoole exit atEl error es comprensible. Pero, ¿cuál es la forma más fácil de migrarlo?
Para PHP FPM, cada fragmento de código se ejecutaba individualmente y el resultado (salida de ese proceso) se canalizaba de vuelta a un cliente. Entonces, cada vez que queríamos detener el procesamiento, simplemente activamos exit() .
Sin embargo, con Swoole , se espera que el servidor funcione todo el tiempo. Claro, es posible detener el proceso con Swoole\Process::exit(), pero generalmente depende del controlador activar el envío de la respuesta de inmediato. Por ejemplo:
$server = new Swoole\HTTP\Server("127.0.0.1", 9501); $server->on("start", function (Swoole\Http\Server $server) { echo "Swoole http server is started at http://127.0.0.1:9501\n"; }); $server->on("request", function (Swoole\Http\Request $request, Swoole\Http\Response $response) { $response->header("Content-Type", "text/plain"); $response->end("Hello World\n"); }); $server->start(); En este caso, $response->end es el método que hace esencialmente lo mismo que exit() en el mundo PHP FPM. Tenga en cuenta que es bastante similar a lo que sucede en el mundo de Node: se espera que el servidor esté funcionando todo el tiempo, y son los controladores (funciones que procesan cada solicitud individual) los que deciden si dejar de manejar solicitudes individuales y devolver la respuesta, tanto encabezados como cuerpo.
Puede obtener información sobre \Swoole\ExitException .
use Swoole\Coroutine; use function Swoole\Coroutine\run; function route() { controller(); } function controller() { your_code(); } function your_code() { Coroutine::sleep(.001); exit(1); } run(function () { try { route(); } catch (\Swoole\ExitException $e) { var_dump($e->getMessage()); var_dump($e->getStatus() === 1); var_dump($e->getFlags() === SWOOLE_EXIT_IN_COROUTINE); } });exit() en Laravel + Swoole Sí, es una función exit() de muy mala práctica. Pero la propia aplicación Laravel arranca un código heredado. Entonces, por los costos asociados, es una mejor solución de esta manera.
class ExitException extends Exception implements Renderable { public function report() { return true; // dont report } public function render() { return ' '; // prevent 500 html dump error } }exit(); con // exit; throw new ExitException();Esa excepción será manejada por el controlador de errores de su aplicación y enviará una cadena vacía como respuesta al controlador de solicitudes de Swoole.
Repito: NO ES UNA SOLUCIÓN ELEGANTE, solo evite cambiar una gran cantidad de código en la aplicación heredada.