ID: 47712 Comment by: kak dot serpom dot po dot yaitsam at gmail dot com Reported By: ninzya at inbox dot lv Status: Open Bug Type: Scripting Engine problem Operating System: Windows XP PHP Version: 5.3.0beta1 New Comment:
Try to test this under PHP 5.3 with libmysql driver (not mysqlnd). Previous Comments: ------------------------------------------------------------------------ [2009-03-25 07:28:35] ninzya at inbox dot lv In most cases this bug is being hit when working with mysql, and only during high concurrency. When there is no concurrency, or concurrency is not big enough, bug does not trigger. Also i forgot to mention that PHP is installed as a module. Downloaded QA's PHP 5.3.0RC1 and tested it with both php_mysql and php_mysqli extensions, bug is still present. The page that is being executed during stress test contains 14 SQL queries, 11 of them are SELECT queries. In most cases the 5th to 7th SELECT queries are failing to return proper data using mysql_fetch_assoc(). When the bug triggers, the values of returned array (usually first on first two keys in the array) are being replaced with irrelevant to SELECT result data, contents of those values are either NULL or data that was stored in DB, but used to appear in previous SQL queries. In the example above you can clearly see that the value of key 'id' in array $row is 'SHARED', but shared is the value of another field in another SQL query i used to execute. Probably, mysqlnd is somehow sharing memory between requests, and somehow memory of another request being processed concurrently is being passed to current request. Another assumption may be that the mysqlnd somehow bypasses update of currently used cached zval. Anyway, if this is mysqlnd related, still don't know how to explain warning with empty constant mentioned in previous report. ------------------------------------------------------------------------ [2009-03-24 18:49:53] kak dot serpom dot po dot yaitsam at gmail dot com I guess the trouble is in MySQL Native Driver (mysqlnd). No? ------------------------------------------------------------------------ [2009-03-21 22:45:24] ninzya at inbox dot lv Tested under PHP 5.2.9-1, the problem does not exist with that version of PHP. ------------------------------------------------------------------------ [2009-03-20 12:34:59] ninzya at inbox dot lv And here is the screenshot of the output of MySql query browser after executing SQL query i mentioned above: http://www.stepanov.lv/pub/mysql.jpg ------------------------------------------------------------------------ [2009-03-20 12:28:51] ninzya at inbox dot lv I got a little bit closer to the problem. Here's what happens. See this script: // load page $sql ='SELECT id, ' .implode( ', ', $properties) .' FROM ' .TAB_PREF .'pages WHERE node_id =' .$Db->escape( $nodeId, 'UINT').' AND alt_name =' .$Db->escape( $pageAlt, 'STRING') .' LIMIT 0, 1;'; if(( $row =$Db->queryFirst( $sql)) ===null) throw new Exception( 'NOT_FOUND'); if( $row['id'] ===null) {// THIS IS WHERE YOU SHOULD LOOK AT trigger_error( 'Got NULL!', E_USER_WARNING); trigger_error( 'SQL: ' .$sql, E_USER_WARNING); ob_start(); var_dump( $row); trigger_error( ob_get_clean(), E_USER_WARNING); die(); } As you can see, i am testing if $row['id'] is null (this is unexpected situation when this field becomes null, it's an auto column and at this step i expect successfully fetched row), and if it is NULL, then i wish to see the debug info for the contents of $row and overall "what's going on". Now here is the error log when this unexpected situation is being RANDOMLY triggered during stress test: [20-Mar-2009 14:20:37] PHP Warning: Got NULL! in D:\...\pages.php on line 93 [20-Mar-2009 14:20:37] PHP Warning: SQL: SELECT id, `title`, `keywords`, `descr`, `template_id` FROM pages WHERE node_id =11 AND alt_name ='welcome' LIMIT 0, 1; in D:\...\pages.php on line 94 [20-Mar-2009 14:20:37] PHP Warning: array(5) { ["id"]=> string(6) "SHARED" ["title"]=> string(12) "My test page" ["keywords"]=> string(6) "asdasd" ["descr"]=> string(6) "asdasd" ["template_id"]=> string(4) "8567" } in D:\...\pages.php on line 97 I don't know how to explain this. I guess this is mysqlnd failing this bad. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/47712 -- Edit this bug report at http://bugs.php.net/?id=47712&edit=1