标签: reactphp

PHP 的替代 Web 服务器:React 还是 PHP 的嵌入式服务器?

我一直在我的PHP项目中使用 Apache 。但现在,我想离开它,开始使用以下选项之一:

React

PHP 的内置 Web 服务器

哪个性能更强?当然,什么是最好的?您的推荐是哪一个?

php webserver reactphp

5
推荐指数
1
解决办法
4538
查看次数

在一段时间不活动后,在PHP CLI脚本中运行功能

我使用Symfony2和RabbitMqBundle来创建一个向ElasticSearch发送文档的worker.以一对一的速率索引文档比使用ElasticSearch批量API慢得多.因此,我创建了一个缓冲区,以1000个为一组将文档刷新到ES.代码看起来(稍微简化)如下:

class SearchIndexator
{
    protected $elasticaService;
    protected $buffer = [];
    protected $bufferSize = 0;

    // The maximum number of documents to keep in the buffer.
    // If the buffer reaches this amount of documents, then the buffers content
    // is send to elasticsearch for indexation.
    const MAX_BUFFER_SIZE = 1000;

    public function __construct(ElasticaService $elasticaService)
    {
        $this->elasticaService = $elasticaService;
    }

    /**
     * Destructor
     *
     * Flush any documents that remain in the buffer.
     */
    public function __destruct()
    {
        $this->flush();
    } …
Run Code Online (Sandbox Code Playgroud)

php rabbitmq symfony reactphp

5
推荐指数
1
解决办法
196
查看次数

等待所有的 Promise 在 React PHP 中完成

我有一系列的承诺。

我只想在所有承诺都给了我回应之后才继续,无论它们是解决还是拒绝。我认为 all() 函数可以处理它,但看起来只有当数组中的所有承诺都得到解决并且不考虑某些承诺的拒绝时它才有效。

我可以使用什么功能?

示例:函数 getUser 返回一个 Promise 对象。当所有的承诺给我一个回应时,我想抓住触发器,无论承诺是解决还是拒绝。

array_push($this->users['users'], $this->userFetcher->getUser($userName));

谢谢 :)

php asynchronous promise async-await reactphp

5
推荐指数
1
解决办法
3798
查看次数

运行 ReactPHP http 服务器脚本的 Docker - 不暴露端口

我正在尝试使用以下技术构建需要处理许多请求/秒的轻量级 api 服务器:

  • 7.1-cli-alpine (docker image) - 内存/磁盘占用小,不需要网络服务器
  • ReactPHP - 用于事件驱动编程的低级库(非常适合非阻塞 I/O 操作)

这是我将所有内容放在一起的方式。PS 这个项目是代号flying-pony

文件夹结构:https : //i.stack.imgur.com/a2TPB.png

docker-compose.yml

flying_pony_php_service:
  container_name: flying_pony_php_service
  build:
    context: ./service
    dockerfile: Dockerfile
  ports:
    - "9195:8080"
  volumes:
    - ./service:/app
Run Code Online (Sandbox Code Playgroud)

服务/Dockerfile

FROM php:7.1-cli-alpine
ADD . /app
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

服务/入口点.sh

#!/bin/sh
/app/service.php
Run Code Online (Sandbox Code Playgroud)

服务/service.php

#!/usr/local/bin/php
<?php

require __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();

