downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

stream_context_get_default> <stream_bucket_prepend
Last updated: Fri, 13 Nov 2009

view this page in

stream_context_create

(PHP 4 >= 4.3.0, PHP 5)

stream_context_createストリームコンテキストを作成する

説明

resource stream_context_create ([ array $options [, array $params ]] )

options に、 指定されたオプションが予め設定されたストリームコンテキストを作成し、 それを返します。

パラメータ

options

次のような形式の連想配列からなる連想配列でなくてはなりません。 $arr['wrapper']['option'] = $value.

デフォルトは空の配列です。

params

$arr['parameter'] = $value 形式の連想配列でなくてばなりません。 標準のストリームパラメータについては コンテキストパラメータ を参照ください。

返り値

ストリームコンテキストリソースを返します。

変更履歴

バージョン 説明
5.3.0 オプションの引数 params が追加されました。

例1 stream_context_create() の使用

<?php
$opts 
= array(
  
'http'=>array(
    
'method'=>"GET",
    
'header'=>"Accept-language: en\r\n" .
              
"Cookie: foo=bar\r\n"
  
)
);

$context stream_context_create($opts);

/* 上のヘッダと共に http リクエストを www.example.com に対して
   送出します */
$fp fopen('http://www.example.com''r'false$context);
fpassthru($fp);
fclose($fp);
?>

参考



stream_context_get_default> <stream_bucket_prepend
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
stream_context_create
mathieu dot laurent at gmail dot com
30-Jul-2009 03:15
Connection via Proxy

<?php

$opts
= array('http' => array('proxy' => 'tcp://127.0.0.1:8080', 'request_fulluri' => true));
$context = stream_context_create($opts);

$data = file_get_contents('http://www.php.net', false, $context);

echo
$data;

?>
fabien dot potencier at sensio dot com
25-Jun-2009 10:55
Nice example from http://fabien.potencier.org/article/20/tweeting-from-php :

Twitter is everywhere nowadays. Odds are eventually you will want to tweet from PHP. No need to use one of the numerous PHP Twitter libraries, as tweeting is as simple as using the PHP built-in file_get_contents() function:

<?php
function tweet($message, $username, $password)
{
 
$context = stream_context_create(array(
   
'http' => array(
     
'method'  => 'POST',
     
'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                  
"Content-type: application/x-www-form-urlencoded\r\n",
     
'content' => http_build_query(array('status' => $message)),
     
'timeout' => 5,
    ),
  ));
 
$ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);
 
  return
false !== $ret;
}
?>

Pretty easy, no? Using the tweet() function is of course a piece of cake:

<?php
tweet
('From PHP, yeah...', 'fabpot', 'Pa$$');
?>

As an added bonus, the function returns true if everything went fine, or false otherwise.
Brian Gottier
16-May-2009 09:13
In some cases, set a header option as an array, and not a string, depending on server configuration.

<?php
$opts
= array(
 
'http'=> array(
   
'method'=>   "GET",
   
'header'=>    array( "Cookie: foo="bar"l ),
    'user_agent'=>    $_SERVER['HTTP_USER_AGENT']
  )
);
?>
dresel at gmx dot at
21-Apr-2009 11:23
I use this script to send normal data and images (you may have to change Content-Type to send other data), works fine for me :)

<?php
function do_post_request($url, $postdata, $files = null)
{
   
$data = "";
   
$boundary = "---------------------".substr(md5(rand(0,32000)), 0, 10);
      
   
//Collect Postdata
   
foreach($postdata as $key => $val)
    {
       
$data .= "--$boundary\n";
       
$data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";
    }
    
   
$data .= "--$boundary\n";
   
   
//Collect Filedata
   
foreach($files as $key => $file)
    {
       
$fileContents = file_get_contents($file['tmp_name']);
       
       
$data .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$file['name']}\"\n";
       
$data .= "Content-Type: image/jpeg\n";
       
$data .= "Content-Transfer-Encoding: binary\n\n";
       
$data .= $fileContents."\n";
       
$data .= "--$boundary--\n";
    }
 
   
$params = array('http' => array(
          
'method' => 'POST',
          
'header' => 'Content-Type: multipart/form-data; boundary='.$boundary,
          
'content' => $data
       
));

  
$ctx = stream_context_create($params);
  
