Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Kilka procesów jednocześnie
faran
post 7.02.2011, 12:27:54
Post #1





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 27.10.2006
Skąd: CyberRZECZYWISTOŚĆ

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


Witam,
Da się jakoś w php uruchomić kilka procesów/funkcji/obiektów jednocześnie ?
Go to the top of the page
+Quote Post
Noidea
post 7.02.2011, 12:52:37
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


http://php.net/manual/en/book.pcntl.php


Dodatkowo kiedyś spotkałem się z takim dziwnym tworem jak:
pierwszy.php
  1. <?php
  2.  
  3. $curl = curl_init( "http://adres.pl/drugi.php" );
  4. curl_setopt( $curl, CURLOPT_NOBODY, true );
  5. curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
  6. curl_exec( $curl );
  7. curl_close( $curl );
  8.  
  9. // operacje
  10.  
  11. ?>


drugi.php
  1. <?php
  2.  
  3. flush(); // Wysyła nagłówki, żeby pierwszy.php mógł przejść do wykonywania operacji
  4.  
  5. // operacje
  6.  
  7. ?>


Nie pamiętam czy dokładnie tak to wyglądało, ale sposób działania przedstawiłem.
Pokazuje to, że nawet w tak niekorzystnym środowisku jak PHP ludzie sobie radzą wink.gif

Ten post edytował Noidea 7.02.2011, 12:56:09


