PHP – 在客户端断开连接时杀死exec

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP – 在客户端断开连接时杀死exec脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我的C应用程序有非常原始的Web前端.客户端(Web浏览器)进入PHP站点并使用参数填充表单.比(提交后)PHP调用exec和应用程序完成其工作.
应用程序的工作时间可能超过一分钟,并且需要相当大的Ram.
是否有可能检测到与客户端的断开连接(例如,在Web浏览器中关闭选项卡).我想这样做,因为在断开连接后客户端将无法看到计算结果,所以我可以杀死应用程序并释放服务器上的一些RAM.

感谢您的任何帮助或建议.

@L_304_5@

只要c程序在运行时产生输出,而不是在终止之前生成所有输出,使用passthru()而不是exec().

这会导致PHP生成内容时将输出刷新到客户端,这允许PHP检测客户端何时断开连接.当客户端立即断开连接并终止子进程时,PHP将终止(只要未设置ignore_user_abort()).

例:

<?PHP

  function exec_unix_bg ($cmd) {
    // Executes $cmd in the background and returns the PID as an integer
    return (int) exec("$cmd > /dev/null 2>&amp;1 & echo $!");
  }
  function pid_exists ($pid) {
    // Checks whether a PRocess wITh ID $pid is running
    // There is probably a better way to do this
    return (bool) trim(exec("ps | grep \"^$pid \""));
  }

  $cmd = "/path/to/your/cpp arg_1 arg_2 arg_n";

  // Start the C++ program
  $pid = exec_unix_bg($cmd);

  // Ignore user aborts to allow us to dispatch a signal to the child
  ignore_user_abort(1);

  // Loop until the program completes
  while (pid_exists($pid)) {

    // Push some harMLess data to the client
    echo " ";
    flush();

    // Check whether the client has disconnected
    if (connection_aborted()) {
      posix_kill($pid,SIGTERM); // Or SIGKILL,or whatever
      exit;
    }

    // Could be done better? Only here to prevent runaway cpu
    sleep(1);

  }

  // The process has finished. Do your thang here.

要收集程序的输出,请将输出重定向文件而不是/ dev / null.我怀疑你需要安装pcntl以及posix,因为PHP手册表明SIGxxx常量是由pcntl扩展定义的 – 尽管我没有安装过没有其他的,所以我不确定.

脚本宝典总结

以上是脚本宝典为你收集整理的PHP – 在客户端断开连接时杀死exec全部内容,希望文章能够帮你解决PHP – 在客户端断开连接时杀死exec所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。