Hello everybody again, Unfortunately I forgot to add CC to group, so we were discussing problem with Саша privately :)) But he mentioned that there left only two of us, so I'm repeating abridged summary of discussion.
First of all, I successfully repeated error mentioned by Саша. It do not related with database engine (so I was able to successfully repeat it with both MyISAM and InnoDB). I was keeping track of connections, while storming a server. And indeed there were only ONE connection to the database. But after a 'storm' (in fact 5-10 rapidly repeated requests was enough) server became down. I'll explain in details a little bit later. Here's dummy stormer in Ruby I was using to reproduce an error: require 'rubygems' require 'httpclient' client = HTTPClient.new uri = 'http://localhost/zfw' status = 'ACTIVE' (1..128).each do status = ('ACTIVE' == status) ? 'INACTIVE' : 'ACTIVE' client.post(uri, { 'status' => status } end So after running this stormer, assuming 'http://localhost/zfw' is an index action of index controller of our application which selects rows from database (there were only 32 rows total in database on testing), index action started throw Zend_Db_Adapter_Mysqli_Exception all the time (until I have restarted Apache2 server). This exception had empty message. Here's a trace: #0 /var/www/zfw-app/library/Zend/Db/Adapter/Abstract.php(304): Zend_Db_Adapter_Mysqli->_connect() #1 /var/www/zfw-app/library/Zend/Db/Adapter/Mysqli.php(194): Zend_Db_Adapter_Abstract->getConnection() #2 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(823): Zend_Db_Adapter_Mysqli->describeTable('automobili_news', NULL) #3 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(862): Zend_Db_Table_Abstract->_setupMetadata() #4 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(969): Zend_Db_Table_Abstract->_setupPrimaryKey() #5 /var/www/zfw-app/library/Zend/Db/Table/Select.php(100): Zend_Db_Table_Abstract->info() #6 /var/www/zfw-app/library/Zend/Db/Table/Select.php(78): Zend_Db_Table_Select->setTable(Object(Automobili_Model_Table_News)) #7 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(1005): Zend_Db_Table_Select->__construct(Object(Automobili_Model_Table_News)) #8 /var/www/zfw-app/application/controllers/IndexController.php(14): Zend_Db_Table_Abstract->select() #9 /var/www/zfw-app/library/Zend/Controller/Action.php(513): IndexController->indexAction() #10 /var/www/zfw-app/library/Zend/Controller/Dispatcher/Standard.php(289): Zend_Controller_Action->dispatch('indexAction') #11 /var/www/zfw-app/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #12 /var/www/zfw-app/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() #13 /var/www/zfw-app/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() #14 /var/www/zfw-app/public/index.php(26): Zend_Application->run() #15 {main} For those who are interested in details I have attached an xdebug trace as an attachment (trace.xt.gz) and xdebug profiler data (cachegrind.out.gz). After all I have switched config to use pdo_mysql instead of mysqli and was able to run my (previously described) stormer without any problems even with 1024 requests. So I guess there's something wrong with mysqli adapter (of PHP). 2010/5/25 Саша Стаменковић <[email protected]>: > Zend_Db_Statement ин setFetchMode() calls $this->closeCursor(); only in > default case fro $mode ?! > > Regards, > Saša Stamenković > > > On Tue, May 25, 2010 at 11:40 AM, Саша Стаменковић <[email protected]> > wrote: >> >> Cache can be the temporary fix. >> >> Regards, >> Saša Stamenković >> >> >> On Tue, May 25, 2010 at 11:35 AM, Саша Стаменковић <[email protected]> >> wrote: >>> >>> I found where the problem was! >>> $newsTable->publishNews($ids); >>> foreach ($newsTable->fetchNewsByIds($ids) as $news) { >>> $news->publishOnTwitter(); >>> } >>> Row have this publish on twitter method, which shouldn't have nothing to >>> do with the problem - WRONG! It has. When I post it on twitter, a great >>> amount of traffic is generated, people are opening concrete news and break >>> my limit of 15 connections. >>> Looks like I need more connections, heh. >>> Regards, >>> Saša Stamenković >>> >>> >>> On Tue, May 25, 2010 at 10:57 AM, Саша Стаменковић <[email protected]> >>> wrote: >>>> >>>> BTW, my limit is not >>>> mysqli.max_links = 15 >>>> its a property of mysql.user table, MAX_USER_CONNECTIONS. >>>> http://dev.mysql.com/doc/refman/5.1/en/user-resources.html >>>> >>>> Regards, >>>> Saša Stamenković >>>> >>>> >>>> On Mon, May 24, 2010 at 11:44 PM, Aleksey Zapparov <[email protected]> >>>> wrote: >>>>> >>>>> Hello, >>>>> >>>>> Was not able to wait until tomorow to test on FreeBSD as it was really >>>>> interesting for will it work or not. And it does. Here's mysqli config >>>>> of my >>>>> php.ini on FreeBSD: >>>>> >>>>> mysqli.max_links = 15 >>>>> mysqli.default_port = 3306 >>>>> mysqli.default_socket = >>>>> mysqli.default_host = >>>>> mysqli.default_user = >>>>> mysqli.default_pw = >>>>> mysqli.reconnect = Off >>>>> >>>>> You can see it's working at: http://sandbox.ixti.ru/zfw/ (it will be >>>>> available >>>>> at least until 27th of May 2010). >>>>> >>>>> >>>>> 2010/5/24 Aleksey Zapparov <[email protected]>: >>>>> > Hello, >>>>> > >>>>> > I guess you are doing something wrong. I have just build up a little >>>>> > app from >>>>> > scratch with zf tool (attachment app.tar.gz) which simply "batch" >>>>> > updates >>>>> > 32 rows with new status - very dumy logic in controller: >>>>> > >>>>> > $news = new Automobili_Model_Table_News(); >>>>> > $ids = range(1,32); >>>>> > >>>>> > $news->update( >>>>> > array('status' => $status), >>>>> > $news->getAdapter()->quoteInto('id IN (?)', $ids, >>>>> > Zend_Db::INT_TYPE) >>>>> > ); >>>>> > >>>>> > And it works good for me at least on my GNU/Linux. >>>>> > Here's my php.ini (section of MySQLi): >>>>> > >>>>> > mysqli.max_persistent = 15 >>>>> > mysqli.allow_persistent = Off >>>>> > mysqli.max_links = 15 >>>>> > mysqli.cache_size = 2000 >>>>> > mysqli.default_port = 3306 >>>>> > mysqli.default_socket = >>>>> > mysqli.default_host = >>>>> > mysqli.default_user = >>>>> > mysqli.default_pw = >>>>> > mysqli.reconnect = Off >>>>> > >>>>> > >>>>> > I have a FreeBSD running host so tomorow I'm gonna check this app >>>>> > against >>>>> > it. Anyway you can try my dummy app by yourself (I've removed some >>>>> > portion >>>>> > from your News table class (which was referring to another model) to >>>>> > be able >>>>> > run this code). >>>>> > >>>>> > Attached files are: >>>>> > app.tar.gz - Application itself >>>>> > dump.sql.gz - MySQL dump of table (I have used to test) >>>>> > >>>>> > >>>>> > 2010/5/24 Саша Стаменковић <[email protected]>: >>>>> >> Okay, I'm using one connection, one db, one adapter, but still, I >>>>> >> have >>>>> >> problems. I'm pretty sure I'm using it right, because I'm using it >>>>> >> like it >>>>> >> says in the doc. >>>>> >> The problem is, I can exec up to 15 queries in the row, and this >>>>> >> quoteInto >>>>> >> with array param is hitting my limits. >>>>> >> I can send you my code on private mail Thomas. >>>>> >> >>>>> >> Regards, >>>>> >> Saša Stamenković >>>>> >> >>>>> >> >>>>> >> On Mon, May 24, 2010 at 9:27 PM, Thomas D. <[email protected]> >>>>> >> wrote: >>>>> >>> >>>>> >>> Hi, >>>>> >>> >>>>> >>> Саша Стаменковић wrote: >>>>> >>> > Sure, when you have unlimited number of db operation over >>>>> >>> > a period of time. I'll come up with my own offline quoting. >>>>> >>> >>>>> >>> Seems like you are missing one fact all over the time: >>>>> >>> That quoting would use a connection to a database server, isn't a >>>>> >>> problem, >>>>> >>> because Zend_Db_* would use one connection across every component. >>>>> >>> Only if >>>>> >>> you are working with multiple databases, it might be a problem, >>>>> >>> because you >>>>> >>> would have one adapter per database (=nAdapter * 1 Connection = n >>>>> >>> connections)... >>>>> >>> >>>>> >>> So again: >>>>> >>> When you are working with just *one* database, everything should >>>>> >>> work >>>>> >>> fine. >>>>> >>> If not, *you* are doing something wrong. >>>>> >>> >>>>> >>> Doing your own quoting is everything but not safe. You should use >>>>> >>> the >>>>> >>> adapter's escape function, if your application should be safe. >>>>> >>> >>>>> >>> >>>>> >>> -- >>>>> >>> Regards, >>>>> >>> Thomas >>>>> >>> >>>>> >>> >>>>> >> >>>>> >> >>>>> > >>>>> > >>>>> > >>>>> > -- >>>>> > Sincerely yours, >>>>> > Aleksey V. Zapparov A.K.A. ixti >>>>> > FSF Member #7118 >>>>> > Mobile Phone: +34 617 179 344 >>>>> > Homepage: http://www.ixti.ru >>>>> > JID: [email protected] >>>>> > >>>>> > *Origin: Happy Hacking! >>>>> > >>>>> >>>>> >>>>> >>>>> -- >>>>> Sincerely yours, >>>>> Aleksey V. Zapparov A.K.A. ixti >>>>> FSF Member #7118 >>>>> Mobile Phone: +34 617 179 344 >>>>> Homepage: http://www.ixti.ru >>>>> JID: [email protected] >>>>> >>>>> *Origin: Happy Hacking! >>>> >>> >> > > -- Sincerely yours, Aleksey V. Zapparov A.K.A. ixti FSF Member #7118 Mobile Phone: +34 617 179 344 Homepage: http://www.ixti.ru JID: [email protected] *Origin: Happy Hacking!
