Newsgroup: it.comp.www.php
Titolo: Upgrade a PHP5-MySQL5

Buongiorno a tutti.
Ho provato a cercare nel NG qualche informazione sul mio problema ma
non ho trovato niente di niente, quindi provo a sentire se qualcuno di
voi ha qualche consiglio, perche' io non so sinceramente come
affrontare la strana situazione che ho riscontrato.
Ho un software stabile e perfettamente funzionante da circa 6 anni
installato su server Linux con PHP 4.x e MySQL 3.x; recentemente ho
dovuto installare lo stesso sistema se una nuova macchina che pero'
non ho potuto configurare, il risultato e' che la configurazione
server e' estremamente diversa: Win2003 Server, PHP 5.x e MySQL 5.x
Dopo aver risolto alcuni noti (ho cercato su internet) problemi
relativi al passaggio da MySQL 3.x a MySQL 5.x mi sono ritrovato con
un unico errore per me insondabile: l'esecuzione di un particolare
script (che e' sempre stato un po' lentino, lo ammetto) va in "maximum
execution time". Partendo dal concetto che la cosa mi e' sembrata
stranissima (dato che persino sul mio portatile con PHP 4.3.x e MySQL
4.x non ha mai dato problemi, mentre qui parliamo di un server nuovo
di pacca del 2006) ho provato a risolverla sporca, raddoppiando il
tempo di esecuzione, ma ancora niente. E' impossibile che il server
non riesca a completare l'operazione in un minuto, quindi mi sono
messo a fare altre prove: se e' vero che la prima esecuzione dello
script va in errore, una seconda esecuzione a seguire (con gli stessi
parametri) diventa istantanea (tempo di esecuzione inferiore al
secondo)! Questo ovviamente mi ha fatto pensare ad una qualche forma
di caching delle query di MySQL ma ancora non mi risolve il problema.
Ho cercato anche sulla rete ma non ho trovato alcun riferimento a
questo tipo di problema.
Qualcuno ha suggerimenti, opinioni, esperienze o anche solo insulti?
Grazie in anticipo,
Roberto



Dovresti postare il codice.
Si, da Mysql 4 esiste una cache delle query.
Prova a inserire set_time_limit(0) e vedi se la richiesta viene completata  
correttamente.
Per il resto, ripeto, posta il codice, alla cieca è difficile darti una  
mano.
Tac
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/mail/

 Roberto
probabilmente sei in safe_mode con un limite di 30 secondi (quindi non puoi
cambiare il tuo limite di tempo)..
vedi se riesci a ottimizzare il codice per rientrare nel limite o contatta
l'amministratore per una modifica ad hoc..
-- 
www.iuz-lab.info

 mano.
Il codice e' molto complesso e modularizzato (nella fattispecie si
tratta di un report che quindi ha mille variabili e rende il codice
difficile in lettura anche a chi l'ha scritto, cmq lo riporto sotto):
//Nota: e' il case 4 che da' problemi!!! NdAzael
  switch ($filter)
  {
  case 1:
	$query = "SELECT *, pd_id AS id, concat(pd_fname,' ',pd_lname) AS
nome
			  FROM bdrmed.personal, bdrmed.agenda AS ag
			  WHERE (pd_id = ag.ag_csid)
			  AND (TO_DAYS('$stdate') <= TO_DAYS(ag_date))
			  AND (TO_DAYS('$enddate') >= TO_DAYS(ag_date))
			  GROUP BY id";
  break;
  case 2:
	$query = "SELECT *, pd_id AS id, concat(pd_title,' ',pd_fname,'
',pd_lname) AS nome
			  FROM bdrmed.personal, bdrmed.agenda AS ag
			  WHERE (pd_id = ag.ag_optorid)
			  AND (ag_optorid IS NOT NULL)
			  AND (TO_DAYS('$stdate') <= TO_DAYS(ag_date))
			  AND (TO_DAYS('$enddate') >= TO_DAYS(ag_date))
			  GROUP BY id";
  break;
  case 3:
	$query = "SELECT *, mx_id AS id, mx_id AS nome
			  FROM bdrmed.agendamutex";
  break;
  case 4:
	$query = "SELECT *, fl_id AS id, fl_id AS nome
			  FROM bdrmed.flaglist";
  break;
  case 5:
	$query = "SELECT *, ag_date AS id,
DATE_FORMAT(ag_date,'$view_date_format') AS nome
			  FROM bdrmed.agenda
			  WHERE (TO_DAYS('$stdate') <= TO_DAYS(ag_date))
			  AND (TO_DAYS('$enddate') >= TO_DAYS(ag_date))
			  GROUP BY ag_date
			  ORDER BY TO_DAYS(ag_date) ";
  break;
  }
  $result=db_query($query);
  $rowcount = db_num_rows($result);
