PHPのストリームについての質問

このQ&Aのポイント
  • PHPのストリームについて、クライアント側からサーバー側へ送信するHTTPリクエストと同義のものでしょうか?また、実際に送信されるHTTPリクエストの中身を視認する方法はありますか?
  • php.iniのallow_url_fopenがOffの場合、ストリームを使ってHTMLフォーム以外でPOSTリクエストしたい場合、PHPの組み込み関数のみでどのように処理すれば良いですか?
  • PHPのストリームについての質問です。ストリームはクライアント側からサーバー側へ送信するHTTPリクエストと同義のものですか?HTTPリクエストの中身を視認する方法を教えてください。また、allow_url_fopenがOffの場合、HTMLフォーム以外でPOSTリクエストを送信する方法はありますか?
回答を見る
  • ベストアンサー

PHP stream_context_creat

今日は、 境内のメソッドについて質問があります。 以下のスクリプトについてですが、 <?php //POSTする送信データ $postData = array ( "key_01" => "POST送信データ01&", "key_02" => "POST送信データ02&", ); //送信するデータをURLエンコードする $postData = http_build_query($postData); $header = array( "http" => array( //(1) "method" => "POST", //(2) "header" => "Content-type: application/x-www-form-urlencoded\r\nuser_name: testuser_name", //(3) "content" => $postData //(4) ) ); //上記headerという変数からHTTPリクエストのストリームを作成する $request = stream_context_create($header); $res = file_get_contents("http://localhost/stream02.php",false,$request); print $res; 上記のようなスクリプにおける、ストリームというのはいわゆるクライアント側から サーバー側へ送信するHTTPリクエストと同義のものでしょうか? であればHTTPレスポンスのようにそのヘッダーの中身を取得する getallheaders()というような感じで、実際に、送信されるHTTPリクエストの 中身を視認したいのですが可能でしょうか? 以下サイトの http://www.tohoho-web.com/ex/http.htm HTTPサンプルのように取得したいのですが・・・。 また、冒頭に記述したスクリプトですが php.iniのallow_url_fopenの箇所がonになっていないと実行できないことは 確認したのですが、もし仮にallow_url_fopenがOffになっていた場合、 上記のようにストリームと呼ばれるものを使ってHTMLフォーム以外でPOSTリクエスト したい場合は何か方法があるのでしょうか? 通常であればPEARのHTTP_Requestとかで処理するかと存じますが、 PHPの組み込み関数のみでやる場合、他に方法ってありますか? 識者の方ご教授ください。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • tomaju
  • ベストアンサー率76% (84/110)
回答No.1

通常であればPEARのHTTP_Requestとかで処理するかと存じますが、 > PHPの組み込み関数のみでやる場合、他に方法ってありますか? ソケットをオープンして、自前でHTTPの通信を行えばいいかと思います。 リクエスト内容を作って、ソケットをオープンして、リクエストを 送信(書き込み)して、レスポンスを受信(読み出し)して、レスポンスから ヘッダを切り出す... このあたりがPOSTの事例になると思います。 http://www.php.net/manual/ja/function.fsockopen.php#101872 http://memorva.jp/memo/php/fsockopen.php http://www.softel.co.jp/blogs/tech/archives/2128 ストリームは入出力のための仕組みですね。 入出力先がファイルだろうが、ネットワークだろうが 同じ要領で取り扱える、違いを意識しなくてよい、 抽象化されているところが肝ですかね。 http://www.php.net/manual/ja/intro.stream.php http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0) http://yougo.ascii.jp/caltar/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0

1000vicki
質問者

お礼

ご返答ありがとうございます。 ソケットに関しては、一度試してみて なんとかうまくいきました。 ただ、ストリームに関しては、いまいちつかみにくいですね・・。orz う~んJAVAやC# でもファイル操作やHTTP通信するときにはStreamという名が含まれた クラスを使ってデータの送受信をするようですし・・・・。 ちょっと自分なりに調べてみます。 ありがとうございました。