--------------------
Go to the top of the page
+Quote Post
Crozin
post 7.02.2011, 12:56:56
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Możesz uruchomić kolejne skrypty PHP wywołując odpowiednie komendy w systemie (tutaj małe ułatwienie: https://github.com/symfony/symfony/tree/mas...mponent/Process ) ale z wielowątkowością jako taką nie ma to nic wspólnego - PHP nie obsługuje jej.
Go to the top of the page
+Quote Post
faran
post 7.02.2011, 12:59:28
Post #4





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 27.10.2006
Skąd: CyberRZECZYWISTOŚĆ

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


w pierwszym przykładzie przerwie działanie w curl_close lub curl_exec.
Drugi przykład to tylko ignorowanie gdy user kliknie na ignoruj + nieograniczony czas wykonywania.
Nie rozwiązuje to problemu sad.gif.
Go to the top of the page
+Quote Post
Noidea
post 7.02.2011, 13:06:40
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


@faran Nieeeeee! To nie miało być rozwiązanie twojego problemu, tylko ciekawostka, która mi się przypomniała. Tam nawet joina normalnego nie da się zrobić. Nie stosuj tego.
Jedno z możliwych rozwiązań podałem ci w linku na samej górze mojego postu.



--------------------
Go to the top of the page
+Quote Post
zegarek84
post 7.02.2011, 14:11:01
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Tak to bywa jeśli ktoś nie opisze za dokładnie problemu... PHP nie wspiera wielo procesowości - fakt, można to delikatnie obejść przy kilku kombinacjach ale podejrzewam, że akurat tutaj Ty szukasz czegoś opisanego na styl blogu gdzie napisano o "wielozadaniowości" i połączeniach asynchronicznych z innymi serwerami:
Guru - Multiplexing
Cytat(Noidea @ 7.02.2011, 12:52:37 ) *
Dodatkowo kiedyś spotkałem się z takim dziwnym tworem jak...

Niestety ale jeśli chodzi o Windowsa to jest to jedno z rozwiązań do wymuszenia nowego procesu - i jedyne jeśli jest zablokowana możliwość wykonywania poleceń konsolowych na serwerze np. ze względów bezpieczeństwa...

dokładniej to potworek którego się uruchamia poprzez bezpośrednie jego wywołanie (curlem, file_get_contents czy czym tam chcecie - lub nawet przeglądarką internetową...) ma strukturę typu:
  1. ini_set('Content-Type','text/html; charset=utf-8');
  2. ignore_user_abort(true); // na wszelki wypadek jeśli połączenie miało by być zamknięte niech wywołany skrypt robi swoje
  3.  
  4. echo 222; // dowolna treść, że skrypt został poprawnie uruchomiony
  5. // nagłówki by nie keszować [by serwery pośredniczące w połączeniu przy kolejnym połączeniu przekazały polecenie dalej a nie zwróciły ostatni bufor] oraz jeśli połączenie otwarte by je zamknąć - czym wcześniej tym lepiej
  6. header('Content-Type: text/html; charset=utf-8');
  7. header('Connection: close');
  8. header('Content-Language: pl');
  9. header('Content-Length: '.ob_get_length());
  10. header('Pragma: public');
  11. header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  12. header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
  13. header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
  14. header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
  15. header ('Pragma: no-cache');
  16. header('Expires: 0');
  17. flush(); // tu już nie pamiętam o co chodziło ale ten flush niestety trzeba wymusić bo nie zawsze działał poprawnie - dlatego powtórzenie podobnych funkcji ;p
  18. // KONIEC POTWORKA
  19.  
  20. /* tutaj chulaj duszo piekła nie ma ;) - róbta co chceta - nawet ignore_user_abort(true); nie jest tu już potrzebny ;p
  21. ale zadbajcie o jakieś komunikaty, kontrolę przez zapisywanie zdarzeń gdzieś - nie wykonało się poprawnie to trzeba powtórzyć ;p
  22.  
  23. WYNIKI GDZIEŚ SOBIE TRZEBA ZAPISAĆ CZY W BAZIE DANYCH CZY W PLIKACH TEKSTOWYCH [W SUMIE TO TEŻ BAZA DANYCH ^^] LUB MOŻE TO JAKIŚ DEMON KTÓRY MA DZIAŁAĆ STALE I NADZOROWAĆ COŚ PUKI NP. NA SERWERZE NIE POJAWI SIĘ JAKIŚ PLIK LUB ZMIENNA W BAZIE DANYCH
  24. */

JAK WIDAĆ SKORO TO MIAŁO DZIAŁAĆ "W TLE" TO NIE MA MOŻLIWOŚCI POZNANIA WYNIKU DZIAŁANIA TAKIEGO SKRYPTU DROGĄ HTTP!!! - będziemy jedynie wiedzieli, że skrypt został poprawnie wykonany - wyniki musimy gdzieś zapisać...

żeby ktoś się słów nie czepiał to w sumie jest możliwość poznania wyników drogą http jeśli potworek jest miniserwerem podpiętym na socketach...

i jeszcze może linki:
[wolontariat]wykonywanie 2 akcji po kliknięciu na button
uruchamianie pliku php co 30s bez właczonego kompa - na serwie - chyba nie będziesz miał cierpliwości przeczytać całego dokładnie ^^
Przekazywanie obiektu COM, Przekazywanie obiektu COM między wywołaniami strony


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
faran
post 7.02.2011, 17:35:00
Post #7





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 27.10.2006
Skąd: CyberRZECZYWISTOŚĆ

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


Orientuje się ktoś czy w php 6 będzie taka możliwość ?
Go to the top of the page
+Quote Post
wookieb
post 7.02.2011, 17:41:03
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(zegarek84 @ 7.02.2011, 14:11:01 ) *
JAK WIDAĆ SKORO TO MIAŁO DZIAŁAĆ "W TLE" TO NIE MA MOŻLIWOŚCI POZNANIA WYNIKU DZIAŁANIA TAKIEGO SKRYPTU DROGĄ HTTP!!!

curl_multi_init
To jeden ze sposobów na odpalanie wielu procesów na RAZ gdzie przez HTTP... odbierzesz wynik

http://pl.php.net/proc_open
Skorzystanie z LIBEVENT http://pl.php.net/manual/pl/ref.libevent.php
Opcji jest całe mnóstwo

Proc_open odradzam ze względu na problemy z segmentation fault
Powód edycji: [


--------------------
Go to the top of the page
+Quote Post
zegarek84
post 7.02.2011, 21:33:22
Post #9





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(wookieb @ 7.02.2011, 17:41:03 ) *
Cytat(zegarek84 @ 7.02.2011, 14:11:01 ) *

JAK WIDAĆ SKORO TO MIAŁO DZIAŁAĆ "W TLE" TO NIE MA MOŻLIWOŚCI POZNANIA WYNIKU DZIAŁANIA TAKIEGO SKRYPTU DROGĄ HTTP!!! - będziemy

curl_multi_init
To jeden ze sposobów na odpalanie wielu procesów na RAZ gdzie przez HTTP... odbierzesz wynik

wystarczyło przeczytać cały mój post a nie cytować mnie ni z gruchy ni z pietruchy - pierwszy link jest o połączeniach asynchronicznych które można wykonać na socketach - także otrzyma się wynik w tym samym procesie [inna bajka, że ten proces uruchomić może wiele innych procesów na innych bądź tym samym serwerze z których można pobrać odpowiedź] - rozwiązanie w zasadzie takie samo jak curl_multi - jednak ja jakoś częściej operuję na samych socketach bądź fsockopen a bardzo rzadko korzystam z curl'a - TO ROZWIĄZANIE TO BARDZIEJ WIELOZADANIOWOŚĆ NIŻ ROZDZIELENIE PROCESÓW...

to co później opisywałem to sposób jak odpalić proces w tle nawet na windowsie gdy nie ma dostępu także do poleceń konsoli...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

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: 29.05.2024 - 12:32