Нужен код PHP или Java для использования нескольких интернет-соединений - PullRequest
3 голосов
/ 05 августа 2009

У меня есть машина с дистрибутивом Linux CentOS, в которой одновременно доступно несколько подключений к Интернету.

Я пытаюсь написать код PHP, который будет делать следующее:

  1. Выполните HTTP-запрос к определенному URL-адресу, например "google.com", но через определенное подключение к Интернету.
  2. Выполните вышеуказанное для нескольких подключений к Интернету одновременно (это означает, что будет запущено несколько процессов, каждый с HTTP-запросами через определенное подключение).

Обратите внимание, что интернет-соединения - это ppp0, ppp1 и ppp2.

Вот вывод «ifconfig»:

eth0      Link encap:Ethernet  HWaddr 00:23:7D:3B:04:26
          inet addr:86.111.198.9  Bcast:86.111.198.15  Mask:255.255.255.240
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:33511 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24728 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3144233 (2.9 MiB)  TX bytes:3930225 (3.7 MiB)
          Interrupt:185 Memory:f8000000-f8012100

eth1      Link encap:Ethernet  HWaddr 00:23:7D:3B:04:1E
          inet addr:192.168.1.64  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7570 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6730 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:553439 (540.4 KiB)  TX bytes:463989 (453.1 KiB)
          Interrupt:193 Memory:fa000000-fa012100

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:95 errors:0 dropped:0 overruns:0 frame:0
          TX packets:95 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:14908 (14.5 KiB)  TX bytes:14908 (14.5 KiB)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:78.93.176.35  P-t-P:212.93.193.40  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1442  Metric:1
          RX packets:238 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:44486 (43.4 KiB)  TX bytes:294 (294.0 b)

ppp1      Link encap:Point-to-Point Protocol
          inet addr:78.93.70.4  P-t-P:212.93.193.15  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1442  Metric:1
          RX packets:219 errors:0 dropped:0 overruns:0 frame:0
          TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:24237 (23.6 KiB)  TX bytes:2330 (2.2 KiB)

ppp2      Link encap:Point-to-Point Protocol
          inet addr:87.109.229.209  P-t-P:84.235.124.10  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1442  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:294 (294.0 b)  TX bytes:54 (54.0 b)

Вот вывод команды route:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
212.93.193.15   *               255.255.255.255 UH    0      0        0 ppp1
212.93.193.40   *               255.255.255.255 UH    0      0        0 ppp0
84.235.124.10   *               255.255.255.255 UH    0      0        0 ppp2
86.111.198.0    *               255.255.255.240 U     0      0        0 eth0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth1
169.254.0.0     *               255.255.0.0     U     0      0        0 eth1

Кто-нибудь с какими-либо идеями, как это может работать?

Ответы [ 2 ]

2 голосов
/ 05 августа 2009

Вы можете сделать это в PHP с помощью curl_multi_*() и curl_setopt(CURLOPT_INTERFACE, 'ppp0') и т. Д.

Что касается фактического обнаружения интерфейсов, я просто выполнил простое регулярное выражение для вывода ifconfig. Конечно, это не очень хороший способ сделать что-то, но обычно вам нужно сделать это только один раз, при запуске скрипта, так что это не очень большая проблема с производительностью.

0 голосов
/ 05 августа 2009

Возможно, вам придется маршрутизировать соединение через curl / wget. Эти утилиты командной строки дают вам более четкий контроль над тем, какой интерфейс использовать. Просто запустите команду из вашего PHP-скрипта и сохраните результат. Насколько я могу судить, невозможно указать интерфейс через что-то вроде fopen / file_get_contents с обработчиком потока http: //. Даже Snoopy не может указать интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...