【问题标题】:PHP shell_exec times out pagePHP shell_exec 超时页面
【发布时间】:2014-01-28 22:21:54
【问题描述】:

我在服务器上有一个 shell 脚本,我从一个 php 页面调用它,它是从数据库流式传输数据的 api 的一部分。

shell 脚本在我的服务器和位于数据库所在的防火墙后面的第三部分服务器之间设置端口绑定。我已经在我们的两个服务器之间设置了无密码的 ssh,当我在终端中运行脚本时执行没有问题,我可以刷新我的 php 页面并从他们的数据库返回数据。

lsof -n -i:3311 | grep LISTEN | awk '{ print $2 }' | uniq | xargs -r kill -9
ssh -fNg -L 3311:127.0.0.1:3306 user@ipaddress

当服务器丢失/丢弃绑定并且我无法再执行 mysql 查询时,php 代码正在尝试重新启动连接

shell_exec("sh start_sever.sh");

但是脚本需要永远运行并且页面超时。但是它确实执行了 shell 脚本,如果我注释掉 shell_exec 行,则返回数据。

你能想到

1) 为什么两台服务器之间的绑定会周期性丢失? 2)为什么 shell_exec 命令会杀死页面 - 像 ls -a 这样的简单命令运行良好。 3) 像运行 cronjob 以每 x 分钟执行一次 shell 脚本这样的解决方案会更好吗

谢谢

【问题讨论】:

    标签: php mysql bash shell ssh


    【解决方案1】:

    您是否为运行网络服务器和目标服务器的帐户或您在网络服务器和目标服务器上的自己的帐户设置了 ssh 身份验证?

    当脚本在这种情况下超时时,可能是因为它们正在等待 STDIN,如果您没有为运行网络服务器和目标服务器的帐户设置密钥身份验证,就会出现这种情况。它将期望输入密码并等待直到发生这种情况或 php 超时 shell_exec。

    【讨论】:

    • 是的,我已经在我们的服务器(在 apache 下运行)上的 www-data 用户和其他服务器之间设置了无密码 ssh 密钥身份验证。在终端中,我可以以 www-data 用户身份登录我们的服务器,并在不使用密码的情况下通过 ssh 登录两个服务器。
    • 好的,您可以尝试关闭标准输入,然后查看它是否正在等待输入或是否是其他问题:sh start_server.sh < /dev/null
    • 添加了/null,但页面仍然冻结它的响应。停止页面进程并切换到以 www-data 登录的终端并运行 lsof -i :3311 并显示绑定。注释掉 shell_exec 命令,保存并刷新 php 并加载数据。所以脚本成功运行并且不等待密码,但没有移动通过该行并执行其余代码。
    • 将它切换到 sh start_server.sh > /dev/null 并且它似乎正在工作。非常感谢您为我指明了正确的方向。
    • 没问题,很高兴我能帮上忙!
    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2011-04-25
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多