![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrati | Regole Forum | Collegamenti | Album | FAQ | Members List | Calendario | Ricerca | Today's Posts | Mark Forums Read |
| Shell scripting e di programmazione Pubblica domande su KSH, CSH, SH, Bash, Perl, PHP, sed, awk e da altri script di shell e linguaggi di scripting shell qui. |
Più di UNIX e Linux Forum Argomenti potreste trovare utili
|
||||
| Filo | Thread Starter | Forum | Risposte | Ultimo Post |
| uscendo da script | arghya_owen | Shell scripting e di programmazione | 1 | 06-02-2008 07:36 AM |
| Uscire da script quando si verifica un errore | Sreejith_VK | Shell scripting e di programmazione | 4 | 04-25-2008 04:53 AM |
| Script Non Uscire? | lesstjm | Shell scripting e di programmazione | 1 | 07-11-2007 12:58 PM |
| Script di shell non uscire con grazia | smithK | Shell scripting e di programmazione | 5 | 02-08-2007 06:48 PM |
| uscendo in c | ruffenator | Di programmazione ad alto livello | 3 | 04-28-2002 03:31 AM |
![]() |
|
|
LinkBack | Thread Tools | Cerca in questo Thread | Rate Thread | Modalità di visualizzazione |
|
|
|
||||
|
PHP5 Script 'Freeze' prima di uscire
Di recente ho un sistema aggiornato da PHP 4.4.2 a PHP 5.2.1, e uno dei miei script ha iniziato un comportamento molto strano. Ho cercato google ma trovare in bianco finora.
Fondamentalmente ciò che lo script non è scegliere una grande quantità di dati da un mysql (4.1.21) del database, fare qualche manipolazione, le trame un grafico (usando jpgraph 2,2). Ho rimosso tutti i codici e jpgraph sono ancora ottenere il problema. Quello che succede è lo script 'si blocca' per un periodo di tempo dopo aver eseguito l'ultimo comando php prima di uscire. Durante questo periodo di tempo, il processo richiede una grande quantità di tempo di CPU (un intero singolo processore più), ma se il processo truss si ottiene alcun output, fino a quando non esce finalmente (quando si vede stdin / out / err chiuso, ecc.) Dopo la messa in varie dichiarazioni di debug ho scoperto che se ho commentato la riga seguente script non appendere prima di uscire. datax $ \u003d $ newdatax; Una linea abbastanza innocuo. A questo punto $ datax è un grande array (molte migliaia di valori a lungo), e $ newdatax un array con i risultati di analisi originale $ datax in qualche modo (per lo più di un caso di prendere ogni ennesimo ingresso da $ datax). A questo punto vorrei buttare via l'originale $ datax e sostituirlo con il nuovo $ newdatax e mi potrebbe fare di più maniplulation più tardi. Se $ datax è di circa 10.000 righe o in modo non vi è un notevole appendere lo script quando uscite, a 50.000 righe del blocco è superiore a 20 secondi. Sotto PHP 4 non ho avuto problemi con questo codice quando ci sono state oltre 200.000 le righe in un array. Anche se ho semplicemente cambiare la linea di $ datax \u003d array (); Mi appare simile (ma molto più piccola) 'appendere' prima la sceneggiatura e le uscite datax $ array deve essere abbastanza grande, prima che questa diventi evidente. Il sistema è in esecuzione su Solaris 9 su un v480 con 4 processori e 16GB di RAM. Ho provato con e senza Zend Optimizer (v3.2.8) senza alcuna differenza. Qualsiasi aiuto apprezzato. |
|
||||
|
Avete chiuso il PB connessione immediatamente quando hai finito con il database o dichiarazione manici ecc? Se si esegue uno script di alta intensità di risorse, è necessario assicurarsi di deallocate cose il più velocemente possibile per evitare la detenzione qualcosa per troppo tempo. Non si dovrebbe fare affidamento sul sistema di riferimento conte-spazzatura raccolta in questo caso è possibile che deallocazione non può avvenire presto abbastanza.
Se hai una variabile con il contenuto di grandi dimensioni, si dovrebbe considerare manualmente unset () le variabili immediatamente quando si sono fatte con esso. Esso non può essere correlata al tuo caso, ma solo provare. |
|
||||
|
Spiacenti dimenticato di dire, ho aggiunto esplicitamente mysql_free_result mysql_close e invita a fare in modo che esso wasnt. Ho provato facendo
unset ($ datax); prima di ri-assegnazione e ottenere lo stesso 'appendere'. |
|
||||
|
Non troppo sicuro di questo.
In realtà ho fatto un semplice script: Codice:
<?php $ary = range(0, 50000); $newary = $ary; ?> Ma sei sicuro dei cambiamenti tra PHP4 e PHP5 in materia variabile / oggetto di assegnazione (copie) comportamento? Come non è possibile fornire con la più semplice versione dello script, che danno il comportamento, di cui penso tutto può essere solo uno selvatici indovinare. |
|
||||
|
Ok ho il codice fino a circa il più piccolo e non posso ancora mostrare quello che sta accadendo. Il include.php è semplicemente la connessione databsae dettagli. Con i dati che ho la query restituisce 53068 righe. Si chiama lo script con l'argomento 0, 1 o 2 per usare il 3 diverse query (per 2, 3 o 4 colonne restituite totale). 0 o 1 con lo script esce immedaitely dopo la stampa 'Uscita', con 2 vi è un ritardo 18-20 secondi.
Le colonne sono restituite: data: una data / ora r_per_sec: un numero in virgola mobile b_workers: Un intero I_workers: Un intero Se commentare una qualsiasi delle tre linee segnate "KEY LINE * *" e poi lo script esce immediatamente. Codice:
<?php
function my_log($message)
{
$date = date("H:i:s");
print ("$date: $message\n");
}
my_log("Script Starting");
include "include.php";
# Connect to and select database
$db = mysql_connect("$hostname", "$username", "$password");
mysql_select_db($database);
# Metrics array to replace all the code which worked out the metrics
# query variable to replace all the code which worked out the SQL
if ($argv[1] == "0")
{
$metrics[0] = array ("apollo_APACHE_external.r_per_sec");
$query = "SELECT DATE_FORMAT(apollo_APACHE_external.date,\"%d/%m/%y %H:%i\") AS mydate,apollo_APACHE_external.r_per_sec AS c0 FROM apollo_APACHE_external WHERE apollo_APACHE_external.date >= 20040101000000 AND apollo_APACHE_external.date <= 20040930230000 ORDER BY apollo_APACHE_external.date";
}
elseif ($argv[1] == "1")
{
$metrics = array ("apollo_APACHE_external.r_per_sec", "apollo_APACHE_external.b_workers");
$query = "SELECT DATE_FORMAT(apollo_APACHE_external.date,\"%d/%m/%y %H:%i\") AS mydate,apollo_APACHE_external.r_per_sec AS c0,apollo_APACHE_external.b_workers AS c1 FROM apollo_APACHE_external WHERE apollo_APACHE_external.date >= 20040101000000 AND apollo_APACHE_external.date <= 20040930230000 ORDER BY apollo_APACHE_external.date";
}
elseif ($argv[1] == "2")
{
$metrics = array ("apollo_APACHE_external.r_per_sec", "apollo_APACHE_external.b_workers", "apollo_APACHE_external.i_workers");
$query = "SELECT DATE_FORMAT(apollo_APACHE_external.date,\"%d/%m/%y %H:%i\") AS mydate,apollo_APACHE_external.r_per_sec AS c0,apollo_APACHE_external.b_workers AS c1,apollo_APACHE_external.i_workers AS c2 FROM apollo_APACHE_external WHERE apollo_APACHE_external.date >= 20040101000000 AND apollo_APACHE_external.date <= 20040930230000 ORDER BY apollo_APACHE_external.date";
}
else
{
exit;
}
my_log("executing Query");
$result = mysql_query($query);
my_log ("Number of results:" . mysql_num_rows($result));
$count=0;
my_log("Fetching Results");
while ($row = mysql_fetch_array($result))
{
# Build the x axis data
$datax[$count] = $row[mydate]; # *KEY LINE*
# Build the y axis data
for ($i=0; $i < count($metrics); $i++)
{
$datay[$i][$count] = $row["c$i"]; # *KEY LINE*
}
$count++;
}
my_log("Freeing result set");
mysql_free_result($result);
my_log("Closing DB connection");
mysql_close($db);
my_log("Done");
# First do the X axis points
$newdatax = array();
# Reassign newdatax back to datax
$datax = $newdatax; # *KEY LINE*
my_log("Exiting");
?>
Codice:
$ php -v
PHP 5.2.1 (cli) (built: May 3 2007 11:15:31)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.2.8, Copyright (c) 1998-2007, by Zend Technologies
$ php plot_graph.php 2; date
16:27:59: Script Starting
16:27:59: executing Query
16:28:01: Number of results:53068
16:28:01: Fetching Results
16:28:03: Freeing result set
16:28:03: Closing DB connection
16:28:03: Done
16:28:03: Exiting
Thu May 10 16:28:22 BST 2007
$ php plot_graph.php 1; date
16:28:37: Script Starting
16:28:37: executing Query
16:28:39: Number of results:53068
16:28:39: Fetching Results
16:28:41: Freeing result set
16:28:41: Closing DB connection
16:28:41: Done
16:28:41: Exiting
Thu May 10 16:28:41 BST 2007
$ php plot_graph.php 0; date
16:28:45: Script Starting
16:28:45: executing Query
16:28:47: Number of results:53068
16:28:47: Fetching Results
16:28:48: Freeing result set
16:28:48: Closing DB connection
16:28:48: Done
16:28:48: Exiting
Thu May 10 16:28:48 BST 2007
$
|
![]() |
| Segnalibri |
| Thread Tools | Cerca in questo Thread |
| Modalità di visualizzazione | Vota questo thread |
|
|