0

我有一个脚本,当前每个循环通过 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;
        }
    }

}
4

3 回答 3

2

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

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

于 2013-05-19T11:14:56.893 回答
0

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

安东尼。

于 2013-05-19T12:27:05.480 回答
0

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

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

它在 Windows 服务器上运行,但同样适用于任何服务器。

这是我的批处理文件的内容作为示例:


@Echo Off For /F "usebackq tokens=1-10 delims=," %%a in ("D:\php_run\all_locations_10.cvs") Do (
echo Scanning: %%a
start "Scanning %%a" "C :\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%a"
echo Scanning: %%b start "Scanning %%b" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%b"
echo 扫描:%%c
start "扫描%% c" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%c"
echo 扫描:%%d
start "扫描%%d" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%d"
echo 扫描: %%e
start "扫描%%e" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" " D:\php_run\wkstn_scan.php" "%%e"
echo 扫描:%%f
start "扫描 %%f" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%% f"
echo 扫描:%%g
start "扫描%%g" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" " %%g"
echo 扫描:%%h
start "扫描%%h" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php " "%%h"
echo 扫描: %%i
start "扫描%%i" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan .php" "%%i"
echo 扫描: %%j
start /WAIT "扫描 %%j" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%j"

)

于 2013-06-12T17:12:29.253 回答