我使用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) 我有一系列的承诺。
我只想在所有承诺都给了我回应之后才继续,无论它们是解决还是拒绝。我认为 all() 函数可以处理它,但看起来只有当数组中的所有承诺都得到解决并且不考虑某些承诺的拒绝时它才有效。
我可以使用什么功能?
示例:函数 getUser 返回一个 Promise 对象。当所有的承诺给我一个回应时,我想抓住触发器,无论承诺是解决还是拒绝。
array_push($this->users['users'], $this->userFetcher->getUser($userName));
谢谢 :)
我正在尝试使用以下技术构建需要处理许多请求/秒的轻量级 api 服务器:
这是我将所有内容放在一起的方式。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) 我正在努力学习技术 - 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 实现类似 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) 当尝试写入客户端时,消息被缓冲,在某些情况下,它根本就没有被写入.
当前状态:
当我远程登录到服务器时,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)
摘要:
为什么我不能在关闭之前把任何东西写到客户端?
我试图在数据库中插入一条记录到反应套接字服务器。我不知道如何以非阻塞方式进行操作
$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 操作时,该操作将被移动到事件表并且不会阻塞调用堆栈。根据事件循环和非阻塞的定义。
如何以非阻塞方式执行相同的操作。
谢谢
我正在使用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)
我想尝试在连接关闭后每秒重新连接一次.有任何想法吗?
我使用 ReactPHP 中的聊天服务器示例。我的服务器侦听端口 8080
$socket = new React\Socket\Server(8080, $loop);
$server->listen($socket);
Run Code Online (Sandbox Code Playgroud)
在我的本地电脑上。编写的代码工作正常,但是当将文件上传到我的 Linux 主机时,没有任何效果。我从我的托管商处给支持团队写了一张票,他们说这在 Linux 中是不可能的。那是对的吗?
reactphp ×11
php ×8
asynchronous ×2
sockets ×2
amphp ×1
async-await ×1
client ×1
docker ×1
event-loop ×1
guzzle ×1
nonblocking ×1
promise ×1
rabbitmq ×1
symfony ×1
webserver ×1
wss ×1