【问题标题】:End php socket connection in javascript在javascript中结束php套接字连接
【发布时间】:2020-11-06 16:52:57
【问题描述】:

我有一个 PHP 脚本,它打开与同一网络上的机器的套接字连接,并等待响应长达 60 秒,然后返回结果。在“主”页面上使用 ajax 请求调用此脚本,该页面显示包含结果的消息。

问题是我希望能够随时从“主”页面结束套接字连接,这是可以做到的吗?或者其他人能想到更好的方法吗?

谢谢!

【问题讨论】:

  • 这很 hacky,但是您可以发送第二个 ajax 调用,该调用会触发一个 shell 命令来查找并终止具有套接字连接的进程...假设您可以在进程列表中识别正确的进程跨度>
  • 您不能从客户端关闭套接字。您将需要一个 PHP 脚本,它可以知道文件指针,然后可以关闭套接字。然后可以从客户端通过 AJAX 调用它。我不记得您是否可以将 FP 存储在 Session 变量中。可能更容易获取 Socket 的进程 ID,然后通过另一个脚本杀死。
  • 最好编辑您的帖子并包含您的代码示例。

标签: javascript php jquery sockets


【解决方案1】:

这是一个非常轻量级且未经检验的理论。

open.php

<?php
session_start();
$_SESSION['fp'] = fsockopen($_GET['url'], 80, $errno, $errstr, 60);
// Do listen for 60 seconds, get data
while (!feof($_SESSION['fp'])) {
  echo fgets($_SESSION['fp'], 128);
}
fclose($_SESSION['fp']);
unset($_SESSION['fp']);
?>

close.php

<?php
session_start();
if(isset($_SESSION['fp'])){
  fclose($_SESSION['fp']);
  unset($_SESSION['fp']);
}
?>

JavaScript

$(function(){
  $("#go").click(function(){
    $.get("open.php", { url: $("#url").val() }, function(results){
      console.log(results);
    });
  });
  $("#stop").click(function(){
    $.get("close.php");
  });
});

这里的想法是文件指针存储在会话变量中,因此可以被其他脚本调用。由于您没有提供示例,因此我不能说这是否对您有用。我从未测试过它,因为我从不希望脚本过早关闭连接。我想保持打开状态,直到获得所有数据,然后在 EOF 关闭。

或者,您可以对进程 ID 执行类似的操作。每个 PHP 脚本在运行时都会获得一个 PID。在这里讨论更多:How to kill a linux process using pid from php?

【讨论】:

  • 虽然我没有使用上面的确切答案,但它确实让我想到了一个我以前没有考虑过的好主意。我在页面开始时将会话变量设置为 true,然后在页面上创建了一个按钮,单击该按钮将加载 php 页面以将该会话变量设置为 false。每当收到响应或会话变量为假时,处理套接字连接的脚本将关闭连接,然后在其结束时关闭。如此简单的想法 - 感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2019-05-18
相关资源
最近更新 更多