$fp = fopen($url, 'rb', false, $ctx);
  
   if (!
$fp) {
      throw new
Exception("Problem with $url, $php_errormsg");
   }
 
  
$response = @stream_get_contents($fp);
   if (
$response === false) {
      throw new
Exception("Problem reading data from $url, $php_errormsg");
   }
   return
$response;
}

//set data (in this example from post)

//sample data
$postdata = array(
   
'name' => $_POST['name'],
   
'age' => $_POST['age'],
   
'sex' => $_POST['sex']
);

//sample image
$files['image'] = $_FILES['image'];

do_post_request("http://example.com", $postdata, $files);
?>
rlintern at gmail dot com
20-Feb-2009 06:56
I found the following code worked for me for POSTing some binary data to a remote server. I am putting it here since I could not find a quick solution to this by 'googling' or looking through this documentation.

Disclaimer:  I have no idea if this a 'good' solution, since I'm new to PHP, but it may just suit your needs as it did mine.  I am assuming bad things will happen with very large files since the entire file is read into $fileContents.

I am using PHP 5.2.8.

   $fileHandle = fopen("someImage.jpg", "rb");
   $fileContents = stream_get_contents($fileHandle);
   fclose($fileHandle);

   $params = array(
      'http' => array
      (
          'method' => 'POST',
          'header'=>"Content-Type: multipart/form-data\r\n",
          'content' => $fileContents
      )
   );
   $url = "http://somesite.somecompany.com?someParam=someValue";
   $ctx = stream_context_create($params);
   $fp = fopen($url, 'rb', false, $ctx);

   $response = stream_get_contents($fp);
