drupal, nginx и 2 БД

Главные вкладки

Аватар пользователя warobushek warobushek 27 октября 2010 в 12:34

На тестовой площадке сделал копию текущего сайта.
На работающей площадке apache, тут nginx.

Один модуль использует не основную базу данных, а вторую.
Для этого у меня в коде формирования блока написано:

<?php
..
db_set_active('baza2');
..
db_set_active('default');
..
?>

При попытке открыть сайт выводится куча сообщений об ошибке наподобие:

Warning: Table &#039;baza2.watchdog&#039; doesn&#039;t exist
query: INSERT INTO watchdog
    (uid, type, message, variables, severity, link, location, referer, hostname, timestamp)
    VALUES
    (4, &#039;php&#039;, &#039;%message in %file on line %line.&#039;, &#039;a:4:{s:6:\&quot;%error\&quot;;s:12:\&quot;user warning\&quot;;s:8:\&quot;%message\&quot;;s:108:\&quot;Table &amp;#039;baza2.menu_custom&amp;#039; doesn&amp;#039;t exist\nquery: SELECT * FROM menu_custom ORDER BY title\&quot;;s:5:\&quot;%file\&quot;;s:50:\&quot;/путь/к/друпал/modules/menu/menu.module\&quot;;s:5:\&quot;%line\&quot;;i:449;}&#039;, 3, &#039;&#039;, &#039;http://10.5.12.18:8080/&#039;, &#039;http://10.5.12.18:8080/admin/build&#039;, &#039;10.1.21.49&#039;, 1288166104) in /путь/к/друпал/includes/database.mysql.inc on line 139

Если комментирую строчку db_set_active('baza2'); (и все обращения к этой базе)
то ошибок нет. Я даже оставлял только строчки

<?phpdb_set_active('baza2');
db_set_active('default');
?>

ошибки все равно появляются.

Попробовал вывести тестовую информацию.
оказалось что ошибки выводятся после
db_set_active('default');

Почему друпал может не возвращаться к базе по умолчанию?

Комментарии

Аватар пользователя warobushek warobushek 27 октября 2010 в 14:10
<?php
function mymodule_block($op='list'$delta=0) {

  if (

$op == "list") {
    
$block = array();
    
$block[0]["info"] = '';
    return 
$block;
  }
  else if (
$op == 'view') {
    switch (
$delta) {
      case 
0:
        
$block['subject'] = '';
    
$block['content'] = _mymodule_makehtml();
      break;
    }
    return 
$block;
  }

}

function 

_mymodule_makehtml() {
$out '';
_mymodule_getdata();
...
return 
$out;
}

function 

_mymodule_getdata() {
...
db_set_active('baza2');
db_set_active('default');
...
}
?>

В settings.php следующее пишу:

<?php
$db_url
['default'] = 'mysql://user1:abc123@localhost/mysite';
$db_url['baza2'] = 'mysql://user1:abc123@localhost/baza2';
?>

Единственное что смущает в settings.php - то, что на тестовой площадке у меня обе базы находятся на одном хосте и доступ к ним есть у одного пользователя. На рабочей площадке они на разных хостах.

Кроме того, и там и там настроены постоянные соединения с базой данных - хакнут includes/database.mysql.inc.

Аватар пользователя glu2006 glu2006 27 октября 2010 в 14:15

warobushek wrote:
Кроме того, и там и там настроены постоянные соединения с базой данных - хакнут includes/database.mysql.inc.

Ну вот и ищи причины в своих хаках, будешь знать как модули хакать.

PS. +1 убитый котенок на твоей совести (вытираю руки от еще теплой крови).

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 27 октября 2010 в 14:17

"glu2006" wrote:
PS. +1 убитый котенок на твоей совести (вытираю руки от еще теплой крови).

А это врядли котейка, строки конекта внимательный посмотри и вспомни особенность работы слоя БД

Аватар пользователя glu2006 glu2006 27 октября 2010 в 14:44

RxB wrote:
А это врядли котейка, строки конекта внимательный посмотри и вспомни особенность работы слоя БД

Если БД на одном серванте то все у Уарабъюхи нормально написано, а вот модули хакать низзя :).

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 27 октября 2010 в 15:07

"glu2006" wrote:
Если БД на одном серванте то все у Уарабъюхи нормально написано, а вот модули хакать низзя :).

"warobushek" wrote:
На рабочей площадке они на разных хостах.

Аватар пользователя warobushek warobushek 28 октября 2010 в 8:08

"RxB" wrote:

Хотя не, Уарабей, ты опять тут врёшь?
И там локалхост и там, а ты говоришь что базы на разных сервантах


На рабочей - на разных. На тестовой - на одном(localhost). Ошибки возникают только на тесовой площадке.

Трабла действительно в хакнутом файле.
Различие моего database.mysql.inc и оригинального в следующем

--- d1.inc      2010-10-28 09:23:46.000000000 +0600
+++ d2.inc      2010-10-28 09:24:17.000000000 +0600
@@ -13,17 +13,7 @@
 
 // Include functions shared between mysql and mysqli.
 require_once './includes/database.mysql-common.inc';
-global $db_mysql_temporary;
-if(!isset($db_mysql_temporary) ) $db_mysql_temporary = array();
-function db_shutdown_unlock_tables(){
-    global $db_mysql_temporary;
-    db_query('UNLOCK TABLES');
-    db_set_active('default');
-    db_query('UNLOCK TABLES');
-    if(is_array($db_mysql_temporary) && count($db_mysql_temporary) )
-    foreach($db_mysql_temporary as $table) db_query('DROP TEMPORARY TABLE ' . $table);
-}
-register_shutdown_function('db_shutdown_unlock_tables');
+
 /**
  * Report database status.
  */

@@ -84,8 +74,7 @@ function db_connect($url) {
   //   server.
   // - 2 means CLIENT_FOUND_ROWS: return the number of found
   //   (matched) rows, not the number of affected rows.
- // $connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE, 2);
- $connection = [user=mysql_pconnect]mysql_pconnect[/user]($url['host'], $url['user'], $url['pass'],  2);
+  $connection = [user=mysql_connect]mysql_connect[/user]($url['host'], $url['user'], $url['pass'], TRUE, 2);
   if (!$connection || !mysql_select_db(substr($url['path'], 1))) {
     // Show error screen otherwise
     _db_error_page(mysql_error());
@@ -286,11 +275,10 @@ function db_query_range($query) {
  *   correctly.
  */
 function db_query_temporary($query) {
-  global $db_mysql_temporary;
   $args = func_get_args();
   $tablename = array_pop($args);
   array_shift($args);
-  $db_mysql_temporary[$tablename] = $tablename;
+
   $query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE '. $tablename .' Engine=HEAP SELECT', db_prefix_tables($query));
   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
     $args = $args[0];

Ну не представляю я, что здесь может быть не так .. Раз вы такие гуру, то скажите.