ID: 12198 Updated by: zeev Reported By: [EMAIL PROTECTED] Status: Open Bug Type: Reproducible crash Operating System: WINDOWS NT PHP Version: 4.0.6 New Comment: 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. Previous Comments: ------------------------------------------------------------------------ [2001-07-17 05:16:27] [EMAIL PROTECTED] 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 -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]