関連するQ&A

  • ロリポップでPHPを動かしたい。

    ロリポップでPHPを動かしたいのですが、ローカルでは動作するのに、 サーバー上では動作しません。 セーフモードはOFFにしてみたり、してみたのですが。 ↓im.kayac.comを使い、iphoneに通知を送る処理です。 <?php $username = 'XXXX'; $password = 'XXXX'; $data = array( "message" => "ほげほえ", "password" => $password, ); $data['sig'] = sha1($data['message'] . $data['password']); unset($data['password']); $data = http_build_query($data, "", "&"); //header $header = array( "Content-Type: application/x-www-form-urlencoded", "Content-Length: ".strlen($data) ); $context = array( "http" => array( "method" => "POST", "header" => implode("rn", $header), "content" => $data ) ); $url = "http://im.kayac.com/api/post/{$username}"; echo file_get_contents($url, false, stream_context_create($context)); ?>

    • 締切済み
    • PHP
  • PHPで画像のアップについて

    初歩的な問題で申し訳ありません。各店舗のホームページの掲示板にセールの書き込みをしたいのですが、テキスト部分はアップできるのですが、画像がどうしうてもできません。アドバイスをお願いします。 <?php require'HTTP/Client.php'; // コンストラクタに渡すパラメータの設定 $option = array( "timeout" => "10", // タイムアウト "allowRedirects" => true, // リダイレクトを許容するか?true/false "maxRedirects" => 3, // リダイレクトする場合の最大回数 ); // HTTPクライアントの作成 $client = new HTTP_Client($option); $posturl = "http://hogehoge.com/bbs.php"; //$imgUrl = $_POST['data']; // 送信パラメータの設定 $params = array( "title" => $_POST['title'], "file" => $_FILES['data'], "mes" => $_POST['mes'], "mode" => "write", ); // POSTリクエストの送信 $code = $client->post($posturl, $params); // レスポンスのチェック if ($code != "200") { echo "リクエスト失敗"; } // POSTリクエストに対して返って来たHTMLを出力 $response = $client->currentResponse(); echo $response["body"]; ?>

    • 締切済み
    • PHP
  • 特定の値をPOST送信で他のサーバーに渡したい

    あるPHPページを自動転送ページとし、転送先に特定の値をPOST送信したいと考えています。 同じような質問があり、fsockopenを使ってすると良いようなのですが、どうしても上手くいきません。 現状、POST送信は成功しているのですが、URLが自動転送ページのままで、転送先ページのテキストのみが表示されている状態です。 どうすれば転送先ページに完全に移ってしまえるでしょうか。 ご助力下さい。 <ソース> $url = "http://hoge.co.jp/test.php";  //転送先URL $method = "POST"; $headers = "POST http://hoge.co.jp/test.php HTTP/1.1\r\n";  //転送先URL $postdata = "parm=ok"; $URL = parse_url($url); if(!isset($URL['port'])){$URL['port'] = 80;} //リクエストヘッダ $request = $method." ".$URL['path']." HTTP/1.0\r\n"; $request .= $headers; $request .= "Host: ".$URL['host']."\r\n"; $request .= "User-Agent: PHP/".phpversion()."\r\n"; $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; $request .= "Content-Length: ".strlen($postdata)."\r\n"; $request .= "\r\n"; $request .= $postdata; //相手サーバへ接続 @$fp = fsockopen($URL['host'], $URL['port']); // 接続失敗 if (!$fp) {die("ただいまメンテナンス中です。\n");} //POSTで送信 fputs($fp, $request); $response = ""; while (!feof($fp)) { $response .= fgets($fp, 4096); } fclose($fp); //ヘッダ部分とボディ部分を分離 $DATA = split("\r\n\r\n", $response, 2); //出力 echo "<!--\n".$request."\n-->\n"; echo "<!--\n".$DATA[0]."\n-->\n"; echo $DATA[1];

    • ベストアンサー
    • PHP
  • postしたコンテンツの取得

    いつもお世話になっております。 PHPでHTTPでPOSTされたコンテンツを受け取るサンプルとして以下のような スクリプトを作成しました。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php var_dump(file_get_contents('php://input')); ?></p> </body> </html> そしてデータの送信側のPHPスクリプトとして以下のようなものを作成しました。 <?php function post_request($url, $data, $referer='') { // Convert the data array into URL Parameters like a=b&foo=bar etc. $data = http_build_query($data); // parse the given URL $url = parse_url($url); if ($url['scheme'] != 'http') { die('Error: Only HTTP request are supported !'); } // extract host and path: $host = $url['host']; $path = $url['path']; $port = $url['port']; var_dump($url); $fp = fsockopen($host, $port, $errno, $errstr, 30); if ($fp){ // send the request headers: fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); if ($referer != '') fputs($fp, "Referer: $referer\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fgets($fp, 128); } } else { return array( 'status' => 'err', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // return as structured array: return array( 'status' => 'ok', 'header' => $header, 'content' => $content ); } $fileHandle = fopen("/home/a/text.txt", "rb"); $fileContents = stream_get_contents($fileHandle); fclose($fileHandle); var_dump(post_request('http://ipaddress/rawpost.php',$fileContents)); ?> 上記PHPスクリプトによってPOSTされた結果のHTMLの var_dump(file_get_contents('php://input')) の部分はstring(0)となりました。 HTTPのPOSTのコンテンツ部分を取得するには どのようなスクリプトを記載すればよいのでしょうか。 どなたかご教授よろしくお願いいたします。

    • 締切済み
    • PHP
  • coincheckのAPIの使い方【PHP】

    coincheckのAPIの使い方が分かりません。 自分の資産の取得は出来ましたが新規注文等POSTするのが全然出来ません。 自分のPOST方法が間違えていると思うのですが 私のPOST方法はfile_get_contentsでPOST送信をしようとしています。 ですがRequestがうまく行って無いのかな?っと思います。 failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in というエラーが返って来ます。 Request方法や解決方法がわかる方いらっしゃいませんか? よければサンプルでコードを書いていただけるとうれしいです。

    • 締切済み
    • PHP
  • phpを実行するとファイルダウンロードになる

    教えてください 以下のプログラムを記述したphpを実行すると、ファイルダウンロードになってしまいます ※プログラムはあるサイトにPOST送信をするものです 解決方法を教えてください よろしくお願いします <?php //ホスト設定 $host = "aaa.bbb.jp"; //パス設定 $path = "/data.php"; //POSTデータ設定 $data = "AAA=111&BBB=222&CCC=333&DDD=444"; //URLエンコード $data = urlencode($data); //実行 header("POST " . $path . " HTTP/1.1\r\n"); header("Host: " . $host . "\r\n"); header("Content-type: application/x-www-form-urlencoded\r\n"); header("Content-length: " . strlen($data) . "\r\n\r\n"); header($data); exit(0); ?>

    • 締切済み
    • PHP
  • [PHP] AITalkの音声合成APIで困った

    file_get_contents の返り値が false で困っています!! Docomoさんがエーアイさんの音声合成APIを提供しています. エーアイの音声合成APIの中でも,「SSML」を利用しようとしています. ・ドコモさんのHP https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=70 ・SSMLについて https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=71#tag01 SSMLを利用しようとPHPで実装して実行するも file_get_contents でエラーになってしまいます. (エラー:failed to open stream: HTTP request failed! ) コードは以下のように記述しました. <?php // コード書く際に参考にしたサイト // http://www.d-labo.net/laboratory/php/7001.php // http://stackoverflow.com/questions/9412650/how-to-fix-411-length-required-error-with-file-get-contents-and-the-expedia-xml function post($url, $data) { if (!ini_get('allow_url_fopen')) throw new Exception("Not Allowed URL Open!"); //headersは仕様通りに記述したつもり $headers = array( 'Content-Type:application/ssml+xml', 'Accept:audio/L16', 'Content-Length:'.sprintf("%d",strlen($data)) ); //methodは必ずPOSTと仕様書にあった $stream = stream_context_create(array('http' => array( 'method' => 'POST', 'header' => implode("\n",$headers), 'content' => $data ))); //XXX: file_get_contentsの返り値が必ず false になってしまう return file_get_contents($url, false, $stream); } ////// usage sample ////// 申し訳ないのですが,APIKEYを第三者に提供することはできません. try { $url = 'https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=XXXXXXXXXX'; $xml = '<?xml version="1.0" encoding="utf-8" ?><speak version="1.1"><voice name="nozomi">エーアイの音声合成エンジンによる音声です。</voice><break time="1000ms" /><voice name="seiji">エーアイの音声合成エンジンによる音声です。</voice></speak>'; $hoge = post($url,$xml); var_dump($hoge); } catch (Exception $e) { var_dump($e); } ?> 以上のコードが記述されたファイル(text_to_voice.php)をターミナルで実行 $ php text_to_voice.php Warning: file_get_contents(https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=XXXXXXXXX): failed to open stream: HTTP request failed! in text_to_voice.php on line 26 bool(false) 以上になります.どうやったら file_get_contents の返り値が false じゃなくなるのか知りたいです. よろしくお願い致します. 画像にはリクエストヘッダーの内容とAPIのURLが記述されており, 画像にあるのを参照しました.

    • ベストアンサー
    • PHP
  • AIR for Android と PHPの連携

    Flash CS6(Windows)を使ってPHPと通信するアンドロイドアプリを製作しています。 AIR 3.4 for Androidでパブリッシュし、PC上で動作させると普通にPHPと通信出来ます。 が、アンドロイド端末へインストールすると通信出来ません。 もしかしてAIR 3.4 for AndroidでパブリッシュしたアプリではPHPとの通信は出来ないのでしょうか? もし、いい方法があれば教えていただければ非常に助かりますm( _ _ )mコマッテマス SEND_btnというボタンをクリックした時、FLASH内に記述したデータをPHPに渡して PHP側で結合させてテキストボックスhensuに返すという単純なプログラムです。 <<< Flash側 >>> SEND_btn.addEventListener(MouseEvent.CLICK, fl_Click); function fl_Click(event:MouseEvent):void { // 送信データ var variables:URLVariables = new URLVariables(); variables.title = "ABC"; variables.url = "DEF"; variables.text = "GHI"; // データ送信先 var url_Request:URLRequest = new URLRequest(); url_Request.url = "phpアドレス"; url_Request.method = URLRequestMethod.POST; url_Request.data = variables; // 送信 var url_Loader:URLLoader = new URLLoader(); url_Loader.dataFormat = URLLoaderDataFormat.VARIABLES; url_Loader.addEventListener(Event.COMPLETE,completeHandler); url_Loader.load(url_Request); // 受信; function completeHandler(evt:Event):void { var re_variables:URLVariables = new URLVariables(evt.target.data); hensu.text = re_variables.DATA; } } <<<PHP側>>> <?php $title = $_POST['title']; $url = $_POST['url']; $text = $_POST['text']; $All = $title.$url.$text; $res = "DATA=" .$All; echo $res; ?>

    • ベストアンサー
    • Flash
  • PHPでパースエラーが出て困ってます 初心者です

    PHP初心者でろくに調べもしずにすいません>< 今、PHPでTwitterに投稿するPHPスクリプトを作っているのですが・・・ $url = "http://twitter.com/statuses/update.xml?"; $username = $_POST["name"]; $password = $_POST["pass"]; $message = $_POST["message"] $params = "status=". rawurlencode($message); $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password) ) ))); 5行目の所でエラーが出てしまい、投稿する事が出来ません どうしたら正常な動作をしてくれるのでしょうか? よろしくお願いします。

  • Perlで言う、LWP HTTPをPHPで

    PerlでのスクリプトをPHPに移行しようかと考えております。(勉強のため) それで、PerlのモジュールでいうLWPとHTTPに代わるクラスライブラリ(API)は、どれにあたるのでしょうか? 具体的には、LWP::UserAgentとHTTP::Requestです。 ※詳しくは、 my $wa = new LWP::UserAgent; my $req = new HTTP::Request(GET => $url); my $res = $wa->request($req); PHPのドキュメント(http://www.php.net/manual/ja/)を見たのですが、いまいちピンときませんでした。 参考URLで結構ですので、よろしくお願いいたします。

    • ベストアンサー
    • PHP