首页 > 解决方案 > PHP exec()命令不返回Ajax成功函数

问题描述

简介: 我有一个在 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 与上述几种组合。

标签: phpcommand-lineexec

解决方案


波浪号扩展是 shell 的一个功能,而不是 Linux 固有的东西,所以你的脚本不应该依赖它工作。即使不是这种情况,Web 服务器通常作为没有主目录的单独用户运行。您应该做的是在整个脚本中使用绝对路径,并且不要尝试使用 Web 服务器用户写入用户目录。

<?php
$linuxCmd = "/usr/bin/node /home/user/apps/app.js > /var/log/scr_log.log 2>&1 &";
exec($linuxCmd);

让你的网络服务器写入/var/log可能需要一些权限调整,但最好把东西放在它们所属的地方。您不希望向外部(如 Web 服务器)授予写入敏感位置(如主目录)的权限。

至于如何最好地在后台持久运行命令,请参阅此问题的答案。您的代码中没有任何内容会阻止 Ajax 函数成功返回;只有在地址错误(例如 404)或发生错误(例如 500)时才会发生这种情况。


推荐阅读