Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Multi thread w PHP
Forum PHP.pl > Forum > PHP
sebax3x
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.




in5ane
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ść).
aniolekx
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)
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.