Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywoływanie równolegle skryptu z różnymi parametrami
Forum PHP.pl > Forum > PHP
athabus
Mam mały problem - moja aplikacja łączy się z zewnętrznym serwerem i pobiera/wysyła do niego dane. Tak więc w czasie gdy oczekuje odpowiedzi z serwera skrypt nic nie robi. Problem jest taki, że takich zapytań muszę wykonać kilka-kilkadziesiąt tysięcy w możliwie krótkim czasie.

Pomysł jest taki, że chciałbym uruchomić skrypt "równolegle" kilkukrotnie - taki pseudokod

  1.  
  2. file_get_contents($url?param=1);
  3. file_get_contents($url?param=2);
  4. file_get_contents($url?param=3);
  5. file_get_contents($url?param=4);
  6.  


Oczywiście file_get_contents używam, jako przykład - w rzeczywistości będzie to wywołanie metody klasy, która odpowiada za łączność z serwerem.

Powyższy pseudokod wykona się po kolei - ja chciałbym aby wszystkie te połączenia wykonały się równolegle - czyli, żeby drugie wywołanie nie czekało aż skończy się pierwsze itd.

Ograniczenia jakie mam:
- nie mogę używać skryptów cli
- musi to działać w miarę standardowej konfiguracji serwera bez konieczności instalowania egzotycznych dodatków
- skrypt główny musi być wywoływany z cron'a więc wszelkie javascriptowe sztuczki też odpadają

Dodam, że skrypt będzie działał w oparciu o Symfony2 - może jest tam jakieś rozwiązanie pozwalające na to.

redeemer
Cytat(athabus @ 2.12.2015, 13:42:23 ) *
...
Ograniczenia jakie mam:
- nie mogę używać skryptów cli
- musi to działać w miarę standardowej konfiguracji serwera bez konieczności instalowania egzotycznych dodatków
- skrypt główny musi być wywoływany z cron'a więc wszelkie javascriptowe sztuczki też odpadają
...
Jak nie możesz używać skryptów CLI to co chcesz odpalać z crona?
athabus
Z crona chcę wywołać skrypt webowy - z tego co wiem na niektórych hostingach jest tak, że cronem można wywołać adres url z serwera, ale już się nie da wywołać skryptu cli - tak przynajmniej mi kiedyś tutaj na forum napisano, że niektóre hostingi nie pozwalają na uruchamianie skryptów cli.
redeemer
Nie spotkałem się z czymś takim (może chodzi Ci o zablokowane wywołania funkcji exec(), system() itd, a to nie ma nic wspólnego z cronem). Spotkałem się natomiast z sytuacją w aplikacjach gdzie w cronie było: "wget adresstrony.pl/skrypt.php", ale równie dobrze można by tam wtawić "cd katalog_niedostepny_z_www/; php skrypt.php". Do takiego urla trzeba również dorobić blokowanie po IP (bo nie chcemy żeby każdy mógł sobie "wyzwolić" skrypt , chociaż najnowsze badania każą wątpić w takie zabezpieczenie: http://lgms.nl/blog-2
athabus
Czyli co twierdzisz, że takie blokowanie cli się praktycznie nie zdarza? Chodzi to o zwykłe zadania php typu curl itp?

Hmm, no gdyby tak rzeczywiście było to by rozwiązywało mój problem. Co prawda chyba gdzieś widziałem panele crona, które pozwalają wywołać tylko adres webowy i innej rzeczy nie wprowadzisz, ale to nie jest dla mnie problem, bo w Symfony mogę wywołać komendę z poziomu zwykłego kontrollera i zdaje się, jest tam też dodatek, który pozwala tworzyć multi-threading dla komend.

Czyli zrobiłbym tak:
- komenda główna wywołująca określoną ilość komend równolegle
- dla sytuacji, w których cron nie pozwala na jawne wywołanie cli webowa akcja wywołująca komendę główną.
Pyton_000
Wrzuć sobie requesty do jakiegoś zew. systemu kolejkowania i niech tamten odpala zadania
phpion
Rozważ użycie curl_multi, przykład całości w manualu dla curl_multi_exec + warto poczytać komentarze.
athabus
@python_000 - niestety tutaj sprawa jest bardziej złożona bo nie znam z góry kiedy i ile razy będę musiał proces wywołać - to zależy od tego co user będzie miał w bazie. Niektórzy mogą mieć 100-500 wywołań, a inni liczone w setkach tysięcy + to będą akcje "jednorazowe" - zazwyczaj wykonywane raz lub dwa razy w tygodniu - przez pozostałą część czasu apka będzie bezczynna. Można by robić jakieś kolejki typu najpierw wywoływać skrypt A, który oblicza ilość potrzebnych wywołań i wrzuca to do kolejki i potem jakoś tą kolejkę obsługuje, ale trochę tu za dużo zabawy.

@phpion - o to też ciekawe rozwiązanie.
Myślę, że na początek spróbuję to zrobić za pomocą poleceń CLI, ale całą logikę wrzucę do Services - jak ludzie będą zgłaszać, że nie mogą na swoich serwerach działać za pomocą CLI to dopiszę coś webowego - tu to curl_multi_exec wygląda obiecująco.

Dzięki wszystkim za pomoc.
Pyton_000
No i co z tego. W swojej aplikacji podczas wywoływania akcji wysyłasz do kolejki powiedzmy 500 requestów, potem np. 10 workerów równolegle będzie Ci wywoływać dane requesty.
Czyli defacto masz użyć Symfonowego Queue ale z serwisem zew. i tyle. żadnej skomplikowanej roboty nie ma.
athabus
A widzisz, to chyba nie wiem o czym piszesz ;-)

Nakierowałbyś mnie na jakieś artykuły o tym albo opisał w skrócie ideę wykonania takiego systemu - na szybko szukałem w Google, ale nic konkretnego mi nie wpadło w oko, a nigdy wcześniej nic podobnego nie robiłem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.