PHP调用exec函数执行Node.js代码无输出、耗时过长问题求助
PHP调用exec执行Node.js脚本无输出、阻塞问题解决方案
- 修正PHP代码错误与环境变量问题
PHP的exec执行时的环境变量和终端登录环境不一致,会出现找不到node执行文件、找不到目标js文件的问题,同时默认不会捕获错误输出,且exec的第二个返回参数是数组,直接echo只会输出Array无法看到内容,修正后代码如下:
<?php // 先在终端执行 which node 获取node的实际绝对路径,替换下方的node路径 // index.js也要写绝对路径,避免相对路径匹配错误 // 加2>&1 将标准错误输出重定向到标准输出,方便排查报错 exec("/usr/local/bin/node /你的项目完整路径/index.js 2>&1", $res, $code); // 用var_dump打印数组类型的返回结果 var_dump($res, $code); ?>
- 修复运行权限问题
PHP默认以web服务对应的用户身份(常见为www-data、apache、nginx)运行,需确保该用户对node二进制文件有执行权限,对index.js文件有读权限,对baileys需要写入登录会话缓存的目录有读写权限,可临时给对应目录开777权限测试验证是否为权限问题。 - 解决Node.js脚本阻塞问题
你使用的baileys是长连接类库,默认连接建立后会持续挂住进程等待事件,不会主动退出,导致exec一直等待进程结束触发超时,需要在拿到需要的输出后主动退出进程,修改后的index.js代码如下:
const wa = require('@adiwajshing/baileys'); const process = require('process'); async function connecting() { const init = new wa.WAConnection(); init.connectOptions.logQR = false; init.logger.level = 'warn'; init.on('qr', qr => { console.log(qr) // 拿到QR码后主动退出进程,避免阻塞 process.exit(0) }) init.on('open', () => { console.log('连接成功') process.exit(0) }) try { await init.connect(); await init.getChats(); } catch(e) { console.log(e) process.exit(1) } } connecting().then(res => console.log(res)).catch(e => console.log(e))
- 关闭Node.js输出缓冲
Node.js在非终端交互环境下默认会开启输出缓冲,内容不会实时输出,执行命令时加--unbuffered参数关闭缓冲即可:
exec("/usr/local/bin/node --unbuffered /你的项目完整路径/index.js 2>&1", $res, $code);
内容的提问来源于stack exchange,提问作者Raf Lii
相关产品推荐
相关产品推荐

