2012-11-30 8 views
8

zrobiłem długi skrypt w PHP, takich jak:Długi bieg tło bloki PHP Script innych stron PHP, dopóki nie zostanie zakończone

ignore_user_abort(true); 
set_time_limit(0); 

To działa doskonale w tle, nawet jeśli ja zamknąć stronę. Mój problem polega na tym, że nie mogę otworzyć innych plików PHP, dopóki ten skrypt nie zostanie uruchomiony w tle. Jak mogę rozwiązać ten problem?

+1

Does ten skrypt plus t strony, które są zablokowane sesje użytkowania? –

+0

Do czasu uruchomienia długiego skryptu lub do momentu jego zakończenia? – cegfault

+0

@SalmanA Tak, moje pliki używają sesji, czy to problem? – martincpt

Odpowiedz

17

Gdy skrypt PHP używa sesji, PHP blokuje plik sesji do czasu zakończenia działania skryptu. Żądanie strony, które próbuje użyć zablokowanej sesji, jest blokowane, dopóki plik sesji nie zostanie zwolniony. PHP robi to tak, że sesje pozostają w stałym stanie. Quote from PHP bug #31464:

[2005-01-10 08:13 UTC] Derick w php Dot Net

To rzeczywiście nie jest błąd w ogóle, przedłużenie sesji musi zablokować plik sesji tak, że jednoczesne aktualizacje nie mogą uszkodzić pliku. Oznacza to, że wszystkie skrypty używające tego samego pliku sesji muszą mieć numer seryjny . Aby poprawić wydajność, można użyć http://php.net/session_write_close, gdy tylko skończysz odczytywanie/ustawianie zmiennych sesji, co spowoduje usunięcie blokady pliku .

Najprostszym obejście w sposób opisany powyżej here as well jest:

  • wezwanie session_start()
  • zapisu/odczytu zmienne sesyjne
  • wezwanie session_write_close()
  • zrobić długie przetwarzanie
4

Jak wspomniano w komentarzach, problem stanowią sesje - dzieje się tak dlatego, że plik sesji jest zablokowany.

Użyj długo działającego skryptu, aby odblokować plik sesji, ale pamiętaj, że nie możesz później użyć zmiennych $_SESSION w tym skrypcie.

+0

Dziękuję za odpowiedź Kolink, zaproponowałem, że przyjmuję odpowiedź SalmanA, jeśli chce ją napisać, ponieważ był pierwszy. Inne przypadki przyjmuję twoją odpowiedź. – martincpt

Powiązane problemy