2016-12-13 11 views
0

私のページが長年働いていたので、何か変わってしまいました。 CURLコードを持つ関数は、他の4回も呼ばれてhtmlページを取得して正常に動作します。しかし、それはちょっと前にCSVファイルである1つの呼び出しで作業を終了します。ブラウザにURLを入力すると、ファイルが正しくダウンロードされ、データとURLが正しいことがわかります。私はPHP 5.6に切り替えましたが、それ以降はすべてがうまくいったと思いますが、私は100%肯定的ではありません。私はアプリのこの部分をテストすることができなかった可能性がありますが、私はそれを疑う。私はグーグルで、SOのアーカイブを見て、役に立つ提案がある間は何も働かない。このコードは元々働いていました。以下のコードにいくつかのテストエコーラインを追加しました。私は自分の電子メールアドレスを隠すためのコードを編集し、ダウンロードしたサイトの1つに追加されたユーザーエージェントにURLを付けます。私のPHP CURLコードは、何年も働いてからCSVファイルで作業を終了しました

function read_url($url){ 
    // create curl resource 
    $ch = curl_init(); 
    // set url 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch,CURLOPT_USERAGENT,'weatherapp/1.0 (www.mydomain.com, [email protected])'); 
    //return the transfer as a string 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    // $output contains the output string 
    $output = curl_exec($ch); 
    if(curl_errno($ch)){ 
     echo "<!-- curl_error($ch) -->"; 
    } 
    // close curl resource to free up system resources 
    curl_close($ch); 
    echo "**** read $url *********<br>"; 
    echo $output; 
    echo "******** end of output ***********<br>"; 
    return $output; 
} 

テスト出力では、URLが有効で出力が確認できます。

注:私のブラウザでは、以下のURLからファイルがダウンロードされます。

URLは http://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20161210&end_date=20161213&station=9414523&time_zone=lst_ldt&units=english&interval=h&format=csv

で、出力は空白になっています。

もう一度、このコードは長い間うまくいきました。可能性に開いている

これは私が探して、このコマンド

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false; 

を追加することについて話しましたしかし、それは助けにはならなかったこれに対処質問を見つけ、PHP5.6の問題です。私も真実を試しました。

答えて

2

ここに私の推測では、WebサービスがHTTPS経由でこのデータを提供開始しましたが、あなたのコードがその:

$ curl -v 'http://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20161210&end_date=20161213&station=9414523&time_zone=lst_ldt&units=english&interval=h&format=csv' 
* Trying 140.90.78.215... 
* Connected to tidesandcurrents.noaa.gov (140.90.78.215) port 80 (#0) 
> GET /api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20161210&end_date=20161213&station=9414523&time_zone=lst_ldt&units=english&interval=h&format=csv HTTP/1.1 
> Host: tidesandcurrents.noaa.gov 
> User-Agent: curl/7.43.0 
> Accept: */* 
> 
< HTTP/1.1 302 Found 
< Cache-Control: no-cache 
< Content-length: 0 
< Location: https://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20161210&end_date=20161213&station=9414523&time_zone=lst_ldt&units=english&interval=h&format=csv 
< Connection: close 
< 
* Closing connection 0 

だから、Locationヘッダーを返しているのを考慮していませんが、あなたはカールを設定していないということですリダイレクトに従います。 curl_getinfo($ch, CURLINFO_HTTP_CODE)をチェックすると、302 Foundコードが返されている可能性が高くなります。

ので、あなたのコードは、ターゲット・リソースへの後続リダイレクトに従いますCURLOPT_FOLLOW_LOCATIONを追加します。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

ます。また、最初の場所でhttps://の上にそれを要求するようにコードを変更することができますが、リダイレクト、以下を追加すると、それを行います長期的にはより堅牢です。

+0

私はfollowlocationをtrueに追加しました。これらの人たちが毎回自分のURLを変えてナッツを動かすのは、大きな変化です。私は自分のコードがこれらのリンクに従うことを嬉しく思っています。ありがとうございました! –

関連する問題