The UNIX and Linux Forums  

Go Back   UNIX e Linux Forum > Inizio Forum > Shell scripting e di programmazione
.
google unix.com



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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Cerca in questo Thread Rate Thread Modalità di visualizzazione
  #1 (permalink)  
Old 05-10-2007
Miscredente Unbeliever is offline
Utente Registrato
  
 

Iscriviti Data: luglio 2005
Località: Inghilterra
Interventi: 183
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.
  #2 (permalink)  
Old 05-10-2007
cbkihong cbkihong is offline Forum Advisor  
Advisor
  
 

Join Date: Sep 2002
Posizione: Hong Kong, Cina
Interventi: 1.624
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.
  #3 (permalink)  
Old 05-10-2007
Miscredente Unbeliever is offline
Utente Registrato
  
 

Iscriviti Data: luglio 2005
Località: Inghilterra
Interventi: 183
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'.
  #4 (permalink)  
Old 05-10-2007
cbkihong cbkihong is offline Forum Advisor  
Advisor
  
 

Join Date: Sep 2002
Posizione: Hong Kong, Cina
Interventi: 1.624
Non troppo sicuro di questo.

In realtà ho fatto un semplice script:

Codice:
<?php

$ary = range(0, 50000);
$newary = $ary;

?>
Quindi io sono l'assegnazione di una 50001-array ad un altro elemento variabile. Sembra che non ci sia alcun problema di velocità sul mio PHP 5.2.0. E 'solo un sistema desktop.

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.
  #5 (permalink)  
Old 05-10-2007
Miscredente Unbeliever is offline
Utente Registrato
  
 

Iscriviti Data: luglio 2005
Località: Inghilterra
Interventi: 183
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");
?>
Uscita dal mio sistema quando si esegue lo script qui sopra 3 volte:

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
$
Closed Thread

Segnalibri

Thread Tools Cerca in questo Thread
Cerca in questo Thread:

Ricerca Avanzata
Modalità di visualizzazione Vota questo thread
Vota questo thread:

Distacco regolamento
Tu non può post nuovo thread
Tu non può inviare una risposta
Tu non può postare allegati
Tu non può modificare i tuoi post

BB codice è Su
Smilies sono Su
[IMG] codice Su
Codice HTML è Chiuso
Trackbacks sono Su
Pingbacks sono Su
Refbacks sono Su




Tutti gli orari sono GMT -4. La data di oggi è 12:40 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traduzioni Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX e Linux Forum Content Copyright © 1993-2009. Tutti i diritti Reserved.Ad di gestione da RedTyger

Contenuti pertinenti URL da vBSEO 3.2.0