davep at atomicdroplet dot com
18-May-2007 01:02
In addition to the context options mentioned above (appendix N), lower down context options for sockets can be found in appendix P - http://www.php.net/manual/en/transports.php
jrubenstein at gmail dot com
27-Apr-2007 06:36
Something to keep in mind when creating SSL streams (using https://):

<?php
$context
= context_create_stream($context_options)
$fp = fopen('https://url', 'r', false, $context);
?>

One would think - the proper way to create a stream options array, would be as follows:

<?php
$context_options
= array (
       
'https' => array (
           
'method' => 'POST',
           
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
               
. "Content-Length: " . strlen($data) . "\r\n",
           
'content' => $data
           
)
        );
?>

THAT IS THE WRONG WAY!!!
Take notice to the 3rd line: 'https' => array (

The CORRECT way, is as follows:

<?php
$context_options
= array (
       
'http' => array (
           
'method' => 'POST',
           
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
               
. "Content-Length: " . strlen($data) . "\r\n",
           
'content' => $data
           
)
        );
?>

Notice, the NEW 3rd line: 'http' => array (

Now - keep this in mind - I spent several hours trying to trouble shoot my issue, when I finally stumbled upon this non-documented issue.

The complete code to post to a secure page is as follows:

<?php
$data
= array ('foo' => 'bar', 'bar' => 'baz');
$data = http_build_query($data);

$context_options = array (
       
'http' => array (
           
'method' => 'POST',
           
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
               
. "Content-Length: " . strlen($data) . "\r\n",
           
'content' => $data
           
)
        );

$context = context_create_stream($context_options)
$fp = fopen('https://url', 'r', false, $context);
?>
chris dot vigelius at gmx dot net
11-Apr-2007 02:34
It seems that the authorization example given below by"php at charlesconsulting dot com" does NOT work with PHP 5.2.1, since the 'header' option will be simply ignored if it is not an array (but a string).

The following works:
$url = 'http://protectedstuff.com';
$auth = base64_encode('user:password');
$header = array("Authorization: Basic $auth");
$opts = array( 'http' => array ('method'=>'GET',
                                           'header'=>$header));
$ctx = stream_context_create($opts);
file_get_contents($url,false,$ctx);

See also http://bugs.php.net/bug.php?id=41051
php at charlesconsulting dot com
13-Jan-2007 04:14
Here's an example of retrieving a page which requests a username and password using the basic authorization scheme.  This calls the w3.org web page validator for a password protected page.
//$fileurl contains page to validate
$validateurl="http://validator.w3.org/check?uri=$fileurl";

$cred = sprintf('Authorization: Basic %s',
    base64_encode('username:password') );
$opts = array(
    'http'=>array(
    'method'=>'GET',
    'header'=>$cred)
);
$ctx = stream_context_create($opts);

$validate=file_get_contents($validateurl,false,$ctx);
sp0n9e at gmail dot com
29-Dec-2006 07:18
Here's a very simple way to do posts easily without need of cURL or writing an http request by hand using the tcp:// wrapper.  I like using contexts just because of their ubiquity and the lack of an optional library such as cURL (though one of the more popular libraries).

<?php

$options
= array(
 
'http'=>array(
   
'method'=>"POST",
   
'header'=>
     
"Accept-language: en\r\n".
     
"Content-type: application/x-www-form-urlencoded\r\n",
   
'content'=>http_build_query(array('foo'=>'bar'))
));

$context = stream_context_create($options);

fopen('http://www.example.com/',false,$context);

?>
dev at zayso dot org
06-Mar-2006 02:31
Example of a stream for reading a string passed
via a context object.
<?php
/* ----------------------------------------
 * Designed to read from a string
 */
class sfStreamStringRead
{
    const
PROTOCOL = 'stringread'; /* Underscore not allowed */
       
   
protected $dataPos  = NULL;
    protected
$dataBuf  = NULL;
    protected
$dataLen  = NULL;
   
    function
stream_open($path, $mode, $options, &$opened_path)
    {
       
/* Verify context has data */
       
$contextOptions = stream_context_get_options($this->context);
        if (!isset(
$contextOptions[self::PROTOCOL]['data'])) {
            return
FALSE;
        }
       
$this->dataBuf = $contextOptions[self::PROTOCOL]['data'];
       
$this->dataLen = strlen($this->dataBuf);
       
$this->dataPos = 0;
        return
TRUE;
    }
    function
stream_read($count){
       
$ret = substr($this->dataBuf, $this->dataPos, $count);
       
$this->dataPos += strlen($ret);
        return
$ret;
    }
    function
stream_eof(){
        return
$this->dataPos >= $this->dataLen;
    }
    function
stream_tell(){
        return
$this->dataPos;
    }
   
/* ------------------------------------------
     * A few helper functions
     */
   
static function genURL()
    {
        return
self::PROTOCOL . '://';
    }
    static function
genContext($dataBuf)
    {
        return
stream_context_create(array(
           
self::PROTOCOL => array(
               
'data' => $dataBuf,
            ),
        ));
    }
    static function
open($dataBuf)
    {
        return
fopen(self::genURL(),'r',FALSE,self::genContext($dataBuf));
    } 
}
stream_wrapper_register(
   
sfStreamStringRead::PROTOCOL,
  
'sfStreamStringRead'
);

$sp = sfStreamStringRead::open("Some String Data\n");
echo
fgets($sp);
fclose($sp);       

?>
net_navard at yahoo dot com
10-Dec-2005 07:38
Hi,you can create an array of parameters(what it's called a stream context),which can be transmitted each time you read or write a stream through a socket.In the below example:

$opts =array('http'=>arra('method'=>"GET",
'header'=>"Accept-language:en\r\n"."Cookie: foo=bar\r\n");

What you're actually doing is create a set of parameters(the protocol to be used,the request method,additional http headers and a cookie) which will be used each time you open a socket connection to request www.example.com.This saves a lot of time if you want to use these parameters (called a stream context) whenever you include them when making a request to www.example.com,instead of having to specify them over and over again.
Using the previous example,say you want to create a stream context,which sends a "Content-Type" http header and utilize it when making a request to www.example.com.Take a look:

$opts = array('http'=>array('method'=>"GET",
'header'=>"Content-Type: text/xml; charset=utf-8");

$context = stream_context_create($opts);
$fp = fopen('http://www.example.com','r',false,$context);
fpassthru($fp);
fclose($fp);

Now,when you make a request to www.example.com,the above http header will be included within the socket and transmitted to the server.Best of luck for you friends,Hossein

stream_context_get_default> <stream_bucket_prepend
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | sitemap | contact | advertising | mirror sites