Обработка большого массива данных

Iga

Гуру форума
Регистрация
12 Янв 2014
Сообщения
425
Реакции
83
Всем привет!
На входе есть файл с адресами страниц сайта, много 15тыс+. Их надо сократить через tinyurl, к примеру.
С php я знаком поверхностно, т.к. скорее просто верстальщик. Но у меня благополучно получилось вытаскивать из файла список ссылок, загонять его в массив и потом через foreach отправлять ссылки на api tinyurl и потом записывать результат в файл.
Вроде бы всё работает, но работает оно при количестве ссылок в штук 50, далее сервак отдаёт 500 и в логе таймаут. В настройках ставил таймаут с большим количеством нулей, но это не помогло особо.
Собственно вопрос. Может как-то можно брать этот массив кусками и постепенно записывать его в файл? Чтобы это происходило не одной операцией, а множеством, тем самым не снося мозги у сервака.
 
Доброе

Если честно, php слаб перед такими задачами
Посмотрите в сторону Go
Я за день смог с ним разобраться и написать парсер каталога, на котором php захлебывался
Сперва вы победите таймауты, потом будете бороться с памятью

Но если не хотите, то всегда можно что-то придумать;)
PHP однопоточный язык, глубоко 7-ю не изучал, возможно там поменялось чего
Я бы поступил так:
Разбил файлы на порции с которыми один потом php справлятся
Через bash написал бы скриптец, который перебирает папку и скармливал поштучно файлы уже php скрипту

Конечно будет N запросов, равном кол-во файлов, зато так получится распараллелить
 
  • Нравится
Реакции: Iga
Всем привет!
На входе есть файл с адресами страниц сайта, много 15тыс+. Их надо сократить через tinyurl, к примеру.
С php я знаком поверхностно, т.к. скорее просто верстальщик. Но у меня благополучно получилось вытаскивать из файла список ссылок, загонять его в массив и потом через foreach отправлять ссылки на api tinyurl и потом записывать результат в файл.
Вроде бы всё работает, но работает оно при количестве ссылок в штук 50, далее сервак отдаёт 500 и в логе таймаут. В настройках ставил таймаут с большим количеством нулей, но это не помогло особо.
Собственно вопрос. Может как-то можно брать этот массив кусками и постепенно записывать его в файл? Чтобы это происходило не одной операцией, а множеством, тем самым не снося мозги у сервака.
запустите скрипт из консоли, будет вам счастье. это в случае если падает по таймауту.

если по памяти - тогда можно посмотреть в сторону итераторов.
 
  • Нравится
Реакции: Iga
дело не в php - 15тыс это не проблема. Время "уходит" на связь с айпи и получение ответа. Предпочтительный вариант это консоль, но можно извратиться - закатать список в базу, далее скриптом выбирать ограниченное количество (подобрать опытным путем) при котором не падает сервак, обрабатывать их проставляя какой-то статус и перезапускать сам скрипт
 
Всем привет!
На входе есть файл с адресами страниц сайта, много 15тыс+. Их надо сократить через tinyurl, к примеру.
С php я знаком поверхностно, т.к. скорее просто верстальщик. Но у меня благополучно получилось вытаскивать из файла список ссылок, загонять его в массив и потом через foreach отправлять ссылки на api tinyurl и потом записывать результат в файл.
Вроде бы всё работает, но работает оно при количестве ссылок в штук 50, далее сервак отдаёт 500 и в логе таймаут. В настройках ставил таймаут с большим количеством нулей, но это не помогло особо.
Собственно вопрос. Может как-то можно брать этот массив кусками и постепенно записывать его в файл? Чтобы это происходило не одной операцией, а множеством, тем самым не снося мозги у сервака.

Судя по всему Вы пытаетесь запустить это все дело через браузер. Обычно в php для браузера стоит таймаут - 30,60 секунд на выполнение скрипта. Соответственно скрипт падает после некоторого количества запросов.
Решений несколько:
1. Правильное. Запускайте скрипт непосредственно из консоли
Код:
php shorter.php >result
2. Решение, которое в зависимости от настроек сервера либо сработает либо нет:
Код:
<?php
set_time_limit ( 0 );
3. Совсем неправильное решение, но тоже сработает, если нет дополнительного ограничения в самом сервере (nginx, apache...)
Код:
В php.ini найдите и замените

max_execution_time = 0

Также хочу заметить, что ошибка 500 это ошибка в скрипте, а не таймаут (но может и быть ньюанс настроки сервера). Возможно падает по памяти.
Если в логах таймаут от исполняющего сервера, то скорее всего пункты 2 и 3 не помогут.
 
  • Нравится
Реакции: Iga
Судя по всему Вы пытаетесь запустить это все дело через браузер
Да, через него.

В общем, установил я OpenServer, поставил ему max_execution_time = 0 в php.ini и запустил так же через браузер и всё отработало за 2.5 часа.

Будет время, попробую какие-нить из предложенных выше вариантов, так, чисто для саморазвития :)
 
Назад
Сверху