PHP exec()命令未返回Ajax成功函数

时间:2019-02-12 18:15:46

标签: php command-line exec

摘要:我有一个在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与上述几种组合一起使用。

1 个答案:

答案 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)时才会发生这种情况。