gpt4 book ai didi

php - 如何在PHP中实现事件监听

转载 作者:可可西里 更新时间:2023-11-01 12:44:39 25 4
gpt4 key购买 nike

这是我的问题:我有一个脚本(我们称它为 comet.php),它被 AJAX 客户端脚本请求并等待这样的更改发生:

while(no_changes){
usleep(100000);
//check for changes
}

我不太喜欢这个,它的可扩展性不是很好,而且是(恕我直言)“不好的做法”我想用信号量(?)或无论如何并发编程来改善这种行为技术。你能给我一些关于如何处理这个的提示吗? (我知道,这不是一个简短的答案,但一个起点就足够了。)

编辑:关于LibEvent呢? ?

最佳答案

您可以使用 ZeroMQ 解决此问题.

ZeroMQ 是一个库,它提供用于将事物(线程、进程甚至单独的机器)连接在一起的增压套接字。

我假设您正在尝试将数据从服务器推送到客户端。嗯,这样做的一个好方法是使用 EventSource API (polyfills available)。

client.js

通过 EventSource 连接到 stream.php。

var stream = new EventSource('stream.php');

stream.addEventListener('debug', function (event) {
var data = JSON.parse(event.data);
console.log([event.type, data]);
});

stream.addEventListener('message', function (event) {
var data = JSON.parse(event.data);
console.log([event.type, data]);
});

router.php

这是一个长时间运行的进程,用于监听传入的消息并将它们发送给任何正在监听的人。

<?php

$context = new ZMQContext();

$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind("tcp://*:5555");

$pub = $context->getSocket(ZMQ::SOCKET_PUB);
$pub->bind("tcp://*:5556");

while (true) {
$msg = $pull->recv();
echo "publishing received message $msg\n";
$pub->send($msg);
}

stream.php

每个连接到站点的用户都有自己的 stream.php。此脚本长时间运行并等待来自路由器的任何消息。一旦它收到一条新消息,它将以 EventSource 格式输出这条消息。

<?php

$context = new ZMQContext();

$sock = $context->getSocket(ZMQ::SOCKET_SUB);
$sock->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, "");
$sock->connect("tcp://127.0.0.1:5556");

set_time_limit(0);
ini_set('memory_limit', '512M');

header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");

while (true) {
$msg = $sock->recv();
$event = json_decode($msg, true);
if (isset($event['type'])) {
echo "event: {$event['type']}\n";
}
$data = json_encode($event['data']);
echo "data: $data\n\n";
ob_flush();
flush();
}

要向所有用户发送消息,只需将它们发送到路由器即可。路由器然后将该消息分发给所有监听流。这是一个例子:

<?php

$context = new ZMQContext();

$sock = $context->getSocket(ZMQ::SOCKET_PUSH);
$sock->connect("tcp://127.0.0.1:5555");

$msg = json_encode(array('type' => 'debug', 'data' => array('foo', 'bar', 'baz')));
$sock->send($msg);

$msg = json_encode(array('data' => array('foo', 'bar', 'baz')));
$sock->send($msg);

这应该证明您不需要 node.js 来进行实时编程。 PHP 可以很好地处理它。

除此之外,socket.io 是执行此操作的一种非常好的方式。您可以轻松地通过 ZeroMQ 将 socket.io 连接到您的 PHP 代码。

另见

关于php - 如何在PHP中实现事件监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com