У меня проблема с моим сценарием. В настоящее время сценарий 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)
Проблема была исправлена.
По-видимому, я указывал неправильное имя файла для 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});
})
)
}));
Других решений пока нет …