reactphp需按需安装组件而非元包,eventloop必须手动启动且仅一次,http服务器须显式绑定socket实例,异步请求需完整处理promise的resolve与reject。

ReactPHP 不是“装上就能用”的框架,它是一组按需组合的异步组件。直接 composer require react/react 只会拉取 react/event-loop 和极简依赖,HTTP、DNS、Stream、HTTP客户端等功能全都不在其中——你写不出服务器,也发不了异步请求。
别装 react/react 元包,按场景选具体组件
ReactPHP 的设计哲学是“最小耦合”,所有功能都拆成独立包。装错包会导致代码报错却找不到原因,比如:Class 'React\Http\Server' not found 就是因为只装了 react/react 却没装 react/http。
常见组合与对应命令:
- 想跑一个 HTTP 服务器 →
composer require react/http:^1.1 react/socket:^1.12 - 想发异步 HTTP 请求 →
composer require react/http-client:^0.5 react/event-loop:^1.5 - 想处理 TCP/UDP 或 WebSocket →
composer require react/socket:^1.12 react/stream:^1.4 - 只做定时器或事件调度 →
composer require react/event-loop:^1.5
注意版本对齐:react/http ^1.1 强依赖 react/socket ^1.12,混用 ^2.x 会因接口变更直接崩溃。
EventLoop 必须手动启动,且只能运行一次
所有 ReactPHP 组件都依赖事件循环(EventLoop),但它不会自动启动。漏掉 $loop->run(),你的服务器监听、HTTP 请求、定时器全都不会触发——程序静默退出,无报错、无日志、无响应。
典型错误写法:
$loop = React\EventLoop\Factory::create(); $server = new React\Http\Server($handler); $server->listen(8080); // ❌ 这里没 run(),脚本立即结束
正确写法:
$loop = React\EventLoop\Factory::create();
$server = new React\Http\Server($handler);
$server->listen(new React\Socket\Server('0.0.0.0:8080', $loop));
$loop->run(); // ✅ 必须有,且只能调用一次
额外提醒:不能在 CLI 脚本里反复 require 同一个 server.php 来“重启”服务——EventLoop 是单例,二次 run() 会抛出 LogicException。
用于在React Native或Expo移动应用(iOS/Android)中添加生物识别认证——集成react-native-auth0 SDK与原生深度...
HTTP 服务器必须显式绑定 Socket,不能只 listen 端口
ReactPHP 的 Server::listen() 方法不接受字符串端口号(如 8080)作为参数。这是新手最常踩的坑:Uncaught TypeError: React\Http\Server::listen(): Argument #1 ($socket) must be of type React\Socket\Server。
正确流程分三步:
- 先创建
React\Socket\Server实例,传入地址+端口和$loop - 再把该 socket 实例传给
React\Http\Server::listen() - 最后调用
$loop->run()
示例片段:
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:8080', $loop);
$http = new React\Http\Server(function ($request, $response) {
$response->writeHead(200, ['Content-Type' => 'text/plain']);
$response->end("Hello\n");
});
$http->listen($socket); // ✅ 传的是 Socket 实例
$loop->run();
异步请求要小心 Promise 链断裂和错误吞没
用 react/http-client 发起请求时,$request->then() 返回的是新 Promise,但如果不链式返回或没写 rejection 回调,错误会被静默丢弃——比如 DNS 失败、连接超时,你只会看到脚本卡住或空响应。
安全写法必须同时处理 resolve 和 reject:
$request = $factory->request('GET', 'https://httpbin.org/delay/2');
$request->then(
function (React\HttpClient\Response $response) {
echo "Success: " . $response->getBody();
},
function (Exception $e) {
echo "Failed: " . $e->getMessage();
}
);
更关键的是:Promise 不会自动触发事件循环。你得确保 $loop->run() 在作用域内持续运行,否则回调永不执行——这也是为什么很多 demo 把 then() 写在 run() 闭包里,本质是保证 loop 活着。
实际项目中,EventLoop 的生命周期管理、组件间版本兼容、以及错误路径是否被覆盖,比语法本身更决定成败。写完第一行 require autoload.php 后,别急着写路由——先确认 EventLoop 是否真在跑,再看第一个 echo 有没有出来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










