The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
exiting from script arghya_owen Shell Programming and Scripting 1 06-02-2008 06:36 AM
Exiting from script when error occurs Sreejith_VK Shell Programming and Scripting 4 04-25-2008 03:53 AM
Script Not Exiting??? lesstjm Shell Programming and Scripting 1 07-11-2007 11:58 AM
Shell script not exiting Gracefully smithK Shell Programming and Scripting 5 02-08-2007 06:48 PM
exiting in c ruffenator High Level Programming 3 04-28-2002 02:31 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 05-10-2007
Unbeliever Unbeliever is offline
Registered User
  
 

Join Date: Jul 2005
Location: England
Posts: 183
PHP5 Script 'Freeze' before exiting

I recently upgraded a system from php 4.4.2 to php 5.2.1, and one of my scripts has started behaving very strangely. I've tried google but come up blank so far.

Basically what the script does is select a large amount of data from a mysql (4.1.21) database, do some manipulation, the plots a graph (using jpgraph 2.2). I removed all the jpgraph code and am still getting the problem. What happens is the script 'hangs' for a period of time after executing the last php command before actually exiting. During this period of time the process takes up a large amount of CPU time (a whole single processor mostly) but if you truss the process you get no output until it finally exits (when you see stdin/out/err closed etc).

After putting various debug statements in I found that if I commented out the following line the script didn't hang before exiting.

$datax = $newdatax;

A pretty innocuous line. At this point $datax is a large array (many thousands of values long), and $newdatax an array with the results from parsing the original $datax in some way (mostly a case of taking every Nth entry from $datax). At this point I wish to throw away the original $datax and replace it with the new $newdatax and I may wish to do more maniplulation later.

If $datax is about 10000 or so rows there is a noticeable hang when the script exits, at 50000 rows the hang is over 20 seconds. Under php 4 I had no problems with this code when there were over 200,000 rows in the array.

Even if I simply change that line to

$datax = array();

I get similar (but much smaller) 'hang' before the script exits and the $datax array needs to be quite large before it becomes noticeable.

System is running on Solaris 9 on a v480 with 4 processors and 16GB of RAM. I've tried it with and without the Zend optimiser (v3.2.8) with no noticeable difference.

Any help appreciated.
  #2 (permalink)  
Old 05-10-2007
cbkihong cbkihong is offline Forum Advisor  
Advisor
  
 

Join Date: Sep 2002
Location: Hong Kong, China
Posts: 1,624
Have you closed the DB connection immediately when you are done with the database or statement handles etc.? If you are running a resource-intensive script, you should make sure you deallocate things as quickly as you can to avoid holding something for too long. You should not rely on the automatic reference-count garbage collection in this case as it is possible that deallocation may not occur soon enough.

If you are having a variable with very large content, you should consider manually unset() the variables immediately when you are done with it. It may not be related to your case but just try.
  #3 (permalink)  
Old 05-10-2007
Unbeliever Unbeliever is offline
Registered User
  
 

Join Date: Jul 2005
Location: England
Posts: 183
Sorry forgot to say, I explicitly added mysql_free_result and mysql_close calls to make sure it wasnt that. I've tried doing

unset($datax);

before re-assigning it and I get the same 'hang'.
  #4 (permalink)  
Old 05-10-2007
cbkihong cbkihong is offline Forum Advisor  
Advisor
  
 

Join Date: Sep 2002
Location: Hong Kong, China
Posts: 1,624
Not too sure about that.

In fact I made a simple script:

Code:
<?php

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

?>
So I am assigning a 50001-element array to another variable. There doesn't seem to be any speed issue on my PHP 5.2.0. It's just a desktop system.

But are you sure of the changes between PHP4 and PHP5 regarding variable/object assignment (copying) behaviour? As you cannot provide with the simplest version of the script that give the behaviour, I guess everything mentioned can just be a wild guess.
  #5 (permalink)  
Old 05-10-2007
Unbeliever Unbeliever is offline
Registered User
  
 

Join Date: Jul 2005
Location: England
Posts: 183
Ok I have the code down to about the smallest I can and still show you what is happening. The include.php is simply the databsae connection details. With the data I have the query returns 53068 rows. You call the script with the argument 0, 1 or 2 to use the 3 different queries (For 2, 3 or 4 total columns returned). With 0 or 1 the script exits immedaitely after printing 'Exiting', with 2 there is an 18-20 second delay.

The columns returned are:

date: a date/time stamp
r_per_sec: A floating point numer
b_workers: An integer
I_workers: An integer

If I comment out any one of the three lines marked "*KEY LINE*" then the script exits immediately.

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");
?>
Ouput from my system when running the above script 3 times:

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

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -4. The time now is 09:10 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language translation by Google.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0