// Un po' di roba ininfluente, come settaggio di variabili, ecc...
  for($i=0; $i<$rowcount; $i++)
  {
	$line = db_fetch_array ($result);
	$sino=0;
	foreach($dat as $l )
	{
	  if (agreport_condition($filter, $l, $line["id"]))
	  {
		if ($sino=='0')
		{
		  echo "</CENTER><P> <B><H2> ".$line[nome]." </H2><B><P><CENTER>";
		  $cls2 = "report";
		  emit_table_header($int2,$cls2);
		  $sino=1;
		}
// preparo i flags:
		$str_flags="";
		$af=agendaflag_list($l["ag_flid"]); //Funzione riportata sotto
		if (!empty($af))
		{
		  foreach ($af as $key => $value)
		  {
			$str_flags .= " ".$value["fg_flid"]."= \"".$value["fg_val"]."\"
&nbsp";
		  }
		}
		$l[ag_flags] = $str_flags;
// preparo le attrezzature:
		$str_mutex="";
		$am=agendamutex_list($l[ag_id]); //tipo quella sopra
		if (!empty($am))
		{
			$countrow=count($am);
			$coma=0;
			foreach ($am as $key => $value)
			{
				if ($coma==1)
				{
					$str_mutex .= ", ";
				}
				$str_mutex .= $value["ma_mxid"];
				$coma=1;
			}
		}
		if (!auth_isuserallowed(6))
		{
			$class=appmxclass($l["ag_id"]);
			if ($class == 'D')
			{
				$l["ag_desc"] = "XXXX";
			}
		}
		$l[ag_mutexid] = $str_mutex;
		emit_table_row($l,$col2,$cls2);
	  }
	}
  emit_table_footer();
  }
  $url = makephpself("agreport_phase=");
  if ($med_path=="agenda")
  {
	echo "</TABLE> <FORM ACTION=\"$url\" METHOD=\"POST\"><INPUT TYPE=
\"SUBMIT\" VALUE=\"Torna alla selezione filtri\"></FORM></CENTER>";
  }
function agendaflag_list($groupid)
{
  $query = "SELECT	*
			FROM	bdrmed.agendaflags
			WHERE	(fg_groupid='$groupid')
			AND		(fg_val<>'')";
  $result= db_query($query);
  db_check_error($result,"agendaflag_list()");
  $rowcount = db_num_rows($result);
  $dat="";
  for($i=0; $i<$rowcount; $i++)
  {
	$line = db_fetch_array ($result);
	$dat[$line["fg_id"]]=$line;
  }
  return $dat;
}
ho inserito un po' di funzioni esplicitamente nel codice per non
incasinarvi ancora di piu' il tutto...
Grazie per aver risposto cosi' celermente! 8-)
Ciao,
Roberto

 Grazie per aver risposto cosi' celermente! 8-)
Senti una roba ma $rowcount che valore assume?
Sia nella funzione sia nella funzione agendaflag_list che 
nel codice sopra.
Eppoi vedi se l'sql in mysql 5.0 funziona...
se gli altri case vanno io sono dell'idea che il problema 
sia nel passaggio da mysql4 -> mysql5.
Ciao

   break;
Il resultset di questa può essere parecchio grande. Ti serve veramente  
tanta roba ?
Prova anche ad eseguirla da riga di comando e vedi quanto tempo ci mette.
Raddoppiare il tempo non è detto che basti, per quello ti ho consigliato  
il time_limit 0.
Altre cose da verificare:
	- verifica che su mysql5 usi lo stesso engine che usi sul 4. Se sul 4 usi  
Myisam e sul 5 innoDb questo può essere causa di problemi di prestazioni
	- verifica che i dati restituiti dalla query siano gli stessi, nel 5 ci  
sono piccoli cambiamenti si sintassi a livello di priorità delle virgole  
che possono far restituire errore o dati differenti.
	- verifica di aver creato gli indici correttamente sul nuovo db, per ogni  
tabella.
	- esegui EXPLAIN SELECT *, fl_id AS id, fl_id AS nome FROM  
bdrmed.flaglist su entrambe le piattaforme e confronta i risultati.
Buona fortuna
Tac (anche lui alle prese con una migrazione verso il 5, di OsCommerce  
(sic !))


 (sic !))
Allora buona fortuna anche a te.
Se scopro qualcosa di nuovo o la soluzione farovvi sapere, sia mai che
serva anceh a voi! 8-)
Ciao,
Roberto

 sia nel passaggio da mysql4 -> mysql5.
Gli altri funzionano. Come dicevo prima forse l'errore e' in IIS che
per una qualche ragione si "sconnette" prima dei 30 secondi (o 60 dopo
che li ho raddoppiati).
Ringrazio tutti per i olti spunti di riflessione, vedro' cosa riesco a
fare.
Ciao,
Roberto

 problemi.
La possibilità esiste.
Tac
