16

別のファイルから内容を取得しようとしていますfile_get_contents(理由は聞かないでください)。test1.phptest2.php
の 2 つのファイルがあります。test1.phpは、ログインしているユーザーに基づいて文字列を返します。

test2.phpは、 test1.phpのコンテンツを取得しようとし、ブラウザーによって実行されているため、Cookie を取得しています。

で Cookie を送信するにはfile_get_contents、ストリーミング コンテキストを作成します。

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`;

私は内容を取得しています:

$contents = file_get_contents("http://www.example.com/test1.php", false, $opts);

しかし今、私はエラーが発生します:

警告: file_get_contents( http://www.example.com/test1.php ) [function.file-get-contents]: ストリームを開くことができませんでした: HTTP リクエストが失敗しました! HTTP/1.1 404 が見つかりません

誰かが私がここで間違っていることを知っていますか?

編集:
言及するのを忘れました: streaming_contextがないと、ページが読み込まれます。しかし、Cookie がないと、必要な情報を取得できません。

4

4 に答える 4

32

まず、これはおそらく質問のタイプミスですが、 file_get_contents() の 3 番目の引数は、オプションの配列ではなく、ストリーミング コンテキストである必要があります。このようなもので簡単なテストを実行しましたが、すべてが期待どおりに機能しました

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
$context = stream_context_create($opts);
$contents = file_get_contents('http://example.com/test1.txt', false, $context);
echo $contents;

このエラーは、サーバーが 404 を返していることを示しています。ワークステーション/デスクトップ/ラップトップからではなく、 PHP が実行されているマシンからURLを取得してみてください。Web サーバーがサイトにアクセスできない、ローカル マシンにコピーがキャッシュされている、またはその他のネットワーク障害が原因である可能性があります。

このテストを実行するときは、送信している Cookie を含め、正確な要求を繰り返してください (コマンド ライン curl はこれに適しています)。問題のページが Cookie なしのブラウザーで正常に読み込まれる可能性は十分にありますが、Cookie を送信すると、サイトは実際には 404 を返します。

$_SERVER['HTTP_COOKIE'] に生の Cookie があることを確認してください。

画面をスクレイピングしている場合は、Firefox と LiveHTTPHeaders 拡張機能のコピーをダウンロードしてください。Firefox で目的のページに到達するために必要なすべての手順を実行します。次に、LiveHTTPHeaders からの出力を使用して、まったく同じ要求再送信を再作成します。Cookie だけでなく、すべてのヘッダーを含めます。

最後に、PHP Curlには理由があります。可能であれば、(私は尋ねていません!)代わりにそれを使用してください。:)

于 2008-11-21T06:38:53.133 に答える
15

この情報を共有するだけです。を使用する場合session_start()、セッション ファイルは PHP によってロックされます。したがって、実際のスクリプトは、セッション ファイルにアクセスできる唯一のスクリプトです。経由でアクセスしようとした場合、fsockopen()またはfile_get_contents()ロックされているファイルを開こうとしてから長い間待つことができます。

この問題を解決する 1 つの方法は、 を使用しsession_write_close()てファイルのロックを解除し、 で再度ロックすることですsession_start()

例:

<?php
 $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
 $context = stream_context_create($opts);
 session_write_close(); // unlock the file
 $contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context);
 session_start(); // Lock the file
 echo $contents;
?>

はブロッキング関数であるためfile_get_contents()、セッション ファイルを変更しようとしている間、両方のスクリプトが同時に実行されることはありません。

しかし、これは接続を拡張してセッションを操作するための最良の方法ではないと確信しています。

ところで: cURLよりも高速で、fsockopen()

より良いものを見つけたら教えてください。

于 2012-03-01T02:28:06.360 に答える
1

好奇心からfile_get_contents、スペースのあるページを試していますか? 名前にスペースが含まれる URL で fgc を使用しようとしたことを覚えています。str_replace' ' を '%20' に置き換えるために a を使用する必要がありました。

ファイル名の半分しか報告されないため、これは比較的簡単に見つけられるはずだったと思います。また、これらの投稿の 1 つで、ヘッダーの定義中に誰かが \r\n を使用していることに気付きました。PHP はこれらを一重引用符で囲むことを好みませんが、二重引用符を使用すると問題なく機能することに注意してください。

于 2010-06-12T00:41:31.993 に答える
0

file1.php がサーバー上に存在することを確認してください。ご自身のブラウザで開いてみてください。

于 2008-11-20T20:03:29.003 に答える