【问题标题】:Possible to "que" fsockopen? Multiple TCP Sockets可以“que” fsockopen 吗?多个 TCP 套接字
【发布时间】:2013-05-14 02:15:47
【问题描述】:

我有一个脚本,当前每个循环通过 fsockopen() 创建一个 TCP 套接字。每次打开连接时,整个 PHP 脚本都会暂停,直到它建立为止。

我想沿着同时运行 5 个套接字的路径走下去,这样我就可以加快脚本的速度。

有什么方法可以“查询”一个 fsockopen 连接吗?理想情况下,它看起来像这样的伪代码。

$opensocketcount = 0;

while (1) {

    if($opensocketcount < 5) {
        for($i=1;$i<6;$i++) {
            $sockets[$i] = fsockopen("127.0.0.1",80);
            $opensocketcount++;
        }
    }

    //Check to see if socket connection has been established
    for($i=1;$i<6;$i++) {
        if ( has_socket_been_established($sockets[$i]) ) {
            //Post the data.
            $opensocketcount -= 1;
            socket_close($sockets[$i]);
            $sockets[$i] = null;
        }
    }

}

【问题讨论】:

    标签: php sockets fsockopen


    【解决方案1】:

    PHP 不是异步的。 这意味着它会暂停,直到建立连接。 有一些使用 shell 脚本或 CURL 来实现多线程 PHP 的方法,但所有这些都不是完美的解决方案。

    如果你在前端使用它,你可以使用 AJAX,因为它是异步的,并调用像这样的脚本“socket.php?con=1”等。 在 PHP 脚本中,您将拥有一个包含所有 IP 的数组,并通过 GET 值连接到它们。但是,这仅在您在前端具有此功能时才有效。对于后端方法,您必须使用 NODE.JS 之类的东西

    【讨论】:

    • 啊谢谢,真可惜。我试图避免使用 CURL,因为脚本正在处理原始二进制数据。
    • 没有 CURL 只是用来触发 php 脚本。在触发的 php 脚本中,您必须设置 php.ini 设置,即使连接丢失,脚本也会执行。这样,您可以将 CURL 超时设置为非常低的值,并在不到一秒的时间内触发 10 个套接字连接。但是抬头!由于您正在执行 HTTP 请求,因此这会给网络服务器带来额外的负载。
    【解决方案2】:

    React 可以为您做到这一点 - 请务必查看 examples

    安东尼。

    【讨论】:

      【解决方案3】:

      由于 PHP 当时只做一件事,为了类似的任务(pinging),我创建了一个批处理脚本,该脚本使用参数调用多个 php 作业。

      所以循环在批处理文件中。这也将负载分布在多个 CPU 上,因为作业是分散的。从 CVS 文件中批量读取扫描信息,每行有 10 个项目(一次运行 10 个进程)。

      它在windows服务器上运行,但同样可以应用在任何服务器上。

      这里以我的批处理文件的内容为例:


      @Echo 关闭 对于 /F "usebackq tokens=1-10 delims=," %%a in ("D:\php_run\all_locations_10.cvs") 做 (
      回声扫描:%%a
      开始 "扫描 %%a" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%a"
      回声扫描:%%b 开始 "扫描 %%b" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%b"
      回声扫描:%%c
      开始 "扫描 %%c" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%c"
      回声扫描:%%d
      开始 "扫描 %%d" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%d"
      回声扫描:%%e
      开始 "扫描 %%e" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%e"
      回声扫描:%%f
      开始 "扫描 %%f" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%f"
      回声扫描:%%g
      开始 "扫描 %%g" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%g"
      回声扫描:%%h
      开始 "扫描 %%h" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%h"
      回声扫描:%%i
      开始 "扫描 %%i" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%i"
      回声扫描:%%j
      开始 /WAIT "扫描 %%j" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%j"

      )

      【讨论】:

        猜你喜欢
        • 2012-06-25
        • 1970-01-01
        • 2021-09-10
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        相关资源
        最近更新 更多