摘要:我有一个在PHP页面上运行的命令,由Ajax调用。
最新的PHP示例:
$linuxCmd = "cd ~/apps && node app.js > scr_log.log 2>&1 &";
exec($linuxCmd);
我也尝试过:
$linuxCmd = "cd ~/apps && node app.js > scr_log.log 2>&1";
$linuxCmd = "cd ~/apps && node app.js &";
$linuxCmd = "cd ~/apps && node app.js > /dev/null 2>&1 &";
$linuxCmd = "cd ~/apps && node app.js 2>&1 /dev/null &";
并考虑在过去的一天中,我介绍了这些命令的所有其他可能组合。看来,无论我尝试了什么,上一页的ajax成功功能都不会运行。我以为在后台运行以上过程将使PHP页面返回到javascript页面上的ajax调用并继续运行脚本,但是没有运气。
我还尝试过在exit()
函数之后添加return()
和exec()
,但是没有到达它们。
此外,脚本(app.js)循环运行。当数据库中的值每次在循环中运行时都会检查它的变化时,它将终止。我也有一种杀死进程的方法,它可以正常工作并返回该ajax请求的成功功能,因为它只是终止了进程。
换句话说,我需要从PHP exec()运行的脚本在启动后能够不断运行,但是在后端启动该过程后,还需要前端javascript页面继续运行。
我想知道这是否由于某些原因而无法实现。如果是这样,是否有比PHP的exec()函数更好的方法。还尝试了将shell_exec与上述几种组合一起使用。
答案 0 :(得分:2)
Tilde expansion是Shell的功能,不是Linux固有的功能,因此您的脚本不应依赖于它的工作。即使不是这种情况,Web服务器通常也以没有主目录的单独用户身份运行。您应该做的是在整个脚本中使用绝对路径,并且不要尝试与Web服务器用户一起写入用户目录。
return (
<Router>
<Provider>
<Switch>
<Route path="/" exact component={Home}/>
<Route path="/articleList/" exact component={ArticleList}/>
<Route path={`/articleList/:articleId`} component={Article}/>
</Switch>
</Provider>
</Router>
);
让您的Web服务器写入const Article = ({match}) => {
return(
<Consumer>
{value => {
const [...articles] = value.content;
const res = articles.find(article=> article.id === parseInt(match.params.articleId))
return(
<ArticleBody content={res.content.rendered}/>
)
}}
</Consumer>
)
}
可能需要进行一些权限调整,但是最好将它们放置在所属位置。您不想授予暴露于外部的内容(例如Web服务器)的权限,以写入到主目录之类的敏感位置。
有关如何最好地在后台持久运行命令,请参见this question的答案。您的代码中没有什么可以阻止Ajax函数成功返回的;仅当地址错误(例如404)或发生错误(例如500)时才会发生这种情况。