通过 websockets 发送 popen 的输出

2024-03-11

我使用 popen 和 fgets 异步读取 tcpdump 的输出。

下面的代码应该在命令行中运行,而不是使用 apache 并在浏览器中查看它。

$handle = popen('tcpdump -nnX', 'r');

while (true) {
    $output = fgets($handle);
    print $output . "\n";
}

当我尝试通过 websockets 输出此信息时,问题就出现了。

Websockets 还使用无限循环(用于管理其套接字、滴答声和消息)。

它看起来像:

while (true) {
    @socket_select($read,$write,$except,1);
    foreach ($read as $socket) {
        if ($socket == $this->master) {
            $client = socket_accept($socket);
...

我使用 $websocket->sendToAll($message); 通过 websocket 发送数据。

  • 我不能将 while 循环一个接一个地放置,因为它只会运行我先放置的那个循环,while (true) { A() }; while (true) { B() };B() 永远不会被调用

  • 我无法合并 while 循环,因为 websockets 会减慢 popen 的读取速度,反之亦然。while (true) { A(); B(); }如果B需要很长时间才能完成,A就会运行得很慢。

在这种情况下我能做什么?我对线程、分叉脚本之间的通信或其他任何东西的想法持开放态度。


这是经典场景Producer-Consumer问题。只是你有两个而已。您可以分解问题以更容易理解。

  • WebSocket 消费者:此代码将通过WebSocket发送数据。您可以将其视为一个单独的线程,其中数据从队列中出列Q1(只是一个名字)并发送。

  • WebSocket 生产者:一旦一些数据到达 WebSocket 门,它就会被排队到缓冲区中。只是这和上面的队列不一样。让我们命名它Q2。这也需要是一个单独的线程,一旦该线程将数据排队并向适当的消费者发出信号,该线程就会进入睡眠状态。

  • 硬盘消费类:此代码将执行与 WebSocket Consumer 相同的操作,唯一的区别是它将数据存储在硬盘上而不是 WebSocket 上。它将有自己的线程并与Q2.

  • 硬盘生产商: 我相信你能猜到这是做什么的。此代码将从硬盘读取数据并将其放入Q1队列。与所有生产者一样,它需要向消费者发出信号,通知他们队列中有新项目。

现在回到你的代码,PHP 不适合多线程编程,尽管这是完全可能的 http://php.net/manual/en/intro.pthreads.php。这就是为什么你找不到那么多例子的原因。但如果您坚持的话,您需要以下内容:

  1. PHP 的 Thread 类 http://php.net/manual/en/class.thread.php

  2. PHP 的 Mutex 类 http://php.net/manual/en/class.mutex.php。此类将帮助您防止多个线程同时访问相同的数据。

  3. 有事打电话Signaling我在 PHP 中找不到!它被用来 告诉其他线程队列中的某些数据已准备好 Consumer,或者说,会唤醒消费者线程 当它有事情要做的时候。

最后一句话是,在适当的多线程软件中,您不会使用sleep降低系统负载/防止系统崩溃的功能。多线程编程就是线程之间的信号传递和对话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 websockets 发送 popen 的输出 的相关文章

随机推荐

  • iTunes Connect 错误:“应用内购买已被退回”

    我看到以下错误iTunes Connect in the in app purchase我的应用程序部分 应用内购买已退回并在表中突出显示 以下 全部in app purchases新应用程序已被拒绝 他们都显示出状态开发者需要采取行动 走
  • XPath 在任何文本节点中查找文本

    我试图在文档中的任何文本节点中查找特定文本 到目前为止我的语句如下所示 doc xpath text Alliance Consulting do node end 这显然行不通 有人能建议更好的选择吗 这个表情 text Alliance
  • Spring security 3 带索引的拦截url模式

    我正在尝试在项目中使用 Spring Security v3 2 目前 我总是使用 Coldfusion 文件来调用其他文件来构建视图 所以我所有的网址都通过了index cfm blablah 现在我坚持允许匿名用户进入主视图 下列的Sp
  • 初学者打开资源管理器显示文件夹内容

    我几天来一直在 Windows 7 上修改 Python 3 66 取得了良好的进展 但我完全不知道如何让 Windows 资源管理器打开并显示我想要的文件夹内容 我已经尝试了至少 7 种不同的解决方案 但似乎都不起作用 他们都可以很好地打
  • 使用php过滤JSON数据

    我正在尝试迭代此 json 文件并过滤掉不需要的元素 我想拆分结果 以便我有一个客户列表或供应商列表 json 文件 descriptor Test resources uuid 281d393c 7c32 4640 aca2 c286f6
  • Google 日历 API + 电子邮件通知 ics 文件

    我正在使用 Google Calendar API 在 Google Calendar 上创建活动 该 API 工作正常 当我修改 Google 日历中的其中一项活动时 Google 可以通过电子邮件向我发送包含 ics 文件的更新 有没有
  • 在 jasper 报告中的单个文本字段中使用多种字体

    我有一个显示的字段 命名 Here To 是静态的并且 NAME 是一个变量 所以我使用了一个文本字段 attr 和 收件人 F 名称 作为一种表达方式 现在的问题是 我必须为 收件人 和 名称 使用两种单独的字体 我尝试过使用风格 但我一
  • 具有相同标识符的多个 HTTP GET 参数

    假设我收到如下请求 http www example com index php id 123 version 3 id 234 version 4 是否可以在我的 php 代码中以简单的方式提取这些内容 我意识到我可以使用 window
  • 动态加载用户控件 ASP.net 中的单选选项 GroupName 问题

    我有用户控制 table tr td td tr table
  • 如何自定义FirebaseUI-Web主题

    我只想定制徽标和颜色 有谁知道解决方案吗 我只看到了安卓的解决方案 下面的代码 if process browser const firebaseui require firebaseui console log firebaseui co
  • (python) Telegram bot - 如何定期发送消息?

    我对我的电报机器人感到左右为难 假设我必须创建一个函数 每周 每月一次向每个连接到机器人的用户询问一个问题 def check the week bot update reply keyboard YES NO bot send messa
  • 可以在没有 Visual Studio 的情况下安装 Roslyn 最终用户预览版吗?

    Roslyn 最终用户预览是 VSIX Visual Studio 扩展 但它取代了系统 NET Framework 安装中的编译器 这样从命令行涉及 csc exe 将开始使用 Roslyn 是否可以在未安装 Visual Studio
  • 为什么 C# 不需要显式转换来将 Long 转换为 Double?

    首先 抱歉我的英语不好 我有代码片段 long x 9223372036854775807L double f x Console WriteLine x Console WriteLine f 输出是 922337203685477580
  • 如何使用 xmlrpclib Python 库向 WordPress 帖子添加缩略图?

    我正在尝试开发一个Python脚本 它需要将内容发布到wordpress博客 问题是我需要将图像设置为帖子的缩略图 但我不知道如何做到这一点 这是将某些内容 没有缩略图 发布到 WP 的代码示例 import xmlrpclib user
  • 如何将带有 mtl 和纹理的 obj 上传到存储桶?

    正如标题所示 如何上传 obj 模型的材质文件和纹理 因为它们是硬编码在 obj 文件中的 我可以上传压缩的目录结构或多个关系正确的文件 因为 obj 的硬编码性质 吗 这是 dotty 试用网站上的带有材质和纹理的 OBJ 模型 http
  • 保持 OAuth 访问令牌的秘密有多重要?

    一旦我收到使用 OAuth 的网站 例如 facebook 的访问令牌 保守这个秘密有多重要 如果有人掌握了它 会发生什么恶意的事情吗 我想知道将令牌保存在 cookie 或会话中是否是一个坏主意 是的 访问令牌相当于您的用户名 密码 大多
  • SYMPY:特征向量计算后如何细化整个矩阵?

    我想使用 sympy 来计算特征向量 我用 jupyter 笔记本做了一些试验 from sympy import a b symbols a b real True M Matrix a b b a T D M diagonalize n
  • 使用没有会话或 cookie 数据的 iFrame(隐身)

    如果您使用iFrameHTML 文档中的元素 子页面将加载来自浏览器的所有会话和 cookie 数据 例如 h1 Stack Overflow in an iFrame h1 暂时忽略 SO 实际上不允许自己加载到 iFrame 中 如果是
  • 将 csv 文件添加到 HTTP POST

    我想发送一个邮递员 HTTP POST 在此请求中 对于关键 fisier 我想附加一个 csv 文件 如何做到这一点 https i stack imgur com Pnkii png https i stack imgur com Pn
  • 通过 websockets 发送 popen 的输出

    我使用 popen 和 fgets 异步读取 tcpdump 的输出 下面的代码应该在命令行中运行 而不是使用 apache 并在浏览器中查看它 handle popen tcpdump nnX r while true output fg