使用PHP exec调用Node脚本并在finally方法之前将数据返回给PHP

2024-04-29

我有一个 PHP 脚本,它使用exec函数来执行 Node 脚本并将一些数据返回到同一 PHP 脚本。

我的问题是我需要将数据返回给 PHP,而不必等待中的清理代码finally完成。

我在下面编写了一些示例代码,向您展示代码的流程并说明我的问题。该代码示例不使用任何节点模块,但如果它们有帮助,请随意使用它们。

示例.php

$data = 'hello world';

$exec = 'node example.js ' . $data;
$escaped_command = escapeshellcmd($exec);
$data = exec($escaped_command);

// waits 10 seconds then displays returned data
// I need the code to return before finally executes
var_dump($data); // string(31) "Final data is final hello world"

示例.js

   let data = process.argv[2];
// let data = "hello world";

async function timeout(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

const doSomething = data => new Promise((resolve, reject) => {

    if (data) {
        resolve("new hello world");
    } else {
        reject();
    }
});

const doSomethingElse = newData => new Promise((resolve, reject) => {

    if (newData) {
        resolve("final hello world");
    } else {
        reject();
    }
});


(async() => {

    try {

        let newData = await doSomething(data);

        let finalData = await doSomethingElse(newData);

        // return this to server/php right now. 
        // Do not wait until finally script finishes
        console.log("Final data is " + finalData);

    } catch (err) {

        // if error return this to server/php right now. 
        // Do not wait until finally script finishes
        console.log(err);

    } finally {

        // does cleanup/closes node app
        await timeout(10000);
    }

})();

Use 进程打开 http://php.net/manual/en/function.proc-open.php异步运行进程。让节点尽快输出数据。无需等待节点完成即可读取此数据:

// foo.js
process.stdout.write(JSON.stringify({"foo":"bar"})+"\n");

// simulate cleanup
setTimeout(() => {}, 3000);  


// foo.php
<?php

$io = [
    0 => ['pipe', 'r'], // node's stdin
    1 => ['pipe', 'w'], // node's stdout
    2 => ['pipe', 'w'], // node's stderr
];

$proc = proc_open('node foo.js', $io, $pipes);

$nodeStdout = $pipes[1]; // our end of node's stdout
echo date('H:i:s '), fgets($nodeStdout);

proc_close($proc);
echo date('H:i:s '), "done\n";

示例输出:

$ php foo.php 
14:59:03 {"foo":"bar"}
14:59:06 done

proc_close 将等待节点进程退出,但您可以推迟等待,直到完成 PHP 中的其他操作。

如果您不调用 proc_close,则可能会出现僵尸进程,具体取决于您的环境。Docker 和 PID 1 僵尸收割问题 https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/包含一个很好的解释。很多时候都是指docker,因为这里是僵尸经常出现的地方,但是还是普遍适用的。

某些服务器 API 具有为客户端“隐形”运行代码的规定。例如,fcgi 有fastcgi_finish_request http://php.net/manual/en/function.fastcgi-finish-request.php,您可以在 proc_close 之前调用它。这样 HTTP 客户端就不会注意到等待时间。

如果您不能容忍最终等待节点,请考虑将节点事物改为 Web 服务,它独立于 PHP 进行管理。

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

使用PHP exec调用Node脚本并在finally方法之前将数据返回给PHP 的相关文章

  • proc_open() 失败并显示“权限被拒绝”

    我正在尝试使用proc open 执行程序并打印结果 但是 我不断收到 许可被拒绝 的消息 已将脚本和可执行文件的 chmod 设置为 0777 但无济于事 ini get safe mode 是假的 可能出什么问题了 我正在使用 Cent
  • ASCII“../”是 PHP 中指示目录遍历的唯一字节序列吗?

    我有一个 PHP 应用程序 它使用 GET参数来选择文件系统上的 JS CSS 文件 如果我拒绝输入字符串包含的所有请求 或者可见 7 位 ASCII 范围之外的字节 当路径传递到 PHP 的底层 基于 C 文件函数时 这是否足以防止父目录
  • 如何在 Angular 2 应用程序中使 DateAdapter 单例?

    我正在开发一个带有延迟加载模块的 Angular 7 应用程序 我也使用有角度的材料组件 我想在日期选择器组件中本地化并支持多个区域设置 当应用程序语言发生变化时 我想在整个应用程序中全局更改它 可以通过 DateAdapter setLo
  • 在 wampserver 2.2 上安装 php_imagick.dll PHP 扩展

    我使用的是 32 位操作系统的 Windows 7 我安装了 ImageMagick 6 8 7 Q16Link https www imagemagick org script download php windows我能够从命令行 转换
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 在电子生成器反应电子应用程序后,在 Windows 中出现空白屏幕

    在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 这是package json 在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 name SmallBusinessManagement version 0 1
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • Onblur 事件在另一个 div 的 onclick 之前触发

    如上所述 我有一个按钮 单击该按钮将打开子菜单 对于子菜单中的每个选项 都有三个元素 我认为实际上还有更多元素 但为了简单起见 将其保留为 3 我将焦点放在子菜单的主 div 白色 框架 上 Onblur 这个 div 然后我隐藏子菜单 这
  • jquery ajax加载后丢失CSS

    大家知道如何解决 load Ajax 请求后的 css 问题吗 例如 如果我想从网页加载 DIV 在我的 Ajax 请求之后 container load path to div div id 我丢失了与该 div 关联的所有 css 和脚
  • JavaScript 中的最短路径

    几周来我一直在寻找一种在 JavaScript 中计算最短路径的方法 我一直在玩书数据结构和算法作者 格罗纳 Groner 名字恰如其分 https github com loiane javascript datastructs algo
  • keystonejs 模型中的动态类型选择

    我想在 adminUI 中使用一个组合框 其中包含来自 Web 服务的字段 我正在考虑使用预 查找 挂钩获取数据 然后覆盖模式中 受众 属性的选项属性 Schema Compliance add title type Types Text
  • 如何使用 php 从字符串中提取日期

    我需要从字符串中提取日期 下面是我的代码和字符串 str Updated status to Masters Software Engineering Enrolled Documents to Send on 03 06 2014 14
  • 在React组件中使用的字符串变量中插入html

    我正在为我的投资组合网站构建一个反应应用程序 目前我已经用 JSX 编写了应用程序 因此我可以添加以下内容 class Project extends React Component render return div h1 this pr
  • JavaScript 正则表达式两个标签之间的多行文本

    我编写了一个正则表达式来从 HTML 中获取字符串 但似乎多行标志不起作用 这是我的模式 我想将文本输入h1 tag var pattern div class box content 5 h1 lt lt h1 gt mi m html
  • PHP 启动:无法加载动态库 php5.4.3/ext/php_ffmpeg.dll 不是有效的 Win32 应用程序

    再会 我尝试在 Windows 7 计算机上安装 dll 文件 php ffmpeg 但不断收到此错误 29 Jan 2013 11 37 00 UTC PHP Warning PHP Startup Unable to load dyna
  • 在 PHP 中设置 HTTP 响应代码(在 Apache 下)

    给出以下两种在 PHP 中设置 HTTP 响应代码的方法 具体来说 在 Apache 下 方法一 http response code 404 方法二 header HTTP 1 0 404 Not Found 我的问题是 除了这个事实之外
  • 如何在 Firefox 插件中追加到文件?

    var tabs require sdk tabs var iofile require sdk io file var widgets require sdk widget var selection require sdk select
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app
  • 纯旧 PHP 对象 (POPO) 一词的确切含义是什么?

    我想了解一下波波 我搜索了 popo 发现它代表 Plain Old Php Object 但我不确定 Plain Old Php Object 的确切含义 我想知道什么是 popo 以及在哪里使用它 谢谢 普通旧 在此处插入语言 对象是一
  • JavaScript 中“键”的类型是什么?

    当我失去焦点并开始思考一个愚蠢的问题时 我遇到了这样的时刻 var a b value b 的类型是什么 我的意思不是 值 的类型 而是标记为 b 的实际键 背景 当我必须创建一个字符串键时 我开始想知道这一点 var a b value

随机推荐

  • 数据库优化命令

    在用户可以下订单的数据库中 最好有一个包含地址的新表 还是每个订单的标题中都有地址数据 这不仅涉及用户 及其地址 还涉及您所销售产品的价格和其他信息 这些信息可能会发生变化after订单已下达 但订单本身必须保持完整 一般来说 有两种方法
  • 如何获取Android 13当前的壁纸?

    似乎getDrawable of WallpaperManager在 Android 13 上没用 因为用户无法获取READ EXTERNAL STORAGE对此的许可 有什么办法可以获取 API 级别 33 上的当前壁纸吗 我的意思是不降
  • 新的 Delphi Rad Studio XE2 中的 FireMonkey (FMX) 包含哪些功能的详细信息?

    我听说德尔福全新 Rad Studio XE2有一个东西叫做火猴这将允许相同的代码构建 Windows 32 Windows 64 和MacOS应用程序 如果这是真的 那么这是巨大的 在哪里可以获得有关 FireMonkey 的技术文档 E
  • 如何预取 Wagtail 帖子标签?

    我有大约 10 个帖子 它生成大约 100 个查询来获取帖子标签 这taggit下面使用的 Wagtail 库supportprefetch related https github com alex django taggit blob
  • 将图像上传到 spring mvc 中的文件夹

    我尝试将图像上传到我的资源中的文件夹 resouces images demo jpg 但它无法运行 你能帮忙在春天上传到我的资源吗mvc 如果我上传到 C test demo jpg 没关系 我的样本 String filename Fi
  • Rails 3.1 资产管道:忽略来自 gem 的资产

    我不太确定实际行为是什么 所以我的第一个问题是 来自 gem 在我的例子中 Spree 的资产 例如 javascript 是否总是被编译 我不使用 Spree 的 javascript 因此不希望编译它们 我不需要它们applicatio
  • R Doplot() 坐标定位器()

    我绘制了 2 个 fasta 序列的点图 使用 seqinr 包中的 dotPlot 我需要从图中提取一些值 x y Dotplot 输出是图像 通用点图可能就是这个 例如 我需要局部对齐的开始和结束值 由紫色线表示所以这里有一个例子 l
  • 了解 JAXB @XmlRootElement 注释

    我正在使用教程在这里 http www vogella com articles JAXB article html jaxb用于理解 JAXB 当作者开始创建文档的根时 作者开始如下 This statement means that c
  • 在rails生产环境中禁用服务器端缓存

    我即将部署一个包含敏感数据的应用程序 因此 不应将任何数据存储到磁盘上 有没有办法禁用服务器端缓存 我找不到任何 我碰巧遇到了这个问题 并且假设您不再需要答案 但是 我相信您正在寻找的是以下内容 config action controll
  • 在javascript中将字符串转换为数字

    我想解析包含经度和纬度的用户输入 我想做的是将字符串强制转换为数字 保留其符号和小数位 但我想做的是当用户输入无效时显示一条消息 我应该遵循哪一个 parseFloat x second new Number x third x fourt
  • 我的 ViewModel 列表中每个项目的数据验证

    要使用正则表达式进行验证 我通常这样做 In my ViewModel RegularExpression MyRegex ErrorMessageResourceName MyErrorMessage public string MyFi
  • 写入 BigQuery 时处理卡住

    我正在使用云数据流将数据从 Pub Sub 消息导入到 BigQuery 表 我正在使用 DynamicDestinations 因为这些消息可以放入不同的表中 我最近注意到该进程开始消耗所有资源 并且消息表明该进程被卡住开始显示 Proc
  • Python 词干分析器问题:词干错误

    你好 我正在尝试用 python 词干分析器来词干 我尝试了 Porter 和 Lancaster 但他们也有同样的问题 他们无法正确阻止以 er 或 e 结尾的单词 例如 它们源于 computer gt comput rotate gt
  • Knockout 将 css 类绑定到观察到的模型属性

    我想将 divs css 类绑定到视图模型的属性 如下所示 div 但这会产生结果 div class 0 1 2 3 这是视图模型 myViewModel selectedPriority ko observable High Compa
  • 什么时候调用CloseHandle?

    我有一个主线程 它接收需要一些时间的操作 所以我创建一个线程并将工作委托给它 当主线程接收作业时 将调用此执行函数 每个作业都执行此执行 Return type execute Arguments here if a file read c
  • Google Chrome 的互联网历史记录脚本

    我并不是在寻找 最佳 或最有效的脚本来执行此操作 但我想知道是否存在一个脚本可以从 Google Chrome 中提取一天的互联网历史记录并将其记录到 txt 文件中 我更喜欢用 Python 或 MATLAB 编写 如果你们有不同的方法
  • mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,布尔值给出

    看来我的 mysqli query 不起作用 我该怎么办 在密码附近的查询中使用 AND 而不是逗号 这就是查询返回 false 并抛出该错误的原因 select
  • 绘制 UML 时何时使用属性(属性)而不是关联/聚合/组合

    好吧 我有点困惑 当尝试在 UML 图中显示关系时 我应该向类添加属性 还是绘制与类的关联 例如 假设我有一个 DFA 类 其中包含 10 个状态对象 每个状态对象都有一组不同的通往 DFA 中各种状态的路径 我应该绘制从 DFA 到 St
  • 使用 SharpPcap 和 Packet.Net 发送我自己的 ARP 数据包

    到目前为止 我尝试使用 SharpPcap 发送我用 Packet Net 创建的 ARP 数据包 但没有成功 问题是即使我使用发送数据包device SendPacket它实际上没有被发送 我不知道为什么 这是我的代码 ARPPacket
  • 使用PHP exec调用Node脚本并在finally方法之前将数据返回给PHP

    我有一个 PHP 脚本 它使用exec函数来执行 Node 脚本并将一些数据返回到同一 PHP 脚本 我的问题是我需要将数据返回给 PHP 而不必等待中的清理代码finally完成 我在下面编写了一些示例代码 向您展示代码的流程并说明我的问