$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) {

    $path = $request->getUri()->getPath();
    $method = $request->getMethod();

    if ($path === '/') {
        if …
Run Code Online (Sandbox Code Playgroud)

php docker docker-compose reactphp

5
推荐指数
1
解决办法
1111
查看次数

ReactPHP每次循环运行两次

我正在努力学习技术 - reactPHP.但我已经堆满了起始脚本.我编辑了一点,但我有问题,如果我调用react循环,脚本会完成两次.

我有这个代码:

<?php
require 'vendor/autoload.php';

$app = function ($request, $response) {
    $date = new DateTime();

    file_put_contents("data.txt", $date->getTimestamp().";", FILE_APPEND);

    $response->writeHead(200, array('Content-Type' => 'text/plain'));
    $response->end("Done\n");
};

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket, $loop);

$http->on('request', $app);
echo "Server running at http://127.0.0.1:1337\n";

$socket->listen(1337);
$loop->run();
Run Code Online (Sandbox Code Playgroud)

如果我调用http:// localhost:1337/react/index.php,我会进入data.txt

1439849018;1439849018;
Run Code Online (Sandbox Code Playgroud)

I'm expecting only one value.

reactphp

4
推荐指数
1
解决办法
315
查看次数

reactPHP 承诺同步执行

我正在尝试使用 reactPHP 实现类似 js 的承诺。但是由于某些原因方法同步执行,end_at只有在承诺解决后才打印。

代码:

function iterate() {


    $deferred = new \React\Promise\Deferred();

    sleep(2);

    $deferred->resolve();

    return $deferred->promise();

}

Route::get('test/async', function() {


    echo "start execution at ".time()."<br>"; // this executed first

    iterate()->then(function($result) {
        echo "got result result at ". time() . "<br>"; // this is second
    }, function($error) {

    }, function ($finally) {

    });


    echo "end at " . time(); // this is executed only after then().


}); 
Run Code Online (Sandbox Code Playgroud)

php reactphp

4
推荐指数
1
解决办法
2433
查看次数

ReactPHP套接字服务器:什么触发写入(到客户端)?

当尝试写入客户端时,消息被缓冲,在某些情况下,它根本就没有被写入.

当前状态:
当我远程登录到服务器时,Server Ready:消息很容易按预期打印.

当我发送随机数据("关闭"除外)时,服务器的终端每秒都很好地显示进度,但客户端输出等待直到所有睡眠后,然后立即打印所有数据.

最重要的是,当发送"关闭"时,它只是等待强制性的第二个,然后在客户端没有任何写出的情况下关闭.

目标:
我的主要目标是在关闭连接之前将快速消息写入客户端.

码:

// server.php
$loop = React\EventLoop\Factory::create();

$socket = new React\Socket\Server($loop);
$socket->on('connection', function ($conn)
{
    $conn->write("Server ready:\n");

    $conn->on('data', function ($data) use ($conn)
    {
        $data = trim($data);

        if( $data == 'close')
        {
            $conn->write("Bye\n");
            sleep(1);
            $conn->close();
        }

        for ($i = 1; $i<5; $i++) {
            $conn->write(". ");
            echo '. '; 
            sleep(1);
        }

        $conn->write(".\n");
        echo ".\n";

        $conn->write("You said \"".$data."\"\n");

    });
});
$socket->listen(1337, '127.0.0.1');
$loop->run();
Run Code Online (Sandbox Code Playgroud)

摘要:
为什么我不能在关闭之前把任何东西写到客户端?

php sockets reactphp

3
推荐指数
1
解决办法
1605
查看次数

Guzzle vs ReactPHP vs Amphp用于并行请求

有什么区别:

它们如何不同以及使用的典型用例是什么?

asynchronous guzzle reactphp amphp

3
推荐指数
2
解决办法
2600
查看次数

无法在 React PHP 中进行非阻塞 I/O

我试图在数据库中插入一条记录到反应套接字服务器。我不知道如何以非阻塞方式进行操作

$loop = Factory::create();

$server = new Server('127.0.0.1:4040', $loop);
$database = new Database();

$server->on('connection', function(ConnectionInterface $conn)  use ($database) {
    $conn->write('Welcome, you can start writing your notes now...');

    $conn->on('data', function($data) use ($conn, $database) {
        $database->write($data);
        $conn->write('I am supposed to execute before database write');
    });
});

$loop->run();
Run Code Online (Sandbox Code Playgroud)

write数据库中的方法在sleep(10)执行sql语句之前有几秒钟的时间。所以我期待I am supposed to..应该立即打印下一条消息。

我的期望是,当有 I/O 操作时,该操作将被移动到事件表并且不会阻塞调用堆栈。根据事件循环和非阻塞的定义。

如何以非阻塞方式执行相同的操作。

谢谢

php nonblocking event-loop reactphp

3
推荐指数
1
解决办法
850
查看次数

如何在ratchetphp上自动重新连接客户端?

我正在使用rachetphp为api服务器创建一个客户端.但我有一个问题,当我的连接关闭,无论什么原因,我无法自动重新连接.

这里我使用的lib:https://github.com/ratchetphp/Pawl

<?php

require __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$connector = new Ratchet\Client\Connector($loop);

$connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost'])
->then(function(Ratchet\Client\WebSocket $conn) {
    $conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
        echo "Received: {$msg}\n";
        $conn->close();
    });

    $conn->on('close', function($code = null, $reason = null) {
        echo "Connection closed ({$code} - {$reason})\n";
    });

    $conn->send('Hello World!');
}, function(\Exception $e) use ($loop) {
    echo "Could not connect: {$e->getMessage()}\n";
    $loop->stop();
});

$loop->run();
Run Code Online (Sandbox Code Playgroud)

我想尝试在连接关闭后每秒重新连接一次.有任何想法吗?

php sockets wss client reactphp

2
推荐指数
1
解决办法
1886
查看次数

在 PHP 主机上部署 ReactPHP

我使用 ReactPHP 中的聊天服务器示例。我的服务器侦听端口 8080

$socket = new React\Socket\Server(8080, $loop);
$server->listen($socket);
Run Code Online (Sandbox Code Playgroud)

在我的本地电脑上。编写的代码工作正常,但是当将文件上传到我的 Linux 主机时,没有任何效果。我从我的托管商处给支持团队写了一张票,他们说这在 Linux 中是不可能的。那是对的吗?

reactphp

2
推荐指数
1
解决办法
872
查看次数