Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скорость работы Curl, file_get_contents(), ...
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Скорость работы Curl, file_get_contents(), ...

Страниц (1): [1]
 

1. Behelit - 20 Мая, 2015 - 13:29:27 - перейти к сообщению
На удалённом сайте API необходимо парсить JSON-файл, который весит 2.2 мб.

Вопрос: почему с Браузера этот JSON файл скачивается менее одной секунды, а через php (curl или file_get_contents()) загружается от 4 до 20 секунд?

Подскажите пожалуйста, может мне стоит использовать для выкачки JSON другой метод?
Или в настройках PHP надо копаться, если да, то где копать?

Трафик безлимитный, свой сервер, unix debian, php 5.4

---

Если будет не трудно, проверьте, такая же у вас беда с этим хостом?

1. Скорость захода через браузер: http://api[dot]steampowered[dot]com/IDOT[dot][dot][dot]3D9E0FB7B2910EED (у меня сюда заходит около 1 секунды)

2. И скорость php:
PHP:
скопировать код в буфер обмена
  1. $time_test = time();
  2. $url = 'http://api.steampowered.com/IDOTA2Match_570/GetMatchHistoryBySequenceNum/v001/?key=172075779AAB64773D9E0FB7B2910EED';
  3. $page = file_get_contents($url);
  4. echo time()-$time_test;
  5. echo ' sec<br><br>';
  6. echo $page;

(тут у меня от 4 до 18 секунд) - всегда по разному
2. Ch_chov - 20 Мая, 2015 - 13:54:26 - перейти к сообщению
Скрипт на локалхосте запускается?
(Добавление)
CODE (text):
скопировать код в буфер обмена
  1. $ time curl http://api.steampowered.com/IDOTA2Match_570/GetMatchHistoryBySequenceNum/v001/?key=172075779AAB64773D9E0FB7B2910EED &> /dev/null
  2.  
  3. real    0m2.632s
  4. user    0m0.009s
  5. sys     0m0.007s
3. Behelit - 20 Мая, 2015 - 13:58:38 - перейти к сообщению
Да, запускается
(Добавление)
Ch_chov пишет:
Скрипт на локалхосте запускается?
(Добавление)
CODE (text):
скопировать код в буфер обмена
  1. $ time curl http://api.steampowered.com/IDOTA2Match_570/GetMatchHistoryBySequenceNum/v001/?key=172075779AAB64773D9E0FB7B2910EED &> /dev/null
  2.  
  3. real    0m2.632s
  4. user    0m0.009s
  5. sys     0m0.007s

вот в том-то и проблема, что через консоль скорость приемлемая, и через браузер тоже
а как доходит дело до php-скрипта, то скорость выполнения от 5 секунд и выше, что очень долго
4. Behelit - 22 Мая, 2015 - 21:08:10 - перейти к сообщению
как же победить эту проблему, господа?
В чем уязвимость file_get_contents(), curl ? Почему так долго выкачивает?
5. Behelit - 23 Мая, 2015 - 19:18:01 - перейти к сообщению
кто-нибудь сталкивался с подобной ситуацией?
6. OrmaJever - 23 Мая, 2015 - 20:40:51 - перейти к сообщению
А я вот проверил и у меня тоже такая же беда. курл и файл_гет_контентс = 9-10 сек, а в браузере около 1секунды. Давайте поразмышляем на эту тему Однако
7. LIME - 23 Мая, 2015 - 20:45:36 - перейти к сообщению
Давайте
Мне тоже стало интересно
В браузере 1.7 сек а в php 4-5 сек
Предположил что изза поэтапного выделения памяти
Сначала выделил $page = str_repeat('a', 1024 * 1024 * 3);
Не помогло
(Добавление)
Еще есть предположение о keep alive
Надо запустить curl несколько раз без закрытия дескриптора и замерить время для каждого обращения
Я не могу сейчас
8. Panoptik - 23 Мая, 2015 - 20:52:08 - перейти к сообщению
предполагаю что долго резолвится днс. браузер использует кеш, поэтому быстро, а пхп каждый раз спрашивает
9. LIME - 23 Мая, 2015 - 20:53:41 - перейти к сообщению
Днс кэшируется на уровне ос
Но вот соединение возможно да
О чем выше написал
10. DeepVarvar - 23 Мая, 2015 - 21:09:53 - перейти к сообщению
Юзерагент.
11. LIME - 23 Мая, 2015 - 21:24:36 - перейти к сообщению
что юзерагент?
всмысле сервис по разному реагирует?
дык он для роботов и создан наверное

PHP:
скопировать код в буфер обмена
  1.  
  2. $time_test = time();
  3. $url = 'http://api.steampowered.com/IDOTA2Match_570/GetMatchHistoryBySequenceNum/v001/?key=172075779AAB64773D9E0FB7B2910EED';
  4. $ch = curl_init($url);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. echo (time()-$time_test) . ' sec<br><br>';// 0 sec
  7.  
  8. $time_test = time();
  9. $page1 = curl_exec($ch);
  10. echo (time()-$time_test) . ' sec<br><br>';// 2-3 sec
  11.  
  12. $time_test = time();
  13. $page2 = curl_exec($ch);
  14. echo (time()-$time_test) . ' sec<br><br>';// 0-1 sec
  15.  
  16. var_dump($page1===$page2);// boolean true
  17.  

как бэ так
можно еще резолвить хост в ip и хост добавлять вручную чтоб проверить на днс
но мне больно и неудобно)
болею я(
12. Мелкий - 23 Мая, 2015 - 21:45:18 - перейти к сообщению
Нашли тоже загадку века.
браузер: начало ответа через 0,62с, 1,14с всего на запрос
curl: starttransfer_time 0.72с, total_time 2.15с
curl с user-agent: starttransfer_time 0,65с, total_time 3.41
Ничего странного не видите? Нет, я не про всего затраченного времени, я про постоянную метку начала передачи ответа.

И что же позволяет браузеру на том же канале прокачать аж полмегабайта текста гораздо быстрее, но чего по-умолчанию не делают низкоуровневые штуки? gzip, конечно.
curl, gzip: starttransfer_time 0,66с, total_time 1.18с
13. LIME - 23 Мая, 2015 - 21:51:14 - перейти к сообщению
Мелкий да
Про сжатие совсем забыл
А что же так повлияло в моем случае? Разгон соединения чтоли?
(Добавление)
Хотя данных немного
14. Мелкий - 23 Мая, 2015 - 22:26:12 - перейти к сообщению
LIME, наверное, то же самое, почему у меня у курла разница в полтора раза после добавления юзерагента. Тяжёлый запрос и нагруженный сервис. Попал запрос на другую ноду, у которой сеть загружена меньше и всего делов.
15. LIME - 23 Мая, 2015 - 22:28:31 - перейти к сообщению
Точно нет
Проверял не 1 раз
Видимо все в совокупности
Ведь сохранение соединения и его разгон тоже должны повлиять

 

Powered by ExBB FM 1.0 RC1