I have a script that checks responses from HTTP servers using the PEAR HTTP classes. However, I've recently found that the script fails on FTP servers (and probably anything that's not HTTP or HTTPS). I tried Google, but didn't see any scripts or code that returned the server status code from servers other than HTTP servers.

How can I find out the status of a newsgroup or FTP server using PHP?

EDIT: I should clarify that I am interested only in the ability to read from an FTP server and the directory that I specify. I need to know if the server is dead/gone, I'm not authorized to read, etc.

Please note that, although most of the time I'm language agnostic, the entire website is PHP-driven, so a PHP solution would be the best for easy of maintainability and extensibility in the future.


Wouldn't it be simpler to use the built-in PHP FTP* functionality than trying to roll your own? If the URI is coming from a source outside your control, you would need to check the protocal definition (http:// or ftp://, etc) in order to determine which functionality to use, but that is fairly trivial. If there is now protocal specified (there really should be!) then you could try to default to http.

+1  A: 

HTTP works slightly differently than FTP though unfortunately. Although both may look the same in your browser, HTTP works off the basis of URI (i.e. to access resource A, you have an identifier which tells you how to access that).

FTP is very old school server driven. Even anonymous FTP is a bit of a hack, since you still supply a username and password, it's just defined as "anonymous" and your email address.

Checking if an FTP server is up means checking

  1. That you can connect to the FTP server

    if (!($ftpfd = ftp_connect($hostname))) { ... }

  2. That you can login to the server:

    if (!ftp_login($ftpfd, $username, $password)) { ... }

  3. Then, if there are further underlying resources that you need to access to test whether a particular site is up, then use an appropiate operation on them. e.g. on a file, maybe use ftp_mdtm() to get the last modified time or on a directory, see if ftp_nlist() works.

It should be noted that, by default, these FTP functions are not enabled when PHP is compiled, at least on the systems that I used.
Thomas Owens

If you want to read specific responses you will have to open a socket and read/write data manually.

$sock = fsockopen($hostname, $port);

Then you'll have to fput/fread data back and forth.
This will require you to read up on the FTP protocol.