Запуск скрипта node.js через PHP отключает журналы, выдача разрешений по-разному

У меня проблема с моим сценарием. В настоящее время сценарий PHP включает сценарий узла и выводит идентификатор процесса следующим образом:

<?php
exec("/home/node /home/app/server.js 1>/dev/null & echo $!",$pid);
if($pid) echo $pid;
?>

Сценарий запускается, но ничего не регистрируется.

Скрипт Node.js:

const winston = require('winston');
const {combine,timestamp,printf,colorize} = winston.format;

function getLogger(name,filename)
{
let self = this;
let o = {
transports:[
new winston.transports.Console({
levels: winston.config.syslog.levels,
colorize: true,
label: name,
format:winston.format.combine(
colorize(),
timestamp({
format: "YYYY-MM-DD HH:mm:ss"}),
printf(info => {
return `${info.timestamp} [${info.level}] : ${info.message}`;
})
)
})
]
};
filename = filename || "";
if(filename) o.transports.push(new winston.transports.File({
filename:"./logs/"+filename,
format:winston.format.combine(
timestamp({
format: "YYYY-MM-DD HH:mm:ss"}),
printf(info => {
return JSON.stringify({timestamp:info.timestamp,level: info.level,msg:info.message});
})
)
}));
winston.loggers.add(name, o);
return winston.loggers.get(name);
}

var log = getLogger("SERVER","server.log");
log.info("Hello world");

Сначала я подумал, что проблема с переносом вывода в / dev / null, однако при запуске точно такого же скрипта через оболочку он работает и хорошо регистрируется. Однако, запущенный из PHP это не так.

Что может быть причиной этого?

РЕДАКТИРОВАТЬ:

Вот как я называю скрипт PHP:

$.ajax({
url:'startnode.php',
method:"POST",
success:function(data){
console.log(data);
}
})

РЕДАКТИРОВАТЬ 2:

Может ли это быть из-за WWW-данные пользовательские разрешения? Когда я запускаю скрипт node.js из php, ps aux Команда говорит, что скрипт node.js выполняется от пользователя www-data.

РЕДАКТИРОВАТЬ 3:

Я перешел на пользователя www-data и попытался запустить скрипт из оболочки:

www-data@vps1130207:~$ /home/node /home/app/server.js
2018-11-13 19:43:05 [info] : Hello world
events.js:167
throw er; // Unhandled 'error' event
^

Error: EACCES: permission denied, stat 'logs/server.log'
Emitted 'error' event at:
at DerivedLogger.transportError (/home/app/node_modules/winston/lib/winston/logger.js:529:12)
at File.emit (events.js:187:15)
at stat (/home/app/node_modules/winston/lib/winston/transports/file.js:342:21)
at fs.stat (/home/app/node_modules/winston/lib/winston/transports/file.js:371:16)
at FSReqWrap.oncomplete (fs.js:152:21)

0

Решение

Проблема была исправлена.

По-видимому, я указывал неправильное имя файла для winston, поскольку домашней папкой для пользователя www-data была / var / www, она использовала эту папку для создания журналов вместо / home / app.

Это исправило мою проблему:

if(filename)
o.transports.push(new winston.transports.File({
filename:__dirname+"/../logs/"+filename, //added __dirname here
format:winston.format.combine(
timestamp({
format: "YYYY-MM-DD HH:mm:ss"}),
printf(info => {
return JSON.stringify({timestamp:info.timestamp,level: info.level,msg:info.message});
})
)
}));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]