Для вступления в общество новичков и профессионалов домен-индустрии, пожалуйста нажмите здесь ...

   
 Купля-продажа и обсуждение доменных имён
        

  
Вернуться   Форум о доменах > Дизайн и развитие проектов > Программирование
Регистрация Реноме Правила форума Справка Пользователи Социальные группы Все разделы прочитаны
Программирование PHP, Perl, HTML, XHTML, CSS, JavaScript, MySQL и другие языки кодирования.

Ответ
 
Опции темы
Сегодня
от 149р за .RU
Аренда сервера
2x Intel Hexa-Core Xeon E5-2420
Всего 79 евро!

с видеокартой GeForce GTX 1080 Ti
всего 99 евро!

от 149р за .РФ Реклама на DomenForum.net
Старый 08.04.2017, 11:40   #1
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
PHP. Параллельные запросы

Исходные данные: VPS с 10-12 ядрами.

PHP код:
for( $i 1$i <= 10$i++ )

{

$content=file_get_contents("https://****/$i/***/");


Время выполнения цикла 3,65 секунды.

Задача.
Нужно все 10 file_get_contents выполнить одновременно, сократив время в 10 раз.

Вопрос.
Как?
Port_Artur вне форума   Ответить с цитированием
Старый 08.04.2017, 13:39   #2
SEO Специалист
 
Аватар для pastuhoff
 
Регистрация: 24.10.2005
Сообщений: 6,529
Доменные сделки: 40
Реноме: 5358
Одобрения
Спасибо (Отдано): 187
Спасибо (Получено): 315
Ищите по запросу "multicurl".
__________________
Коллекционер доменных имен.
pastuhoff вне форума   Ответить с цитированием
Старый 08.04.2017, 14:11   #3
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
Попробовал:

curl_multi_init();

curl_multi_exec();

curl_multi_close();

Время:1,68 сек.

Прогресс есть, но всего в 2 раза быстрее.
Маловато.

добавлено через 29 минут
Первый раз был удачней. Сейчас стабильно 2 секунды.

Последний раз редактировалось Port_Artur; 08.04.2017 в 14:40. Причина: Добавлено сообщение
Port_Artur вне форума   Ответить с цитированием
Старый 08.04.2017, 16:05   #4
 
Аватар для Шуранов
 
Регистрация: 07.08.2006
Сообщений: 699
Доменные сделки: 1
Реноме: 5024
Одобрения
Спасибо (Отдано): 18
Спасибо (Получено): 19
Отправить сообщение для Шуранов с помощью ICQ
Ненулевая вероятность, что это время параллельного отклика. На ваши запросы должен сформироваться ответ, идущий, к тому-же через защищенное соединение.
Можете вместо curl_multi сделать pcntl_fork несколько раз, получите параллельное исполнение в виде нескольких процессов.
Шуранов вне форума   Ответить с цитированием
Старый 08.04.2017, 16:45   #5
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
Шуранов, а как будет через pcntl_fork выглядеть вот этот пример:

PHP код:
$urls = array(
   
'http://www.google.ru/',
   
'http://www.altavista.com/',
   
'http://www.yahoo.com/'
    
);
$mh curl_multi_init();
foreach (
$urls as $i => $url) {
    
$conn[$i]=curl_init($url);
    
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);  //ничего в браузер не давать
    
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,10); //таймаут соединения
    
curl_multi_add_handle ($mh,$conn[$i]);
}
//Пока все соединения не отработают
do { curl_multi_exec($mh,$active); } while ($active);
//разбор полетов
for ($i 0$i count($urls); $i++) {
    
//ответ сервера в переменную
    
$res[$i] = curl_multi_getcontent($conn[$i]); 
    
curl_multi_remove_handle($mh$conn[$i]);
    
curl_close($conn[$i]);
}
curl_multi_close($mh);
print_r($res); 
Я и с curl_multi не работал никогда, просто нашёл пример удачный, а вот с pcntl_fork вообще никак.
Помогите пожалуйста.
Port_Artur вне форума   Ответить с цитированием
Старый 08.04.2017, 17:17   #6
 
Регистрация: 30.04.2005
Сообщений: 1,700
Доменные сделки: 18
Реноме: 1276
Одобрения
Спасибо (Отдано): 49
Спасибо (Получено): 366
Попробуй неблокирующие сокеты. В сети есть примеры.
Drow вне форума   Ответить с цитированием
Старый 08.04.2017, 17:24   #7
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
Направление, - это хорошо. Но лучше бы рабочий пример по условию темы.
Port_Artur вне форума   Ответить с цитированием
Старый 08.04.2017, 20:14   #8
 
Аватар для Vitaliy
 
Регистрация: 08.08.2007
Сообщений: 3,567
Доменные сделки: 99
Реноме: 6316
Одобрения
Спасибо (Отдано): 22
Спасибо (Получено): 94
Мне когда такое понадобилось - просто сделал дополнительный скрипт-запускалку параллельных процессов. Вот такой примерно:

PHP код:
<?php
for ($i=0;$i<10;$i++){
    
$headers="GET $path HTTP/1.1\r\n";
    
$headers .="Host: $host\r\n";
    
$headers .="Connection: Close\r\n\r\n";
        
    
$sock=fsockopen($host,80);
    
fputs($sock,$headers);
    
fclose($sock);
}
?>
$path - это адрес вашего скрипта с для которого нужны параллельные процессы.

Он за доли секунды запускает сколько указать в цикле параллельных процессов.

Последний раз редактировалось Vitaliy; 08.04.2017 в 20:17.
Vitaliy вне форума   Ответить с цитированием
Старый 08.04.2017, 20:59   #9
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
А $host ?

Полученные данные как сохранить?

PHP код:
$content=file_get_contents("https://****/$i/***/"); 
Port_Artur вне форума   Ответить с цитированием
Старый 08.04.2017, 22:07   #10
 
Аватар для Vitaliy
 
Регистрация: 08.08.2007
Сообщений: 3,567
Доменные сделки: 99
Реноме: 6316
Одобрения
Спасибо (Отдано): 22
Спасибо (Получено): 94
Сообщение от Port_Artur Посмотреть сообщение
А $host ?

Полученные данные как сохранить?

PHP код:
$content=file_get_contents("https://****/$i/***/"); 
$host - это домен вашего сайта (или можно по ip).

А на счет сохранить - как вам надо так и сохраняете. Вариантов масса. Например, каждый поток может сохранять в свой файл. Чтобы названия файлов отличались можно вызывать эти потоки пронумеровано, например так:

PHP код:
<?php
$host
="domain.com"
$script_name="/script.php"//имя вашего скрипта

for ($i=0;$i<10;$i++){
    
    
$path=$script_name."?n=$i";
    
    
$headers="GET $path HTTP/1.1\r\n";
    
$headers .="Host: $host\r\n";
    
$headers .="Connection: Close\r\n\r\n";
        
    
$sock=fsockopen($host,80);
    
fputs($sock,$headers);
    
fclose($sock);
}
?>
А в свой вызываемый скрипт вносите дополнение, чтобы он определял с каким номером его вызвали и с тем же номером создавал файл. Всё просто и понятно вроде...
Vitaliy вне форума   Ответить с цитированием
Ответ



Реклама

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Закладки Добавить Тема в закладки

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 14:20. Часовой пояс GMT +4.