note 64011 deleted from function.fopen by danbrown
| From: | danbrown@php.net | Date: | Mon, 08 Jun 2009 23:37:55 +0000 |
| Subject: | note 64011 deleted from function.fopen by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-156556@lists.php.net to get a copy of this message | ||
Note Submitter: zerkella at mi6 dot com dot ua
----
During development of a set of non-blocking functions for downloading files from http-servers
I've discovered that it's not possible to set timeout for fopen('http://somesite.com/somefile', 'rb').
All functions for controlling non-blocking mode (stream_set_blocking, stream_set_timeout,
stream_context_set_option) use resource handle that is created via fopen(). But fopen() for HTTP
connections internally makes quite a big set of actions: it creates socket, resolves webserver name,
establishes actual connection. So hanging can occur anywhere in resolving and creating
tcp-connection but you cannot control it.
Solutions:
1) Use socket functions. Set socket in non-blocking mode just after creation. Implement
HTTP-protocol yourself. In source code use these manually created functions.
2) Write a wrapper for myprotocol://, which internally will use first solution, but in source code
you'll use fopen('myprotocol://somesite.com/somefile', 'rb') with some way
to set timeout before calling it.