Jakub Bartkowiak

Jakub Bartkowiak Informatyk -
Administrator Sieci
WIFI

Temat: curl

Witam.
Mam takie pytanie, co jest szybsze, pobieranie danych curl-em i dodawanie rekordu do csv czy do mysql ??
Aktualnie pobieram za pomocą pętli z jednej strony lecz z kilku podstron.
Dokładnie to sklep od którego mam pozwolenie na kopiowanie ich treści, gdyż sprzedaje ich produkty.
Pętla zmienia nr podstrony na zasadzie http://adres.pl/produkty/1 , .../produkt/2/ itd. z każdej podstrony pobiera opis produkty nazwę i cenę.
Cały skrypt w php wykonuje się bardzo pomału, gdyż każdy rekord dopisuje do pliku csv linijka po linijce.
Do pobrania mam około 3 tyś produktów. Skrypt za długo się wykonuje i serwer w końcu wywala połączenie.

Jak można to najlepiej zrobić ?
Z góry dzięki za każdą podpowiedz.

konto usunięte

Temat: curl

a nie ma czegoś bardziej eleganckiego np. jakieś API?

konto usunięte

Temat: curl

1. Jak masz już napisany parser do każdej z podstron zawierających informacje o produkcie, to podziel ilość stron ładowanych jednocześnie na mniejsze porcje i ustaw sobie aktualizację przy użyciu harmonogramu cron.

lub

2. Przy odpowiednich uprawnieniach do konfiguracji serwera możesz zmienić maksymalny czas wykonywania skryptu co umożliwi załadowanie całej bazy jednocześnie.

http://www.php.net/manual/en/info.configuration.php#in...
http://www.php.net/manual/en/function.set-time-limit.php

konto usunięte

Temat: curl

Jesli masz dostep do shella zeby ustawic crona - to tak jak napisal przedmowca, dodaj wykonywanie skryptu przez cron. Skrypty wykonywane z poziomu shella nie maja limitu czasu na wykonanie wiec powinno sie ladnie zaladowac.

Czy do bazy czy do csv - ja bym wybral do bazy - raz ze masz juz to w bazie i nie musisz teraz robic kolejnej akcji aby wrzucic to do siebie, a poza tym - jesli potrzebujesz z jakiegos powodu miec to w csv to mozesz pozniej zrobic sobie export z bazy.

Of kors najlepsze byloby API tak jak napisal Przemek.

Zrob sobie jakies logowanie bledow - bedziesz mial problem przy obecnym rozwiazaniu jesli zmieni sie struktura html
Kamil S.

Kamil S. Backend Engineer and
Symfony Developer

Temat: curl

Ad. tego co napisał Przemek, pewnie fajnie by było mieć coś eleganckiego np API które ładnie zwraca nam dane w liście i wtedy wystarczył by 1 max 2 requesty. Ale znając życie to nie ma takiej opcji bo sklep kiedyś postawiony i dalej obsługiwany przez kogoś kto się na tym nie zna.

Ad. tego czy CSV czy MySQL - w tym przypadku to bez znaczenia, opóźnienia masz nie na zapisie danych u siebie tylko na pobieraniu danych. Lecisz po adresach, musisz czekać aż serwer po drugiej stronie Ci odpowie, pobrać request i jeszcze go przemielić u siebie .. to trwa pewnie ok 1s więc sam zapis to ułamek całości. Pewnie robisz też jeden request a nie kilka równolegle.

Najlepszym sposobem jest tak jak napisali przedmówcy, zrobienie prostego skryptu importującego i uruchamianie go w cronie serwera co jakiś czas. On sobie będzie 'pod spodem' robił robotę i nie będzie miał ograniczeń czasowych. Takie skrypty potrafią się długo wykonywać bo są zależne od innych usług.

Co do tego czy operować bezpośrednio na bazie czy za pośrednictwem csv. Bezpośrednio na bazie jest spoko ale trzeba pamiętać o tzw. transakcjach. Z takiego skryptu rekordy będą wpadały powoli, co może mieć wpływ na działanie Twojego sklepu. Lepiej pobrać dane, zebrać je do kupy i jednorazowo wstrzyknąć w sklepu. Tak jest bezpieczniej gdy operacje są atomowe, bo gdy coś się po drodze wywali to przerywamy całość bez wpływu na sklep, zaczynamy od nowa, gdy faza nr 1 czyli pobieranie się powiedzie to dopiero wykonujemy fazę nr 2 czyli importowanie.
Jakub Bartkowiak

Jakub Bartkowiak Informatyk -
Administrator Sieci
WIFI

Temat: curl

Dzięki za odpowiedz.
Właśnie jest problem, że nie ma żadnego api, widać nie przewidzieli, że z małego sklepu rozwiną się do poziomu hurtowni.

Myślę, że zrobię tak jak mówicie, skrypt na prywatnym serwerze, innym niż ten od sklepu, dzięki czemu nie spowolnię sklepu. Skrypt wrzuci do bazy mysql stworzonej tylko do importu. A dopiero z tej bazy będę wysyłał obrobione rekordy do sklepu.

Jedynie zostaje problem aktualizacji cen, aby szybciej wykonywał się skrypt, bo po co pobiera drugi raz ten sam opis produktu.

