|
Posted by "Richard Lynch" on 01/20/06 01:28
On Thu, January 19, 2006 4:08 pm, Geoff wrote:
> I honestly have no idea if this would work, but maybe fopen supports
> non-blocking connections?
Not as far as I can tell...
You can call stream_set_blocking after it's open, but that doesn't
help a slow connection in the first place.
> Or creation of context-based connections
> (for which you can use stream_set_blocking).
Unless I'm seriously mis-reading docs, stream_set_blocking can only be
called on an already-open stream, not on the soon-to-be-opened stream.
fopen() in PHP5 does take a context, and if I could figure out how to
embed the concepts of "do not block" and "timeout in $x seconds"
within a context from the docs, and if fopen() would still handle all
the details of the various protocols, I'd be all set...
That's sort of what I was asking for in the original email, but...
It seems like you have to specify the 'scheme' as the key in the
context array.
So, I guess, I could, in theory, find a listing of all the schemes
fopen() supports, which might even be in a function, iterate over all
of those, and do something like:
$schemes = function_that_returns_all_schemes_fopen_supports();
$opts = array();
foreach($schemes as $scheme){
$opts[$scheme]['some_magic_undocumented_thing'] =
STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT ;
}
$foo = fopen($url, 'r', false, $opts);
if ($foo == false) $errors[] = "$url timed out";
Only problem is, these constants are documented ONLY to work with:
http://www.php.net/manual/en/function.stream-socket-client.php
and that pretty clearly is working at a much lower-level than fopen
(and friends) as the very first example shows using TCP as a protocol,
and then you have to send the GET and any other headers, which is
exactly what I'm trying to avoid having to re-code in the first place.
So I'm back to square one, as far as I can see from the docs...
It's possible (still) that I'm just mis-reading docs, or am
continually skipping over the one new page in 'streams' that is making
everybody think this should be so simple, but I don't think so, since
I've read EVERY page in the new streams section several times now.
I'm not claiming 100% comprehension of every implication on every
page, mind you :-)
> If so, you could take a
> stamp of the current time plus a timeout value, make the fopen call
> (which would return immediately) then wait politely (I mean that
> from a CPU perspective) in a loop until you have data, or the
> current time goes past your time stamp.
Yes -- if I could compose a stream_context doohickey that convinced
fopen() to use a time-out...
> Another avenue for investigation might be to try file_get_contents
> to see if it's connection timeout can be controlled. It seems to
> work in a similar way to fopen, in terms of having wrappers that are
> aware of multiple resource types.
file_get_contents() seems to suffer from the exact same limitations of
file()
I get the simplicity of fopen() with no control over connection timeout.
Maybe there is some underlying voodoo going on in the PHP internals
that some makes it crystal-clear why that has to be, but to this naive
user, if fsockopen can have a timeout, fopen and friends out to be
able to also, at least for schemes that support such a thing.
Obviously SOME kind of timeout is involved somewhere in fopen()
because it WILL timeout on some sites sometimes, even though
experimentation has shown that had it waited, it would have gotten
data eventually.
> It might also be worth taking a look at cURL or similar libraries
> that are also multi-resource aware, but give you greater control of
> connections parameters and timeouts.
Maybe I've been mis-using cURL all these years, but it doesn't seem to
be anywhere near as simple as the mythical function I've described,
and really not much better than a giant switch for fsockopen to
duplicate all that code that's gotta be down in the guts of fopen (and
friends)
--
Like Music?
http://l-i-e.com/artists.htm
[Back to original message]
|