|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2001-11-14 09:48 UTC] msjackson at bluemail dot ch
I think there is really a problem with repeated ftp_rawlist (Reported in #7897). I write a script which make several ftp_rawlists to indexing all the content. In most case, the task "hangs up" for 1 or 2 minutes. Then the program will continue, but it can be that it hangs up again. When I start the script directly (cmd-line), it will run well. But when I start it trough the task scheduler or the web server, it hangs up always. I can't explain the problem more, because this is all -> Repeated ftp_rawlist, script is running under user "system". PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Nov 05 18:00:01 2025 UTC |
I had the same problem with linux and PHP 4.1.1. In my opinion there's a problem in line 886 of file ext/ftp/ftp.c. I replaced memmove(ftp->inbuf, ftp->inbuf+4, FTP_BUFSIZE-4); with memmove(ftp->inbuf, ftp->inbuf+4, FTP_BUFSIZE-4); if (ftp->extra) ftp->extra -= 4; The execution of memmove drops 4 bytes of the last response text which is stored in ftp->inbuf. In case of ftp->extra != NULL, there are extra characters and 4 characters of the next response are lost if you don't adjust ftp->extra.This is still an issue. Find below a test script which does a recursive directory listing of a FTP server. This hangs on ProFTPd (Tested on >1.2.2) for the timeout period every so often on the ftp_rawlist (It seems mostly to be empty directories, but not always) but will usually continue working on the second or third retry. It seems OK on other FTP servers, but I've not been able to really test this. The FTP server logs indicate that the LIST has finished and has been transmitted. The fix by resolves this issue, I will post a patch against 4.3.0-dev in a seperate comment. =============================== <? $ConnId = ftp_connect( "localhost" ); $LoginId = ftp_login( $ConnId, "carl", "passwd" ); if ( !$ConnId || !$LoginId ) { echo "Login failed!\n"; die(); } ftp_pasv( $ConnId, true ); function doDirectory( $Path, $Depth ) { global $ConnId; echo str_repeat( " ", $Depth ); echo "'$Path'\n"; ftp_chdir( $ConnId, $Path ); unset($ThisPath); $i = 1; while ( !is_array( $ThisPath ) ) { $ThisPath = ftp_rawlist( $ConnId, "-al" ); if ( !is_array( $ThisPath ) ) { echo str_repeat( " ", $Depth+2 ); echo "*** Error, Retrying ".($i++)." ...\n"; } } foreach( $ThisPath AS $Entry ) { if( ereg( "([-d])[rwxst-]{9}.* ([0-9]*) [a-zA-Z]+ [0-9: ]*[0-9] (.+)", $Entry, $Bits ) ) { if ( $Bits[3] == "." || $Bits[3] == ".." ) { continue; } if ( $Bits[1] == "d" ) { doDirectory( $Bits[3], $Depth+2 ); } else { echo str_repeat( " ", $Depth+2 ); echo $Bits[3]."\n"; } } ## Matches the ereg? } ## Iterate directory entries ftp_chdir( $ConnId, ".." ); } ## End doDirectory() doDirectory( "", 0 ); ?>Here is the aforementioned patch ... ====================== Index: ftp.c =================================================================== RCS file: /repository/php4/ext/ftp/ftp.c,v retrieving revision 1.49 diff -u -r1.49 ftp.c --- ftp.c 18 Mar 2002 22:26:32 -0000 1.49 +++ ftp.c 3 Jul 2002 15:28:36 -0000 @@ -919,6 +919,8 @@ (ftp->inbuf[2] - '0'); memmove(ftp->inbuf, ftp->inbuf + 4, FTP_BUFSIZE - 4); + if ( ftp->extra ) + ftp->extra -= 4; return 1; }