Oraz ostatni problem, ale to w innym dziale na forum, sklep postawiony na prestashop jak zaimportuje dane to 3tyś produktów ręcznie uporządkować do kategorii będzie masakra. Ale małymi krokami zrobi się wszystko.

Jeszcze raz dzięki za pomoc i życzę Wesołych Świąt.
Ireneusz Derbich

Ireneusz Derbich Web Developer

Temat: curl

Skrypt do importu danych piszesz by wykonać go raz (aktualizacje cen to inna kwestia). Zwykle w takich sprawach goni nas czas, bo przecież im szybciej to załatwimy tym lepiej. Nie rostrząsałbym tu kwesti czy zapisac do csv czy od razu do bazy danych, bo to zależy wyłącznie od preferenji programisty czy chce mu się pisac na gotowo czy pracować z ułożonymi danymi i dopisać później import do bazy danych. Ja osobiście wolę mieć wyląd w dane zanim polecą do bazy danych, bo zawsze mogą się jakieś niespodziewane "kwiatki" pojawić. Jeśli zależy Ci na skróceniu czasu wykonywania się skryptu to najwymierniejsze efekty uzyskasz skracając ilość zapytań, choć pewnie masz to już załatwione. Ogólnie co chcę przekazać to to, że czasem nie warto tracić czasu na dopracowywanie skryptu do maximum jeśli ma on być odpalony raz. Nad skryptem do aktualizacji cen popracujesz.

Zapomniałbym: skrypt odpal na oddzielnej/lokalnej maszynie zwiększając jej czas wykonywania skryptu ile wlezie, najwyżej zabijesz proces gdy stwierdzisz, że coś jest nie tak.

Btw. Integrowałem kiedyś w taki sposób 15tyś produktów i nie trwało to jakoś super długo.Ten post został edytowany przez Autora dnia 28.12.13 o godzinie 13:59
Daniel Częstki

Daniel Częstki senior php developer

Temat: curl

Jeżeli robisz to lokalnie to ustaw sobie limit czasu wykonania skryptu php na np. 10 godzin ;)
ewentualnie po pobraniu jednej strony poprzez curl, sprasowaniu jej i zapisaniu danych przejdz ponownie na adres skryptu pobierającego dane ale z nowym id poprzez location w header.
a czy zapiszesz do csv czy do bazy do sprawa drugorzędna.

konto usunięte

Temat: curl

może to nie do końca w temacie, ale Python ma wątki, .NET/JAVA ma je na pewno
może lepiej iść w tą stronę?
Kamil S.

Kamil S. Backend Engineer and
Symfony Developer

Temat: curl

To czy aktualizowane są tylko ceny czy robiony cały import jest bez znaczenia bo i tak musi wyjść żądanie do serwera i tak trzeba pobrać cały kontent ;) To wszystko to kwestia organizacji pajączka który będzie dalej latał po stronie i pobierał odpowiednie dane. @Przemysław w PHP też można pracować z wątkami i działa to całkiem sprawnie i jest na to kilka sposobów ;)

to jeden z nich: https://github.com/braincrafted/background-process

konto usunięte

Temat: curl

Kamil S.:
To czy aktualizowane są tylko ceny czy robiony cały import jest bez znaczenia bo i tak musi wyjść żądanie do serwera i tak trzeba pobrać cały kontent ;) To wszystko to kwestia organizacji pajączka który będzie dalej latał po stronie i pobierał odpowiednie dane. @Przemysław w PHP też można pracować z wątkami i działa to całkiem sprawnie i jest na to kilka sposobów ;)

to jeden z nich: https://github.com/braincrafted/background-process

to nie są wątki w PHP tylko w systemie :) zrobione za pomocą shell_execute
to tak jakby wyrób czekoladopodobny nazwać pralinką Lind
Kamil S.

Kamil S. Backend Engineer and
Symfony Developer

Temat: curl

Przemysław R.:
Kamil S.:
To czy aktualizowane są tylko ceny czy robiony cały import jest bez znaczenia bo i tak musi wyjść żądanie do serwera i tak trzeba pobrać cały kontent ;) To wszystko to kwestia organizacji pajączka który będzie dalej latał po stronie i pobierał odpowiednie dane. @Przemysław w PHP też można pracować z wątkami i działa to całkiem sprawnie i jest na to kilka sposobów ;)

to jeden z nich: https://github.com/braincrafted/background-process

to nie są wątki w PHP tylko w systemie :) zrobione za pomocą shell_execute
to tak jakby wyrób czekoladopodobny nazwać pralinką Lind

podałem prosty przykład jest jeszcze rzeczona czekolada: http://pl1.php.net/pcntl

swoją drogą, jedno i drugie rozwiązanie spełnia swoją rolę i to chyba jest najistotniejsze ;)Ten post został edytowany przez Autora dnia 02.01.14 o godzinie 15:32

konto usunięte

Temat: curl

Kamil S.:
podałem prosty przykład jest jeszcze rzeczona czekolada: http://pl1.php.net/pcntl

swoją drogą, jedno i drugie rozwiązanie spełnia swoją rolę i to chyba jest najistotniejsze ;)

odpaliłem to coś i nigdy więcej, jakieś dziwne procesy

konto usunięte

Temat: curl

Może to: https://github.com/reactphp/react
Nie sprawdzałem, ale wygląda obiecująco.

Następna dyskusja:

curl na lokalnym serwerze




Wyślij zaproszenie do