web-dev-qa-db-ja.com

file_get_contents()「ストリームを開くことができませんでした」、「そのようなファイルはありません」というエラーを修正する方法

PHPスクリプトを実行しようとすると、次のエラーが表示されます。

ストリームのオープンに失敗しました:3行目のスクリプトのC:\ wamp\www\LOF\Data.phpにそのようなファイルまたはディレクトリはありません:

私のコードは次のとおりです。

<?php

$json = json_decode(file_get_contents('prod.api.pvp.net/api/lol/euw/v1.1/game/by-summoner/20986461/recent?api_key=*key*'));

print_r($json);

?>

注:*key*は、URL(私のAPIキー)内の文字列の置換であり、プライバシー上の理由で非表示になっています。

https://をURLから削除して、1つのエラーが消えるようにしました。

ここで何か間違ったことをしていますか?たぶんURL?

23
Life of Madness

URLにプロトコル情報がありません。 PHPこれはファイルシステムのパスであると判断し、指定された場所にあるファイルにアクセスしようとします。ただし、その場所は実際にはファイルシステムに存在せず、エラーがスローされます。

コンテンツを取得しようとしているURLの先頭にhttpまたはhttpsを追加する必要があります。

_$json = json_decode(file_get_contents('http://...'));
_

次のエラーに関して:

ラッパーが見つかりません-PHPの構成時に有効にするのを忘れましたか?

Apacheのインストールは、おそらくSSLサポート付きでコンパイルされていません。 OpenSSLを手動でインストールして使用するか、cURLを使用してみてください。個人的にはfile_get_contents()よりもcURLの方が好きです。使用できる関数は次のとおりです。

_function curl_get_contents($url)
{
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}
_

使用法:

_$url = 'https://...';
$json = json_decode(curl_get_contents($url));
_
31
Amal Murali

cURL を使用しないのはなぜですか?

$yourkey="your api key";
$url="https://prod.api.pvp.net/api/lol/euw/v1.1/game/by-summoner/20986461/recent?api_key=$yourkey";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$auth = curl_exec($curl);
if($auth)
{
$json = json_decode($auth); 
print_r($json);
}
}
2

これを使ってみてください

<?php
$json = json_decode(file_get_contents('./prod.api.pvp.net/api/lol/euw/v1.1/game/by-summoner/20986461/recent?api_key=*key*'));
print_r($json);
?>

「./」を使用すると、現在のディレクトリからURLを検索できます。使用してもよい

chdir($_SERVER["DOCUMENT_ROOT"]);

パスがルートディレクトリからの相対パスである場合、現在の作業ディレクトリをWebサイトのルートに変更します。

1
Shubham

shankarsとAmalsの答えを単純な単体テストで拡張するだけです。

/**
 *
 * workaround HTTPS problems with file_get_contents
 *
 * @param $url
 * @return boolean|string
 */
function curl_get_contents($url)
{
    $data = FALSE;
    if (filter_var($url, FILTER_VALIDATE_URL))
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        $data = curl_exec($ch);
        curl_close($ch);
    }
    return $data;
}
// then in the unit tests:
public function test_curl_get_contents()
{
    $this->assertFalse(curl_get_contents(NULL));
    $this->assertFalse(curl_get_contents('foo'));
    $this->assertTrue(strlen(curl_get_contents('https://www.google.com')) > 0);
}
0
pgee70

私は私のウェブサイトで同じ問題を抱えていたので、私は以下の解決策があなたのためにすべて働くことを願っています...

の場合:$json = json_decode(file_get_contents('http://...'));

以下のクエリで置換

$Details= unserialize(file_get_contents('http://......'));

0

Curlを使用してこの問題を解決できます。..

function my_curl_fun($url) {
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
}

$feed = 'http://................'; /* Insert URL here */
$data = my_curl_fun($feed);
0
Jitendra Damor