Edit report at https://bugs.php.net/bug.php?id=52766&edit=1
ID: 52766 Comment by: e dot honda at coussi-net dot com Reported by: trevor dot lanyon at lanyonconsulting dot com Summary: FTP need the ability to read from the output buffer without issuing a command Status: Closed Type: Feature/Change Request Package: FTP related Operating System: Fedora 13 PHP Version: 5.3.3 Assigned To: rasmus Block user comment: N Private report: N New Comment: Issuing an empty command as ftp_raw($connection, '') to grab the response in the buffer. It works like: 1) ftp_raw($connection, 'STOR'); -> It returns "150 OK to send data". 2) ftp_raw($connection, ''); -> It returns "226 Transfer complete". 3) ftp_raw($connection, 'NOOP'); -> It returns "200 NOOP ok" According to the server side log, the command '' is just ignored. Previous Comments: ------------------------------------------------------------------------ [2012-11-16 20:36:40] bar at root dot co dot il Hi, seems that in PHP 5.3.19 this bug is still exists. ------------------------------------------------------------------------ [2011-11-01 21:09:21] ras...@php.net This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. For Windows: http://windows.php.net/snapshots/ Thank you for the report, and for helping us make PHP better. ------------------------------------------------------------------------ [2011-11-01 17:57:36] bram at ebskamp dot me This is caused by the bug I posted about yesterday: https://bugs.php.net/bug.php?id=60183 (has been fixed in SVN today) ------------------------------------------------------------------------ [2011-09-13 20:50:49] 92spam92 at gmail dot com hi, i have the same problem. PHP 5.3.8 CentOS 6. the only solution is to close the ftp connection and re-open it. ------------------------------------------------------------------------ [2010-09-02 18:05:02] trevor dot lanyon at lanyonconsulting dot com Description: ------------ Working with ftp_raw there is a need for a function that allows interaction with the output buffer of the connection. There are times when issuing commands leaves messages on the buffer thereby causing future commands to be out of sync with the output and no way to synchronize them. Below is an example: Using HylaFax's proprietary ftp interface I required the ability to issue a 'STOT' command. I issued a 'PASV' command to get the appropriate port to open a second connection to. I open a second connection, write a file, then close it. The original connection now has a line on the output buffer similar to this: 226 Transfer complete (FILE: /tmp/doc94274.tmp) But there is no way to grab this. Issuing any command will return the buffered line. Subsequent commands will return the output of the previous command. For example if I now issue a 'NOOP' I will now get the: 226 Transfer complete (FILE: /tmp/doc94274.tmp). and If I issue a second 'NOOP' I will get the response from the orginal 'NOOP': 200 NOOP command successful With the second Noop now sitting on the out buffer of the ftp connection. Test script: --------------- <?php /** * This example will require the use of a HylaFax Server with the -i option * enabled. */ $fileName = '/foo/test.pdf'; $hylaFaxServer = 'localhost'; $user = 'Mr. Peters'; function getResultCode( $resultString ) { $resultCode = false; if( strpos($resultString, ' ') > 2) { $resultCode = substr($resultString, 0, strpos($resultString, ' ' ) ); return $resultCode; } return $resultCode; } function getResultToString( $resultArray, $glue = "\n" ) { if ( is_array( $resultArray ) ) { return implode($resultArray, $glue ); } return false; } function sendFile( $localFileName, $connection, $hostName ) { //Enter PASV mode if($results = getResultToString( ftp_raw($connection, 'PASV') )) { //Make sure we got the appropriate 227 back if(getResultCode( $results ) == 227) { //Grab the ip and ports out of the response $ports = substr($results, strpos($results, '(')+1 ) ; //get rid of the extra ')' as the end $ports = substr($ports, 0, strlen($ports) - 1); //make an array of the results using the ',' as the seporator $ports = explode(",", $ports); //grab the last octet $lastOctet = array_pop($ports); //grab the first octet $firstOctet = array_pop($ports); //deduce the appropriate port to connect back to $port = $firstOctet * 256 + $lastOctet; //create a connection to listen on if( $passiveSocket = fsockopen( $hostName, $port) ) { //Tell the ftp server to make a connection if($results = getResultToString(ftp_raw( $connection, 'STOT' ) ) ) { //make sure the connection was successful if(getResultCode($results) == 150) { //Write the file over the new socket if( fwrite( $passiveSocket, $localFileName ) ) { //Close the socket if(fclose( $passiveSocket ) ) { $results = getResultToString( ftp_raw( $connection, 'STAT' ) ); echo "Results of stat:\n"; echo $results; echo "Results of Noop:\n"; $results = getResultToString( ftp_raw( $connection, 'noop' ) ); echo $results; } // socket closure } //file writing } //result of STOT command to first socket } else { //issue the STOT Command to first socket echo 'Unexpected result from STOR: '; var_dump( $results )."\n"; } } //Attempt to open second socket on local machine } else { //Unexpected resultcode from pasv command echo 'Unexpected result code from passive mode: '.getResultCode ($results ); } // review result code from PASV command return true; } //Attempt to send PASV command to connection return false; } function output(&$item, $key) { echo $item."\n"; } $connection = ftp_connect($hylaFaxServer , '4559'); array_walk( ftp_raw($connection, 'USER '.$user), 'output' ); array_walk( ftp_raw($connection, 'FORM PDF'), 'output' ); array_walk( ftp_raw($connection, 'TYPE I'), 'output' ); $uploadedFileName = sendFile($fileName, $connection, $hylaFaxServer); array_walk( ftp_raw($connection, 'JNEW'), 'output' ); array_walk( ftp_raw($connection, 'JPARM FROMUSER "'.$user.'"'), 'output' ); array_walk( ftp_raw($connection, 'JPARM LASTTIME 000259'), 'output' ); array_walk( ftp_raw($connection, 'JPARM MAXDIALS 12'), 'output' ); array_walk( ftp_raw($connection, 'JPARM MAXTRIES 3'), 'output' ); array_walk( ftp_raw($connection, 'JPARM SCHEDPRI 127'), 'output' ); array_walk( ftp_raw($connection, 'JPARM DIALSTRING "3340746"'), 'output' ); array_walk( ftp_raw($connection, 'JPARM NOTIFYADDR "r...@localhost.com"'), 'output' ); array_walk( ftp_raw($connection, 'JPARM VRES 196'), 'output' ); array_walk( ftp_raw($connection, 'JPARM PAGEWIDTH 215'), 'output' ); array_walk( ftp_raw($connection, 'JPARM PAGELENGTH 279'), 'output' ); array_walk( ftp_raw($connection, 'JPARM NOTIFY "none"'), 'output' ); array_walk( ftp_raw($connection, 'JPARM PAGECHOP "none"'), 'output' ); array_walk( ftp_raw($connection, 'JPARM CHOPTHRESHOLD 3'), 'output' ); array_walk( ftp_raw($connection, 'JPARM DOCUMENT '.$uploadedFileName ), 'output' ); array_walk( ftp_raw($connection, 'JSUBM'), 'output' ); ftp_close($connection); ?> Expected result: ---------------- 230 User Mr. Peters logged in. 200 Format set to PDF. 200 Type set to Image. 226 Transfer complete (FILE: /tmp/doc96.pdf). Results of stat: 211-samadams.northrock.local HylaFAX server status: HylaFAX (tm) Version 5.4.2 Connected to localhost.localdomain (127.0.0.1) Logged in as user Mr. Peters (uid 60002) "/" is the current directory Current job: (default) Time values are handled in GMT Idle timeout set to 900 seconds Using long replies No server down time currently scheduled HylaFAX scheduler reached at /FIFO (not connected) Server FIFO is /client/26610 (open) File cache: 17 lookups, 1 hits (5.9%), 1.1 avg probes 16 entries (2.9 KB), 0 entries displaced, 0 entries flushed TYPE: Image; STRU: File; MODE: Stream; FORM: PDF No client data connection 211 End of status Results of Noop: 200 NOOP command successful. 200 New job created: jobid: 73 groupid: 73. 213 FROMUSER set to "Mr. Peters". 213 LASTTIME set to 000259. 213 MAXDIALS set to 12. 213 MAXTRIES set to 3. 213 SCHEDPRI set to 127. 213 DIALSTRING set to "3340746". 213 NOTIFYADDR set to "r...@localhost.com". 213 VRES set to 196. 213 PAGEWIDTH set to 215. 213 PAGELENGTH set to 279. 213 NOTIFY set to "none". 213 PAGECHOP set to "none". 213 CHOPTHRESHOLD set to 3. 550 1: No such file or directory. Actual result: -------------- 230 User Mr. Peters logged in. 200 Format set to PDF. 200 Type set to Image. Results of stat: 226 Transfer complete (FILE: /tmp/doc96.pdf).Results of Noop: 211-samadams.northrock.local HylaFAX server status: HylaFAX (tm) Version 5.4.2 Connected to localhost.localdomain (127.0.0.1) Logged in as user Mr. Peters (uid 60002) "/" is the current directory Current job: (default) Time values are handled in GMT Idle timeout set to 900 seconds Using long replies No server down time currently scheduled HylaFAX scheduler reached at /FIFO (not connected) Server FIFO is /client/26610 (open) File cache: 17 lookups, 1 hits (5.9%), 1.1 avg probes 16 entries (2.9 KB), 0 entries displaced, 0 entries flushed TYPE: Image; STRU: File; MODE: Stream; FORM: PDF No client data connection 211 End of status200 NOOP command successful. 200 New job created: jobid: 73 groupid: 73. 213 FROMUSER set to "Mr. Peters". 213 LASTTIME set to 000259. 213 MAXDIALS set to 12. 213 MAXTRIES set to 3. 213 SCHEDPRI set to 127. 213 DIALSTRING set to "3340746". 213 NOTIFYADDR set to "r...@localhost.com". 213 VRES set to 196. 213 PAGEWIDTH set to 215. 213 PAGELENGTH set to 279. 213 NOTIFY set to "none". 213 PAGECHOP set to "none". 213 CHOPTHRESHOLD set to 3. 550 1: No such file or directory. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=52766&edit=1