我将尝试在时间线历史中解释我的问题:
我尝试从 php 运行几个外部脚本,并再次使用 ajax 调用将退出代码返回到服务器。单个调用应该启动或停止该机器上的服务。这在这台开发机器上运行良好。
- 操作系统:raspbian 操作系统
- 网络服务器:NginX 1.2.1
- php:5.4.3.6
但是,我已将代码导出到功能更强大的更大机器上,一切似乎都运行良好,但有一件事:一次调用会导致 php-fpm 冻结并且永远不会回来。通过详细检查,我发现该调用创建了一个我无法终止的僵尸进程(即使使用 sudo)。
- 操作系统:Ubuntu
- 网络服务器:NginX 1.6.2
- php:5.5.9
唯一的解决方案似乎是停止 php-fpm proc 并重新启动它。然后,只要我再次尝试调用该脚本,一切似乎都可以正常工作。
调用php行
exec("sudo ".$script, $output, $return_var);
(所有变量都是正常的“字符串”,没有特殊字符)
启动脚本
#!/bin/sh
service radicale start 2>&1
顺便说一句,服务启动了,但是每次网络服务器冻结并且我不得不手动重新启动 php,但这是不可接受的(即使对于网络服务器也是如此)。但仅适用于该单个脚本,并且仅适用于具有该庄严命令(启动)的该服务(radiale)。
在 Google 中搜索让我发现 php 命令exec()和session_start()之间存在冲突。
链接:
https://bugs.php.net/bug.php?id=44942
https://bugs.php.net/bug.php?id=44994
他们的结论是,可以使用这样的构造来解决该错误:
...
session_write_close();
exec("sudo ".$script, $output, $return_var);
session_start();
...
但是,在我看来,这不是调试,而是一种无奈的解决方法,因为您失去了让用户知道他的操作已经完全起作用的功能,但更多的是让他相信发生了错误。更令人困惑的是,它完全可以在 Raspberry Pi A 上运行,但不能在具有更大 CPU 和 8 GB RAM 的 64 位机器上运行。
那么在任何地方都有真正的解决方案,还是这种解决方法是解决该问题的唯一方法?我读过一篇关于 php 对 exec/shell_exec 和返回值的识别有一些问题的文章?那怎么能丢?有人猜吗?
THX 阅读了这么长的糟糕英语,但我不是母语人士,在我的课程中也不是很好听的学生。