Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Bazy danych PHP

Skrypt PHP otworzył połączenie funkcją mysqli_connect('localhost', 'root', '', 'szkola'), ale nie wywołał mysqli_close(). Co stanie się z tym połączeniem po zakończeniu wykonywania skryptu?

A. Skrypt zakończy się błędem krytycznym zgłoszonym przez interpreter.
Źle. Brak mysqli_close() nie jest błędem; funkcja jest zalecana, ale nieobowiązkowa.
B. Zostanie zamknięte automatycznie przez PHP.
Dobrze. Po zakończeniu skryptu PHP zwalnia zasoby i zamyka zwykłe połączenie z bazą.
C. Pozostanie otwarte do ponownego uruchomienia serwera MySQL.
Źle. Zwykłe połączenie PHP zamyka po zakończeniu skryptu; otwarte zostają tylko połączenia trwałe p:.
D. Zmiany zapisane przez skrypt w bazie zostaną automatycznie cofnięte.
Źle. W trybie autocommit zmiany są zatwierdzane od razu i nie znikają po zakończeniu skryptu.

Zwykłe połączenie otwarte przez mysqli_connect() żyje tylko tak długo jak skrypt. Po jego zakończeniu PHP zwalnia wszystkie zasoby, w tym połączenia z bazą, więc serwer MySQL widzi rozłączenie klienta. Dlatego brak mysqli_close() w krótkim skrypcie nie powoduje błędu.

Jawne zamknięcie ma jednak sens. Gdy skrypt po pobraniu danych długo jeszcze pracuje, na przykład generuje duży raport, połączenie niepotrzebnie zajmuje miejsce w limicie serwera (max_connections). Wyjątkiem są połączenia trwałe, otwierane z przedrostkiem p: przed nazwą hosta - te PHP celowo zostawia otwarte do ponownego użycia.

W krótkich skryptach strony różnica jest więc niewielka, ale nawyk jawnego zamykania połączenia się opłaca.

Obawa, że połączenie „wisi” aż do restartu serwera, wynika z przenoszenia nawyków z programów działających stale. Skrypt PHP przy typowej obsłudze strony kończy się po wysłaniu odpowiedzi, a wtedy interpreter sam zamyka zwykłe połączenia. Otwarte pozostają tylko połączenia trwałe, oznaczone przedrostkiem p:.

Brak mysqli_close() nie jest też błędem składni ani błędem wykonania, więc interpreter niczego nie zgłasza. Funkcja jest zalecana, ale nie obowiązkowa.

Nie ma również cofania zmian. MySQL domyślnie działa w trybie autocommit, w którym każde INSERT, UPDATE czy DELETE jest zatwierdzane od razu. Wycofane zostałyby tylko zmiany z rozpoczętej i niezatwierdzonej transakcji, a w treści zadania nie ma mowy o transakcji.

W praktyce warto mimo to zamykać połączenie jawnie, bo kod staje się czytelniejszy, a zasoby serwera zwalniane są wcześniej.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.