Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: gat3way в Apr 23, 2012, 21:19



Титла: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: gat3way в Apr 23, 2012, 21:19
То не е точно web development, става въпрос за един демон, който пиша, който стои една зад уеб-фронтенда. За демонът е характерно, че е нещо като dispatcher за job-ове. Когато изчислителните ресурси се освободят, демонът засилва следващият job в опашката, който е наред да бъде изпълнен.

Job-а се изпълнява малко странно, форква се нов дъщерен процес, който засилва през ssh задачата на отдалечена машина и събира резултата от изпълнението. Parent процеса създава mysql връзка малко преди да се форкне дъщерния. Дърщерния съответно преизползва connection-a. Съответно гърми с:

Цитат
mysql server has gone away

Сега това е логично, понеже понякога job-овете отнемат часове докато се изпълнят и за това време връзката до mysql сървъра отдавна е таймаутнала. По-интересното е че когато се опитам да отворя последваща връзка и да засиля заявка към базата, тя умира точно по същият начин. Отварянето на връзката е ОК, но заявката гърми със същата грешка.

Проблемът е workaround-нат по идиотски начин: mysql сървъра слухти на на един ethernet интерфейс, както и на loopback-а. Ако умре връзката към 127.0.0.1, създавам нова като я отварям към IP адреса на етернетския интерфейс и тогава всичко минава без проблеми. Проблемът е че това е просто тъпо.

Не мога да си обясня този проблем. Според мен тъпото PHP просто се опитва да преизползва връзката без да вземе предвид че е таймаутнала, един вид някакъв connection reuse механизъм. Но това е безумно малоумно и води дотам че и без това отвратителния код става още по-отвратителен.

Някой забелязвал ли е този проблем и дали е открил по-добро решение ако го е забелязал?


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: wfw в Apr 23, 2012, 21:30
wait_timeout и interactive_timeout на mysql защо не ги вдигнеш?


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: gat3way в Apr 23, 2012, 21:33
Мога да ги вдигна, но не е там проблема. Проблемът не е в mysql, проблемът е в PHP. Рових в bugtracking системата им, засега не съм открил точно същият казус. Това ме навежда на мисълта, че съм нацелил някакъв feature, а не бъг. За жалост не съм толкова чак толкова навътре в PHP за да знам със сигурност, в интерес на истината не съм пипал PHP сигурно от година. Обаче досега не съм го виждал това поведение в интерес на истината.


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: wfw в Apr 23, 2012, 21:46
На няколко мои машини има подобен проблем - започва да работи скрипт, който в началото на работа си отваря връзка към базата данни. Извършва някакви сложни сметки, сортира и т.н. и след 5 минути започва да се обръща към базата, но времето, за което връзката не е била използвана е по-голямо от въпросните 2 променливи, които споменах. Тогава връща същата грешка, че mysql-a е затворил връзката.
Нашите interactive и wait timeouts са малки (5-10сек), защото има безумно написани приложения, които са прекалено тъпи да си затварят връзките и така ги форсираме да ги затварят, иначе при голямо натоварване понякога mysql-a остава без връзки, а реално нищо не го натоварва.

Пробвай да затвориш връзката към mysql и да я отвориш в края нa job-a, така би трябвало да се унищожи конструктура, в случай, че ползваш mysql_connect. ако ползваш mysql_pconnect, пробвай да ползва mysql_connect.

Можеш да пробваш и връзка през сокета...


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: gat3way в Apr 23, 2012, 21:55
Там е проблемът. Викам mysql_close(), отварям нова връзка (няма проблеми), правя заявката, гръмва ми с тази грешка. Алтернативно обаче ако отворя новата връзка към другия IP адрес на който слухти сървъра, тогава няма проблеми. Няма много логика, единственото което ми хрумва е че PHP може би прави някакви хитрости с connection management-а си. Както и да е, така или иначе имам workaround, ще си карам с него.


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: go_fire в Apr 23, 2012, 22:53
Така си е устроен. Отвориш ли една връзка да си я ползваш до края. Златно правило си е да не се затварят връзки и отварят нови. Това е може би първото, на което учат начинаещия при работа със СУБД в php. Дали е тъпо или не не съм компетентен да кажа, но ми звучи логично да е така.


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: neter в Apr 24, 2012, 02:02
Не съм попадал на това, но изглежда целта на функцията mysql_ping() ($2) е да спомага точно в такива случаи - проверява дали връзката е timeout-нала, и ако е, съобщава за това и пробва да се свърже отново, преизползвайки същия отворен канал. Странно, въпреки написаното в описанието към функцията, в коментар на потребител отдолу пише, че mysql_ping() само проверява дали връзката е още активна, но не се свързва автоматично, ако е timeout-нала, но дори да е така, с повторно изпълнение на mysql_connect() след това може да се задейства.
И въпреки това, нещо не е читава тази работа да не можеш да се вържеш към същото IP с друга връзка, но към другото да можеш. Ако намеря време тия дни ще си поиграя да видя какъв feature или бъг са спретнали в PHP :)


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: gat3way в Apr 24, 2012, 09:11
Цитат
Така си е устроен. Отвориш ли една връзка да си я ползваш до края. Златно правило си е да не се затварят връзки и отварят нови. Това е може би първото, на което учат начинаещия при работа със СУБД в php. Дали е тъпо или не не съм компетентен да кажа, но ми звучи логично да е така.

Може и да върши работа за apache скрипт, от който не се очаква да отнеме повече от няколко секунди за изпълнение, но не виждам как ще се случи с демон, който работи в background-a. Това примерно би означавало като рестартирам mysql-а да ходя и да рестартирам и демона (и ако има schedule-нат job става красиво - базата остава в неконсистентно състояние, а job-а съответно увисва завинаги в състояние "изпълнява се".

Това също би налагало mysql връзките никога да не таймаутват.


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: borovaka в Apr 24, 2012, 09:39
@gat3way Разгледай атрибута Persistent connections при PDO:
http://bg2.php.net/manual/en/pdo.connections.php ($2)
Абе изобщо пробвай PDO как ще се държи в подобна ситуация.
А ако продължи да прави номера, може да пробваш ODBC.


Титла: Re: PHP / Mysql проблеми - mysql server has gone away
Публикувано от: Neo2SHYAlien в May 29, 2012, 18:50
Аз имам същия проблем с демонче пак на php  ;D аз лично ползвам mysqli и така и не открих логично обяснение защо аджеба се случва така