PHP5-cli hangs on futex
June 5, 2009 – 2:14 pmAm avut recent probleme cu php5-cli versiunea 5.2.6-1+lenny3 (debian) și scriu aici rezolvarea, poate va ajuta pe cineva.
Problema consta în faptul că orice script php rulat din consolă se bloca înainte să se termine execuția. Era nevoie de un ctrl+c pentru a reveni la consolă. Chiar și un banal php5 -v se bloca.
Nu mă doare mâna să dau câte un ctrl+c, însă ce faci când scriptul rulează într-un cron? M-am trezit cu câteva sute de procese astfel agățate.
Buuun… rulând un strace, aveam următorul output:
munmap(0xb6e68000, 89980) = 0
gettimeofday({1244202147, 79736}, NULL) = 0
munmap(0xb6e7e000, 101552) = 0
gettimeofday({1244202147, 79864}, NULL) = 0
futex(0xb7090ea0, FUTEX_WAIT, 2, NULL
…așadar, nici o informație ajutătoare.
În lipsă de alte idei, am început să dezactivez modulele php instalate. Surpriză, php5-mysql se bate cap în cap cu php5-mysqli. Și asta se întâmplă doar pentru cli, serverul web merge bine mersi cu ambele module active. Pe alte servere, cu alte versiuni php5 totul e ok.
În concluzie, folosiți ori mysqli ori mysql.
Bonus, un one-liner cu care am omorât procesele agățate din cron:



5 Responses to “PHP5-cli hangs on futex”
Nu stiu sigur daca te ajuta informatia, dar (cel putin pe Debian), php-ul de cli si cel de server web au php.ini-uri diferite. Probabil aveai ceva diferente in lista de module, daca zici ca se comporta diferit.
By rpetre on Jun 5, 2009
Da, știu că au config-uri diferite. Față de web, cli-ul are doar xdebug în plus. Bine… mai sunt diferențe la limita de memorie, afișarea erorilor și alte chestii.
N-am stat să analizez în detaliu, însă nu cred că problema se află în altă parte.
By Mihai Brehar on Jun 5, 2009
Cel mai distractiv e atunci cand ai software care depinde de ambele extensii si problema se manifesta intr-un mod aleator si duce la blocarea intregului server web …
By Andrei on Jun 15, 2009
Este irelevant faptul ca pe Debian Apache si CLI au configuri diferite. Extensiile in mod civilizat au fisierele de configurare in /etc/php5/conf.d/, exceptie cele instalate prin pecl sau ad-labam.
De curiozitate am incercat sa reproduc comportamentul dar nu am reusit. Aveam 5.2.6-1+lenny2, dar prin update la 5.2.6-lenny3 facut acum cateva minute nu crapa CLI (si din fericire nici cron-urile subsemnatului). Diferenta fata de setup-ul descris mai sus este faptul ca am Xdebug pentru ambele contexte, Apache si CLI. In fine, este destul de improbabil sa fie un bug in distributie avand in vedere ca e ramura stable a Debian (si prin faptul ca nu il pot reproduce). In plus, atat mysql cat si mysqli se leaga de aceeasi biblioteca, libmysql, ceea ce face conflictul cel putin … ciudat. Nu m-am lovit de asa ceva, si folosesc PHP + Linux de ceva vreme.
Daca masina nu este una din productie, ar merita incercat un reinstall dupa ce in prealabil pachetele se scot cu apt-get remove –purge.
PS: pkill -KILL php5? Oricum pkill e ruda buna cu pgrep & familia, deci merge si pentru regex pattern in loc de php5 ca argument.
By SaltwaterC on Jun 15, 2009
Mașina e în producție, însă nu e “mission critical”. Aș putea face un reinstall într-o noapte dar mi-e leneee
Corect, se poate folosi pkill în loc de cârnațul scris de mine. Însă în producție, prefer să văd lista de procese înainte să le omor.
By Mihai Brehar on Jun 15, 2009