Bug #12198 Updated: Problem with recursive function - only works if I echo something in it
| From: | yohgaki@php.net | Date: | Mon, 04 Feb 2002 07:12:03 +0000 |
| Subject: | Bug #12198 Updated: Problem with recursive function - only works if I echo something in it | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-79041@lists.php.net to get a copy of this message | ||
ID: 12198
Updated by: yohgaki@php.net
Reported By: silvio@european-internet.com
-Status: Open
+Status: Bogus
Bug Type: Reproducible crash
Operating System: WINDOWS NT
PHP Version: 4.0.6
New Comment:
The version of PHP that this bug was reported in is too old. Please
try to reproduce this bug in the latest version of PHP (available
from http://www.php.net/downloads.php
If you are still able to reproduce the bug with one of the latest
versions of PHP, please change the PHP version on this bug report
to the version you tested and change the status back to "Open".
Previous Comments:
------------------------------------------------------------------------
[2001-07-22 15:35:43] zeev@php.net
Are you sure that when you print out something, does the script run all
the way and terminate properly? Printing may just give you a 'sign of
life', but it may time-out eventually still.
------------------------------------------------------------------------
[2001-07-17 05:16:27] silvio@european-internet.com
I've written this class to scan through a remote directory using FTP
functions. A recursive function is used to do the job, but it only
works if I print something to screen, else it hangs and the the script
eventually times out.
Here's the code, notice the first line of function readDir():
class SiteScan {
var $_sSite;
var $_iPort;
var $_sUsername;
var $_sPassword;
var $_bDebug;
var $_aErrors;
//ftp
var $_iConnectionStream;
var $_sSystemType;
var $_aFileStructure;
function
SiteScan($site='localhost',$u='Administrator',$p='',$port=21) {
//init connection
$this->_iPort = $port;
$this->_sSite = $site;
$this->_sUsername = $u;
$this->_sPassword = $p;
$this->_bDebug = true;
$this->_aErrors = array();
//try to obtein an ftp stream
if ($stream = ftp_connect($this->_sSite,$this->_iPort)) {
$this->_iConnectionStream = $stream;
//FileSystem successfully determined, now try to log in
if
(!ftp_login($this->_iConnectionStream,$this->_sUsername,$this->_sPassword))
{
$this->_aErrors[] = '<b>ERROR 002:</b> Username '
.$this->_sUsername. ' and password ' .$this->_sPassword. ' rejected';
} else {
//connection successful! Now try to determine operating
system
if (!$this->_sSystemType = ftp_systype($stream)) {
$this->_aErrors[] = '<b>ERROR 003:</b> File system
type could not be determined';
}
}
} else {
$this->_aErrors[] = '<b>ERROR 001:</b> Could not connect to
' . $this->_sSite . ':' . $this->_iPort;
}
if ($this->_bDebug) {
$this->_onError();
}
}
function _analyseDir($aDirLine) {
$aDirInfo = array();
if(ereg("([-dl])[rwxst-]{9}",substr($aDirLine,0,10))) {
$this->_sSystemType = "UNIX";
}
if (substr($aDirLine,0,5) == "total") {
$aDirInfo[0] = -1;
} elseif ($this->_sSystemType == "Windows_NT") {
if (ereg("[-0-9]+ *[0-9:]+[PA]?M? +<DIR>
{10}(.*)",$aDirLine,$aRegExp)) {
$aDirInfo[0] = 1;
$aDirInfo[1] = 0;
$aDirInfo[2] = $aRegExp[1];
} elseif(ereg("[-0-9]+ *[0-9:]+[PA]?M? +([0-9]+)
(.*)",$aDirLine,$aRegExp)) {
$aDirInfo[0] = 0;
$aDirInfo[1] = $aRegExp[1];
$aDirInfo[2] = $aRegExp[2];
}
} elseif ($this->_sSystemType == "UNIX") {
if (ereg("([-d])[rwxst-]{9}.* ([0-9]*) [a-zA-Z]+ [0-9:
]*[0-9] (.+)",$aDirLine,$aRegExp)) {
if ($aRegExp[1]=="d") $aDirInfo[0] = 1;
$aDirInfo[1] = $aRegExp[2];
$aDirInfo[2] = $aRegExp[3];
}
}
if (($aDirInfo[2] == ".") || ($aDirInfo[2] == "..")) {
$aDirInfo[0] = 0;
}
return $aDirInfo;
}
function readDir($sDir) {
//if this echo statement is removed, then the whole script
hangs!!!
echo ' ';
//get an array of files from the base directory
$aDirList = ftp_rawlist($this->_iConnectionStream,"");
for ($iCount=0;$iCount<count($aDirList);$iCount++) {
$aDirInfo = $this->_analyseDir($aDirList[$iCount]);
//if current file is a directory
if ($aDirInfo[0] == 1) {
$sNewDir = "$sDir/$aDirInfo[2]";
if (($aDirInfo[2] == "~") || (substr($aDirInfo[2],0,1)
== " ")) {
$chdir=ftp_chdir($this->_iConnectionStream,$sNewDir);
} else {
$chdir=ftp_chdir($this->_iConnectionStream,$aDirInfo[2]);
}
$stop = 0;
if (!$stop && $chdir) {
$this->readDir($sNewDir);
}
if (!ftp_chdir($this->_iConnectionStream,$sDir)) {
ftp_cdup($this->_iConnectionStream);
}
} elseif ($aDirInfo[0]==0) {
$this->_aFileStructure[$sDir][] = $aDirInfo[2];
$size += $aDirInfo[1];
}
}
}
function _onError() {
//
if (count($this->_aErrors) > 0) {
echo '<div id="debug" style="position:absolute; left:25px;
top:30px; width:575px; height:15px; z-index:1; background-color:
#FFFFCC; layer-background-color: #FFFFCC; border: 1px none
#000000">'."\n".'<pre>';
while (list($iKey,$sError) = each($this->_aErrors)) {
echo $sError."\n";
}
echo '</pre></div>';
}
}
function ftpClose() {
//
ftp_quit($this->_iConnectionStream);
}
}
//
echo '<pre>connecting to ftp site<br>';
$ftp = new
SiteScan('yoursite','username','password','port');
$ftp->readDir('');
$ftp->ftpClose();
print_r($ftp->_aFileStructure);
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=12198&edit=1