0

現在、ループごとに 1 回 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 は非同期ではありません。つまり、接続が確立されるまで一時停止します。シェル スクリプトまたは CURL を使用してマルチスレッド PHP を使用する方法はいくつかありますが、これらすべてが完全なソリューションではありません。

これをフロントエンドで使用する場合は、AJAX を使用できます。これは非同期であるため、「socket.php?con=1」などのスクリプトを呼び出します。PHP スクリプトでは、すべての IP と接続を含む配列が作成されます。 GET値でそれらに。ただし、これはフロントエンドにある場合にのみ機能します。バックエンド アプローチの場合は、NODE.JS のような sonething を使用する必要があります。

于 2013-05-19T11:14:56.893 に答える
0

Reactでこれを行うことができます。を確認してください。

アンソニー。

于 2013-05-19T12:27:05.480 に答える
0

PHP は一度に 1 つのことを行うため、同様のタスク (ping) のために、引数を使用して複数の PHP ジョブを呼び出すバッチ スクリプトを作成しました。

したがって、ループはバッチ ファイルにあります。これにより、ジョブが分散されるため、負荷が複数の CPU に分散されます。行ごとに 10 個の項目がある (一度に 10 個のプロセスを実行する) CVS ファイルからスキャンするためのバッチ読み取り情報。

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 Scanning: %%c
start "Scanning %% c" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%c"
echo Scanning: %%d
start "Scanning %%d" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%%d"
echo Scanning: %%e
start "Scanning %%e" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" " D:\php_run\wkstn_scan.php" "%%e"
echo Scanning: %%f
start "Scanning %%f" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" "%% f"
echo Scanning: %%g
start "Scanning %%g" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php" " %%g"
echo Scanning: %%h
start "Scanning %%h" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan.php " "%%h"
echo Scanning: %%i
start "Scanning %%i" "C:\Program Files (x86)\PHP\v5.3\php.exe" "-f" "D:\php_run\wkstn_scan .php" "%%i"
エコー スキャン: %%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 に答える