2011-12-17 14 views
8

Podczas migracji skryptu PHP z PHP 5.2 do PHP 5.3 natknąłem się na następujący problem: Ogólnym celem skryptu jest eksploracja danych. Mam procedurę wewnątrz, która dodaje dane do serwera MySQL. Ponieważ jest to naprawdę powtarzalne, przepisałem go (jakiś czas temu) na MySQLi, w szczególności na przygotowane instrukcje, ponieważ istnieje w sumie 3 możliwe zapytania do wykonania. W każdym razie, teraz, na serwerze PHP 5.3, skrypt jest upaść na następującej linii:Dziwne błędy segmentu PHP na mysqli_stmt_bind_result

mysqli_stmt_bind_result($prepCheck, $id1); 

Gdzie $prepCheck jest tworzony z $prepCheck = mysqli_prepare($con, $checkQuery) or die("Error");. Zapytanie działa poprawnie na serwerze MySQL ($ checkQuery, to znaczy) i kod PHP działał również na poprzednim serwerze.

Uruchomienie skryptu przy użyciu strace niczego nie ujawniło, ponieważ ostatnią rzeczą w nim jest wywołanie systemowe dla echo "Execute";, które jest 29936 19:44:18 write(1, "Execute\n", 8) = 8.

Obiekt połączenia nie jest FALSE, a nawet gdyby był, powinien zawieść z innym błędem, prawda?

Nadchodzi najdziwniejsza część: Ta procedura nie zawodzi po uruchomieniu skryptu, ograniczając liczbę stron odwiedzanych i skrypt zakończy się pomyślnie. Jednak po ustawieniu wyższego limitu, nie powiedzie się, zawsze przy pierwszym wywołaniu tej procedury, a dokładnie w tym wierszu.

Jeśli ktoś ma jakieś sugestie, co może być przyczyną tego, będą oni głęboko doceniani.

Mogę wkleić kod, jeśli ktoś potrzebuje zobaczyć większy obrazek, ale procedura jest bardzo długa i nudna na śmierć (być może dlatego skrypt się nie udaje :).

Oto, jak zaczyna się skrypt: error_reporting(E_ALL); ini_set('display_errors', '1');. Nie zgłoszono żadnego błędu poza "magicznym" Segmentation fault. Nie używam APC.

Nie jestem pewien, czy jest to istotne, ale używam CLI do uruchomienia skryptu, a nie interfejsu WWW.

Wersja PHP to 5.3.8, wersja MySQL to 5.1.56. Limit pamięci jest ustawiony na 64 MB.

EDYCJA: Procedura nieudana + niektóre inne kody są przesyłane tutaj: http://codepad.org/KkZTxttQ. Cały plik jest ogromny i brzydki, i uważam, że nie ma znaczenia, więc nie publikuję go na razie. Linia, która jest w przypadku braku jest 113.

+0

Czy po prostu próbowałeś ponownie zainstalować php-cli? Czy w dzienniku błędów jest coś podejrzanego? (Czy masz nawet dziennik błędów dla cli)? Czy masz APC? –

+0

Na twoje pytania, w kolejności: Spróbuję ponownie zainstalować php-cli, jeszcze go nie wypróbowałem; Rejestrowanie jest ustawione na maksymalny poziom, a przed awarią pojawia się tylko "Błąd segmentacji", dodam to do oświadczenia pytania i nie, nie mam APC. Dziękuję za Twój czas :) –

+0

@ K.Steff 'procedura jest bardzo długa i nudna na śmierć (może dlatego skrypt się nie udaje :)' - ROFL :) jednak prawdopodobnie byłby to pomysł, aby pokazać nam kod , zwłaszcza że jest to tak dziwny, brzmiący problem. Upewnij się, że podałeś kod mechanizmu ograniczającego, który może "naprawić" problem, obniżając go, podejrzewam, że klucz jest gdzieś tam. Jeśli nie możesz tego w rozsądny sposób opublikować tutaj, wypróbuj [codepad] (http://codepad.org/). I przez długą drogę (IMHO) najczęstszą przyczyną SIGSEGV jest nieskończona pętla lub nieskończona rekursja funkcji. – DaveRandom

Odpowiedz

1

Odpowiedź na moje własne pytanie, odkąd rozwiązać ten problem, i nie istnieją żadne inne odpowiedzi ...

zasługa @ jap1968 za wskazanie mi do function mysqli_stmt_error (które, jak założyłem, nie byłoby mi potrzebne, ponieważ mam error_reporting(E_ALL)).

Problem polegał na tym, że MySQL miał bardzo dziwny domyślną konfigurację: szczególnie

connect_timeout = 10 
wait_timeout = 30 

Spowodowało serwer MySQL aby zamknąć połączenie po zaledwie 30 sekundach (domyślnie jest to więcej niż pół godziny, w zależności od strony internetowej MySQL). To z kolei spowodowało, że funkcja mysqli_stmt_bind_result zakończyła się niepowodzeniem z błędem segmentacji.

+1

Czy zgłosiłeś błąd segmentacji w bugtracker PHP? – hakre

+0

Szczerze mówiąc nie Zdaję sobie sprawę, że był to błąd w PHP, więc myślę, że prawdopodobnie powinien zareagować w inny sposób, więc nie, nie mam, ale będę go szukał, a jeśli go nie będę, to go zgłoszę. –

+0

naprawdę tak bardzo u. Również jeden może chcieć dowiedzieć się, czy to nadal działa w trybie segfault z aktualną wersją. Właśnie przebiegłem Twoje pytanie dzisiaj, inaczej skomentowałem to już wcześniej. Daj mi znać, jeśli potrzebujesz pomocy. – hakre

Powiązane problemy