The UNIX and Linux Forums  

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > De programmation et de script Shell
.
google unix.com



De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici.

Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
Fil Thread Starter Forum Réponses Last Post
sortie de script arghya_owen De programmation et de script Shell 1 06-02-2008 07:36 AM
Sortie d'erreur de script se produit lorsque Sreejith_VK De programmation et de script Shell 4 04-25-2008 04:53 AM
Script Non Sortie? lesstjm De programmation et de script Shell 1 07-11-2007 12:58 PM
Shell script de ne pas sortir avec grâce smithK De programmation et de script Shell 5 02-08-2007 06:48 PM
d'en sortir en c ruffenator High Level Programming 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 Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 05-10-2007
Infidèle Unbeliever is offline
Registered User
  
 

Date d'inscription: juillet 2005
Lieu: Angleterre
Messages: 183
PHP5 Script 'Freeze' avant d'en sortir

J'ai récemment mis à niveau un système à partir de PHP 4.4.2 à PHP 5.2.1, et un de mes scripts a commencé à se comporter très bizarrement. J'ai essayé google, mais se vide jusqu'à présent.

Fondamentalement, ce que le script ne fait que choisir une grande quantité de données à partir d'un mysql (4.1.21) de base de données, faire des manipulations, les parcelles d'un graphique (utilisation de jpgraph 2,2). J'ai supprimé tous les jpgraph code et je suis toujours et encore le problème. Qu'est-ce qui se passe, c'est le script "bloque" pour une période de temps après l'exécution de la dernière commande php avant de sortir. Au cours de cette période de temps, le processus prend beaucoup de temps processeur (un seul processeur le plus souvent), mais si tu fermes le processus, vous ne recevrez pas de sortie jusqu'à ce que finalement il des sorties (quand vous voyez stdin / out / err fermé, etc.)

Après avoir mis debug divers états dans J'ai trouvé que si je commente la ligne suivante du script n'a pas raccrocher avant d'en sortir.

datax $ \u003d $ newdatax;

Une jolie ligne inoffensif. À ce stade $ datax est un grand tableau (plusieurs milliers de valeurs de long), et $ newdatax un tableau avec les résultats de l'analyse de l'original $ datax d'une certaine manière (la plupart d'un cas de prise de chaque Nième entrée à partir de $ datax). À ce stade, je tiens à jeter l'original datax $ et le remplacer par le nouveau $ newdatax mai, et je tiens à faire plus maniplulation plus tard.

Si datax est d'environ $ 10000 ou si les lignes il ya une notable bloquer lorsque le script quitte à 50000 lignes de la pendre est de plus de 20 secondes. Sous php 4, j'ai eu aucun problème avec ce code quand il y avait plus de 200.000 lignes de la matrice.

Même si je change simplement la ligne de

$ datax \u003d array ();

I get similaire (mais beaucoup plus petit) "blocage", avant les sorties et le script de dollars datax tableau doit être assez large, avant qu'il ne soit perceptible.

Le système est en cours d'exécution sur Solaris 9 sur un V480 avec 4 processeurs et 16 Go de RAM. J'ai essayé avec et sans le Zend optimiser (v3.2.8), sans différence notable.

Toute aide appréciée.
  #2 (permalink)  
Old 05-10-2007
cbkihong cbkihong is offline Forum Advisor  
Conseiller
  
 

Join Date: Sep 2002
Lieu: Hong Kong, Chine
Messages: 1624
Avez-vous fermé la connexion DB immédiatement lorsque vous avez terminé avec la base de données ou de la déclaration poignées etc? Si vous utilisez un script à forte intensité de ressources, vous devez vous assurer que vous désallouer les choses aussi vite que vous pouvez pour éviter de tenir quelque chose de trop long. Vous ne devez pas compter sur le renvoi automatique de compte la collecte des ordures, dans ce cas il est possible que Désalloue mai pas assez tôt.

Si vous avez une variable avec le contenu très large, vous devriez envisager manuellement unset () les variables immédiatement lorsque vous avez fini avec elle. Il mai de ne pas être lié à votre cas, mais juste essayer.
  #3 (permalink)  
Old 05-10-2007
Infidèle Unbeliever is offline
Registered User
  
 

Date d'inscription: juillet 2005
Lieu: Angleterre
Messages: 183
Désolé oublié de dire, je explicitement ajouté mysql_free_result mysql_close appels et de faire en sorte que il wasnt. J'ai essayé de faire

unset ($ datax);

avant de re-attribuer et j'obtiens le même "blocage".
  #4 (permalink)  
Old 05-10-2007
cbkihong cbkihong is offline Forum Advisor  
Conseiller
  
 

Join Date: Sep 2002
Lieu: Hong Kong, Chine
Messages: 1624
Pas trop sûr de cela.

En fait, j'ai fait un simple script:

Code:
<?php

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

?>
Je suis donc l'attribution d'un 50001-élément de tableau à une autre variable. Il ne semble pas y avoir de problème sur ma vitesse de PHP 5.2.0. C'est juste un système de bureau.

Mais êtes-vous sûr de l'évolution entre PHP4 et PHP5 en ce qui concerne la variable / objet de cession (copie) de comportement? Comme vous ne pouvez pas fournir à la simple version du script qui donnent le comportement, je pense tout simplement être mentionné sauvage deviner.
  #5 (permalink)  
Old 05-10-2007
Infidèle Unbeliever is offline
Registered User
  
 

Date d'inscription: juillet 2005
Lieu: Angleterre
Messages: 183
Ok, j'ai le code à propos de la plus petite et je peux encore vous montrer ce qui se passe. Le include.php est tout simplement la connexion databsae détails. Avec les données que j'ai la requête renvoie 53.068 lignes. Vous appelez le script avec l'argument 0, 1 ou 2 pour utiliser les 3 requêtes différentes (pour les 2, 3 ou 4 colonnes retourné total). Avec 0 ou 1, le script quitte immedaitely après l'impression «Sortie», avec 2 il ya un 18-20 secondes de retard.

Les colonnes sont retournées:

date: une date / heure
r_per_sec: Une virgule flottante numer
b_workers: Un nombre entier
I_workers: Un nombre entier

Si je commenter l'une des trois lignes marquées "* KEY LINE *" puis le script quitte immédiatement.

Code:
<?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");
?>
Sortie de mon système lors de l'exécution du script ci-dessus 3 fois:

Code:
$ 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

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 01:21 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0