Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Multi thread w PHP
sebax3x
post
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 8.03.2008

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


Cześć,

Mam funkcję w php, która pobiera dane z innej strony, jedno wywołanie trwa ok 30 sek - pobiera dane,obrazki, konkwertuje.
Chciałbym odpalić ją kilka razy w tym samym czasie dla różnych danych, aby przyspieszyć proces (czyli coś na zasadzie multi threading).

Próbowałem z klasą Thread https://github.com/krakjoe/pthreads, ale był z ną problem na moim serwerze (nie chcę tego używać).
Próbowałem też za pomocą:

  1. for ($i=0; $i<10; $i++) {
  2. // open ten processes
  3. for ($j=0; $j<10; $j++) {
  4. $pipe[$j] = popen('script2.php', 'w');
  5. }
  6.  
  7. // wait for them to finish
  8. for ($j=0; $j<10; ++$j) {
  9. pclose($pipe[$j]);
  10. }
  11. }


Ale wogle nie odpala się skrypt script2.php,

curl multi init w moim przypadku się nie sprawdzi - chciałbym coś podobnego, ale żeby to działało nie na zasadzie asynchronicznego pobierania stron, tylko wywoływania mojej funkcji.




Go to the top of the page
+Quote Post
in5ane
post
Post #2





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


PHP samo z siebie nie jest wielowątkowe. Proponuję użyć Gearman'a, który ma też bibliotekę dla PHP. Tutaj prosty tutorial.

Ewentualnie proponuję do pobrania tych danych użyć innego języka. Polecam golang, który ma rutyny (taka wielowątkowość).


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
aniolekx
post
Post #3





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


nie dziala bo zapomniales dodac "php" przed skryptem

trochę zmodyfikowałem twoja wersje:

  1. $processes = [];
  2. $errors = [];
  3. for ($ii=0; $ii<10; $ii++) {
  4. for ($j=0; $j<10; $j++) {
  5. $processes[$j] = popen('php script2.php', 'r');
  6. }
  7. foreach ($processes as $i => $process) {
  8. $error_text = stream_get_contents($process);
  9. if ($error_text != "") {
  10. $errors[] = "From threading process #$i:";
  11. foreach (explode("\n", $error_text) as $error) {
  12. $errors[] = $error;
  13. }
  14. }
  15. $status = pclose($process);
  16. if ($status != 0) {
  17. $errors[] = "Child process exited with status $status";
  18. }
  19. }
  20. }
  21.  
  22. var_dump($errors)


Ten post edytował aniolekx 4.11.2014, 14:16:20
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 Aktualny czas: 19.08.2025 - 04:57