php - 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 与上述几种组合。
解决方案
波浪号扩展是 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)时才会发生这种情况。
推荐阅读
- c++ - 使用“多个”命名空间单行
- react-native - React Native Expo Video av-expo -- 直接全屏播放
- git - 有没有办法检查远程 git repo 是否有更改,而无需实际获取更改?
- asp.net-mvc - Application Insights - 应用程序映射缺少传入请求节点
- powershell - 在外部窗口中操作 Afx OLE 控件
- sql - 如何使 MSSQL 忽略用户正在给予的价值中的“'”?
- javascript - argMax 将数组作为轴做什么?
- excel - 无法在 vba 中激活变量分配表
- angular - 星云切换在生产模式下不起作用
- bash - 等待 bash 中至少一项工作的结束