Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wywoływanie równolegle skryptu z różnymi parametrami
athabus
post 2.12.2015, 13:42:23
Post #1





Grupa: Zarejestrowani
Postów: 893
Pomógł: 45
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
redeemer
post 2.12.2015, 13:50:08
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
athabus
post 2.12.2015, 13:54:49
Post #3





Grupa: Zarejestrowani
Postów: 893
Pomógł: 45
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
redeemer
post 2.12.2015, 14:07:25
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
athabus
post 2.12.2015, 14:25:14
Post #5





Grupa: Zarejestrowani
Postów: 893
Pomógł: 45
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
Pyton_000
post 2.12.2015, 14:44:32
Post #6





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Wrzuć sobie requesty do jakiegoś zew. systemu kolejkowania i niech tamten odpala zadania
Go to the top of the page
+Quote Post
phpion
post 2.12.2015, 15:11:57
Post #7





Grupa: Moderatorzy
Postów: 6 065
Pomógł: 857
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Rozważ użycie curl_multi, przykład całości w manualu dla curl_multi_exec + warto poczytać komentarze.
Go to the top of the page
+Quote Post
athabus
post 2.12.2015, 16:26:28
Post #8





Grupa: Zarejestrowani
Postów: 893
Pomógł: 45
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post
Pyton_000
post 2.12.2015, 16:32:31
Post #9





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
athabus
post 2.12.2015, 16:44:19
Post #10





Grupa: Zarejestrowani
Postów: 893
Pomógł: 45
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.11.2019 - 20:52