0

我将尝试在时间线历史中解释我的问题:

我尝试从 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 阅读了这么长的糟糕英语,但我不是母语人士,在我的课程中也不是很好听的学生。

4

2 回答 2

1

很可能是新机器的设置方式与 Raspberry PI 的设置方式不同 -

您需要在 shell 中做一些事情,然后才能在更大的机器上运行:

1)。允许 php 使用 sudo。

sudo usermod -G sudo -a your-php-user

请注意,要获取 的用户名your-php-user,您只需运行以下脚本:

<?php echo get_current_user(); ?>- 或者: <?php echo exec('whoami'); ?>-

2)。允许该用户在sudo没有密码的情况下使用

sudo visudo- 这个命令将打开/etc/sudoers 一个故障保险,以防止你搞砸任何事情。

将此行添加到最后:

your-php-user ALL=(ALL) NOPASSWD: /path/to/your/script,/path/to/other/script

您可以根据需要在其中放置任意数量的脚本,用逗号分隔。现在,您的脚本应该可以正常工作了。

再次,请注意您需要更改your-php-user为您的 php 用户。

希望这可以帮助!

于 2015-02-19T17:40:40.923 回答
-1

这不是一个真正的解决方案,但它是一个比没有更好的解决方案。

调用 bash 脚本

<?php
...
exec("sudo ".$script, $output, $return_var);
...
?>

仅在僵尸线程中的这种特殊情况下结束。当 php-fpm 等待结果时,它仍然坚守阵地,不放弃也不超时,因为它的其余线程仍然存在。所以对 php 服务器的所有其他请求仍在队列中,永远不会被处理。对于一些长期存在或工作的线程来说,这可能没问题,但我的请求是在一些 [ms] 内完成的。

我没有找到造成这种情况的原因。就我能做的调试而言,我不是触发的 Radicale 进程错误,因为这在任何时候都给出了一个干净和勇敢的 0 作为回报。似乎 php 进程无法从中获得返回线,因此它仍在等待和等待。

没时间我把故障脚本从

#!/bin/sh
service radicale start 2>&1

#!/bin/sh
service radicale start > /dev/null 2>&1 &

...因此向涅槃的每条返回线发出信号并断开所有子程序。目前,服务器并未自行挂起并按预期工作。但是感觉这可能是 php 中的一个主要错误仍然留在我的脑海中,希望有一天 - 有人可能会解决这个错误。

于 2015-02-20T16:11:19.893 回答