2013-05-19 4 views
0

У меня есть сценарий, который в настоящее время создает TCP-сокет через fsockopen() один раз за цикл. Каждый раз, когда он открывает соединение, весь скрипт PHP приостанавливается до тех пор, пока он не будет установлен.Возможно ли «que» fsockopen? Несколько TCP-сокетов

Я хочу пойти по пути одновременного подключения 5 одновременных сокетов, чтобы ускорить выполнение сценария.

Есть ли способ, которым я могу «que» соединение 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; 
     } 
    } 

} 

ответ

2

PHP не является асинхронным. Это означает, что он приостанавливается до тех пор, пока соединение не будет установлено. Есть несколько подходов, использующих сценарии оболочки или CURL для многопоточного PHP, но все это не идеальные решения.

Если вы используете это в интерфейсе, вы можете пойти с AJAX, так как это асинхронный вызов и вызвать скрипт вроде этого «socket.php? Con = 1» и т. Д. В скрипте PHP у вас будет массив с все IP-адреса и подключение к ним по значению GET. Однако это работает, только если у вас есть это в интерфейсе. Для бэкэнд-подхода вам нужно будет использовать что-то вроде NODE.JS

+0

Ах спасибо, какой позор. Я пытался избежать использования CURL, поскольку скрипт имеет дело с необработанными двоичными данными. –

+0

Нет, CURL используется только для запуска скрипта php. В скрипте php scriptd вы должны установить параметр php.ini, который скрипт выполнит, даже когда соединение будет потеряно. Таким образом вы можете установить тайм-аут CURL на что-то действительно низкое и запускать 10 соединений сокета менее чем за секунду. Но хедз-ап! Это добавит дополнительную нагрузку на веб-сервер, поскольку вы выполняете HTTP-запросы. – DaGardner

0

React может сделать это за вас - обязательно зайдите в examples.

Anthony.

0

Поскольку PHP делает то же самое в то время, для подобной задачи (pinging) я создал пакетный скрипт, который вызывает несколько PHP-заданий с использованием аргументов.

Таким образом, цикл находится в пакетном файле. Это также распределяет нагрузку на несколько процессоров, поскольку задания распределены. Пакетная информация для сканирования из CVS-файла с 10 элементами в строке (для запуска 10 процессов в то время).

Он работает на сервере Windows, но тот же может быть применен к любому.

здесь содержание моего пакетного файла в качестве примера:


@ECHO Off Для/F "usebackq токенов = 1-10 delims =," %% а в ("D: \ php_run \ all_locations_10.cvs ") Do (
echo Сканирование: %% a
начало« Сканирование %% a »« C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f " "D: \ php_run \ wkstn_scan.php" "%% a"
echo Сканирование: %% b начало «Сканирование %% b» «C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f "" D: \ php_run \ wkstn_scan.php "" %% b "
echo Сканирование: %% c
начало «Сканирование %% c» «C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe" "-f" "D: \ php_run \ wkstn_scan.php "" %% c "
echo Сканирование: %% d
начало« Сканирование %% d »« C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f "" D: \ php_run \ wkstn_scan.php "" %% d "
echo Сканирование: %% e
начало« Сканирование %% e »« C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f "" D: \ php_run \ wkstn_scan.php "" %% e "
echo Сканирование: %% f
начало« Сканирование %% f »« C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f "" D: \ php_run \ wkstn_scan.php "" %% f "
echo Сканирование: %% g
начало« Сканирование %% g »« C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f "" D : \ php_run \ wkstn_scan.php "" %% g "
echo Сканирование: %% h
начало« Сканирование %% h »« C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe " "-f" "D: \ php_run \ wkstn_scan.php" "%% h"
echo Сканирование: %% i
начало «Сканирование %% i» «C: \ Program Files (x86) \ PHP \ v5. 3 \ php.exe "" -f "" D: \ php_run \ wkstn_scan.php "" %% i "
echo Сканирование: %% j
start/WAIT" Scanning %% j "" C: \ Program Files (x86) \ PHP \ v5.3 \ php.exe "" -f "" D: \ php_run \ wkstn_scan.php "" %% j "


 Смежные вопросы

  • Нет связанных вопросов^_^