Reply to Re: [PHP] URL -> stream context

Your name:

Reply:


Posted by Jochem Maas on 01/20/06 15:10

I think you need to create a stream context resource with:

http://www.php.net/manual/en/function.stream-context-create.php

set the options you need on it with:
http://www.php.net/manual/en/function.stream-context-set-option.php

then pass the resource as the 4th arg to fopen() (rather passing in an array)


....i think

Richard Lynch wrote:
> 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)
>

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация