Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Zaawansowane] Problem z bazą danych
Forum PHP.pl > Forum > PHP
no-scared
Witam wszystkich.

Otóż mam taki problem, nie mam pojęcia skąd on się bierze, jest dość nietypowy. Mam dwa pliki:

- /linkchecker/index.php - w tym pliku jest formularz, który po jego wysłaniu dodaje linki umieszczone w tym formularzu do bazy danych. Po wykonaniu tej czynności wysyła za pomocą jQuery.get() żądanie do check_links.php.
- /linkchecker/check_links.php - ten plik pobiera wcześniej dodane do bazy linki i za pomocą cURL wchodzi pokolei do każdego z nich i po sprawdzeniu, czy jest poprawny dodaje o tym wpis do bazy danych (Y lub N).

Problem polega na tym, że jak zostanie wysłane żądanie ajax do check_links.php, to trochę czasu je sprawdza (zazwyczaj się dodaje dużo linków) i w tym czasie nie mogę wejść na inny plik (dostaję fatal error dotyczący max_execution_time, dokument się ładuje aż do tego błędu). Udało mi się ustalić, że prawdopodobnie jest to coś z bazą danych, bo utworzyłem plik /linkchecker/test.php, który przy zawartośći:

  1. echo 'asdasdasdasdasd';


wyświetla się natychmiast, natomiast przy zawartości

  1. require_once('includes/common.php');


również się ładuje w nieskończoność (common.php jedyne co robi to łączy z bazą danych)

Wydaje mi się, że może być to problem typu lock tables albo coś z max_user_connections. Ale nie używam nigdzie w skrypcie żadnych rzeczy typu LOCK/UNLOCK TABLES, a w my.ini nie mogę znaleźć nigdzie opcji max_user_connections / max_connections (używam najnowszego XAMPP). Jak rozwiązać ten problem?

Sephirus
A czy w obu plikach używasz sesji? Jeśli tak to może być to - bo sesja też ma lock. Jeśli dwa skrypty naraz próbujesz odpalić na tej samej sesji to się tak nie da - może to to?
no-scared
Rzeczywiście, mój test.php przy takiej formie:

  1. <?php
  2.  
  3. error_reporting(E_ALL ^ E_NOTICE);
  4.  
  5. require_once('includes/config.php');
  6. require_once('includes/funcs.php');
  7. require_once('includes/classes/user.php');
  8. require_once('includes/classes/curl.php');
  9.  
  10. $conn = new mysqli(DB_HOST, DB_LOGIN, DB_PASSWORD, DB_DATABASE);
  11.  
  12. if (!$conn) {
  13. die('Nie udało się połączyć z bazą danych. Spróbuj później, bądź powiadom o zdarzeniu administrację serwisu.');
  14. }
  15.  
  16.  
  17. ?>


Ładuje się do fatal errora, lecz przy takiej formie:

  1. <?php
  2.  
  3. error_reporting(E_ALL ^ E_NOTICE);
  4.  
  5. require_once('includes/config.php');
  6. require_once('includes/funcs.php');
  7. require_once('includes/classes/user.php');
  8. require_once('includes/classes/curl.php');
  9.  
  10. $conn = new mysqli(DB_HOST, DB_LOGIN, DB_PASSWORD, DB_DATABASE);
  11.  
  12. if (!$conn) {
  13. die('Nie udało się połączyć z bazą danych. Spróbuj później, bądź powiadom o zdarzeniu administrację serwisu.');
  14. }
  15.  
  16. ?>


plik się załaduje. Ale to nie koniec problemu. Bo co w takim razie mam zrobić, jeżeli potrzebuję używać sesji i w jednym i w drugim pliku?

Z tego co widzę, ludzie sobie z tym radzą za pomocą session_write_close(), ale to jest bez sensu... co mam zrobić, jeżeli w innym pliku muszę pewne dane też zapisywać do sesji podczas działania skryptu, a nie mogę ich najpierw odczytać i zamknąć sesji?
Sephirus
Zasada jest prosta smile.gif

Jeśli w jakimś skrypcie (na ogół chodzi o skrypty wywoływane przez ajax, lub te które się długo ładują) potrzebujesz tylko odczytać sesję to robisz:

  1.  
  2. // i tyle zmienne sesji są dostępne do odczytu (jedynie ich zmiana nie zostanie zapisana w sesji)
  3.  
  4. echo $_SESSION['jakas_zmienna'];


Jeśli potrzebujesz i zapisu i odczytu a skrypt moze się długo wykonywać to wystarczy:

  1.  
  2. // tu jakieś straszne operacje (długotrwałe) + odczyt sesji
  3.  
  4. // teraz zapisujemy wynik do sesji
  5.  
  6. $_SESSION['wynik'] = $wynik;
  7.  
  8. // itd...


Grunt aby w drugim przypadku dany skrypt nic nie echował dopóki nie skończy zabawy z sesją wink.gif
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.