2016-07-26 15 views
3

を経由して動作しますが、PHPを経由して失敗します。
XMLを取得し、APIエンドポイントへのリクエストを取得し、その後、結果を解析します。
これを達成するために私はfile_get_contentsリクエストを送信しています。のfile_get_contentsは私が達成しようとしているどのブラウザ

問題:

`file_get_Contents` fails, error: 

Warning: file_get_contents(https://api.twitter.com/1.1/statuses/mentions_timeline.json): 
failed to open stream: 
     A connection attempt failed because the connected party did not properly 
respond after a period of time, or established connection failed because 
connected host has failed to respond. 

更新17/08

私の現在の理解を統合するには、次の
1. PHPは失敗します。
1.Aそれが失敗したPHPを経由して(タイムアウト)
1.bコマンドラインで失敗する(curl -G http://api.eve-central.com/api/quicklook?typeid=34
1.Cのfile_get_contentsどのような作品/ create_stream_context

2.ワット
1.Dのfile_get_contents:

2.Aを
2.B郵便配達を経由してクロムタブにURLを貼り付ける

何が試みられましたか: - Postmanのヘッダをチェックして、PHPで複製しようとしました

Postman Headers sent back by eve-central: 
Access-Control-Allow-Origin → * 
Connection → Keep-Alive 
Content-Encoding → gzip 
Content-Type → text/xml; charset=UTF-8 
Date → Wed, 17 Aug 2016 10:40:24 GMT 
Proxy-Connection → Keep-Alive 
Server → nginx 
Transfer-Encoding → chunked 
Vary → Accept-Encoding 
Via → HTTP/1.1 proxy10014 
コード対応

:ポートを変更するかどうかを確認するためにGETリクエストをキャプチャする

$headers = array(  
'method' => 'GET',   
'header' => 'Connection: Keep-Alive', 
'header' => 'Content-Encoding: gzip', 
'header' => 'Content-Type: text/xml', 
'header' => 'Proxy-Connection: Keep-Alive', 
'header' => 'Server: nginx', 
'header' => 'Transfer-Encoding: chunked', 
'header' => 'Vary: Accept-Encoding', 
'header' => 'Via: HTTP/1.1 proxy10014'); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_PORT , 8080); // Attempt at changing port in the event it was blocked. 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($curl, CURLOPT_POST,   false);    
curl_setopt($curl, CURLOPT_URL,   $url); 

$resp = curl_exec($curl); 
if(curl_error($curl)) 
{ 
echo 'error:' . curl_error($curl); 
} 
  • 使用Wiresharkのは、私がアイデアやオプションの外だコマンドライン
    経由
  • 実行カールを助けました。 質問があります:
    1. ブラウザとPostmanで動作する場合、なぜPHP経由で動作しませんか?
    2. 私のコードを変更して、Postmanの機能を模倣するにはどうすればよいですか? ?

以前の試み、私が試してみました何 :そのよう

function curl_get_contents($url) { 
$ch = curl_init(); 
if (!$ch) 
{ 
die("Couldn't initialize a cURL handle"); 
} else 
echo "Curl Handle initialized "; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
$data = curl_exec($ch); 
// Check if any error occurred 
if (!curl_errno($ch)) 
{ 
$info = curl_getinfo($ch); 
echo 'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], ""; 
displayData($info); 
} else 
echo "Failed Curl, reason: ".curl_error($ch)." "; 
curl_close($ch); 
return $data; 
} 

結果として、他のスレッドから 各種のcURLオプション、:何も、データは返されません。
- Checked php。INIオプション:
-
にはallow_url_include = - - allow_fopenが
である、関連するSSLの拡張機能が有効になっている
- php.iniの
経由の両方 - - がタイムアウトウィンドウ
を上げるも、内の明示的な宣言を介しましたPHPファイル。
- は別のURL
で試してみました - 同じエラーなので、それは本当に
私の特定のエンドポイントに依存していません - 例えば、両方のは、Twitter /ウィキペディア/特定のエラーを返すグーグル - てみました:
- ローカルxmlファイル上のfile_get_contents(https://msdn.microsoft.com/en-us/library/ms762271(v=vs.85).aspx) - >
に動作します - リモートxmlファイル上のfile_get_contents(http://www.xmlfiles.com/examples/note.xml) - >同じエラー
が失敗しました - 全体的に、次はこれまでのところ、真である:
- カールが失敗し、タイムアウト
- のfile_get_contentsが失敗し、タイムアウト
- ブラウザで開くXMLファイルのURLが
の作品 -

の作品、ポストマンを経由してGETリクエストを作成します

明らかに、file_get_contentsがphpで失敗したすべての場合、私はどのブラウザからでも簡単にファイルにアクセスできます。

問題を回避しようとしました。
試行1:結果:file_get_contentsが機能しますが、取得するXMLファイルの数が多いため、操作がタイムアウトするため、nitrous.ioを使用してLAMPスタックを作成してください。 暫定解決策:
- ソース
からXMLファイルをダウンロード -
それらをジップ - xml_file
をダウンロード - ローカル解析が後になってxmlファイル
と、呼び出された、小さなPHPスクリプトを書き、上記のビットを行い、ローカルディレクトリにデータを送信します。ローカルディレクトリは展開され、追加作業が実行されます。
もう1つの試みは、データをシートにプルするユーザ機能を備えたGoogleスプレッドシートを使用して、Excelファイル/値をmysqlにダンプすることです。
私の目的のために、非常に無知な解決策の間に、それはトリックを行います。以下のために、HTTPS URLリクエストで

ignore_user_abort(true); 
set_time_limit(0); 
ini_set('memory_limit', '2048M'); 
+0

あなたは認証を行わずにデータを取得しようとしていますそのメカニズム。 Twitter用のPHPラッパーを試してみませんか? https://dev.twitter。com/overview/api/twitter-libraries – Nikhil

+0

お返事ありがとうございます。 TwitterのURLは、さまざまなオプションを試してみるためのランダムURLの1つに過ぎません。 file_get_contents($ url)を実行すると、結果は変化しません。$ urlはhttp://www.xmlfiles.com/examples/note.xmlです。 そのURLからわかるように、それは普通のXMLであり、どんな種類の認証も必要なく、タイムアウトエラーで失敗します。 – user3375601

+0

コードはどこで実行されていますか?これを実行しているマシンがインターネットに直接接続されていることを聞いたことがありますか? (サーバーが前向きプロキシの後ろに座っているかもしれません)名前を解決できますか?このアクセスを妨げるファイアウォールがないことを確認しますか?それは別のセキュリティ機構によって制限されていないということですか?ログをチェックしましたか?セキュリティ上の理由から、インターネット上で発信接続をしないようにWebサーバーホストを設定するのが一般的です(RedhatのSELinuxポリシーではデフォルトです)。 – symcbean

答えて

3

は、私はいくつかの問題を参照してください。私もiniファイルスクリプトの先頭にこれを追加した

function downloadUrlToFile2($url, $outFileName) 
{ 
    //file_put_contents($xmlFileName, fopen($link, 'r')); 
    //copy($link, $xmlFileName); // download xml file 
    ; 
    echo "Passing $url into $outFileName "; 
    // $outFileName = touch(); 
    $fp = fopen($outFileName, "w"); 
    if(is_file($url)) 
    { 
     copy($url, $outFileName); // download xml file 
    } else 
     { 
      $ch = curl_init(); 
      $options = array(
      CURLOPT_TIMEOUT => 28800, // set this to 8 hours so we dont timeout on big files 
      CURLOPT_URL  => $url 
     ); 

      curl_setopt($ch, CURLOPT_FILE, $fp); 
      curl_setopt_array($ch, $options); 
      $contents = curl_exec($ch); 
      fwrite($fp, $contents); 
      curl_close($ch); 
     } 
} 

:共有ホスト上でタイムアウトの問題を回避するために使用

コードあなたのCURLリクエストに以下の行を追加する必要がある問題を修正してください。

function curl_get_contents($url) { 
    $ch = curl_init(); 
    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
    $header[] = "Cache-Control: max-age=0"; 
    $header[] = "Connection: keep-alive"; 
    $header[] = "Keep-Alive: 300"; 
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
    $header[] = "Accept-Language: en-us,en;q=0.5"; 
    $header[] = "Pragma: "; 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url); 

    // I have added below two lines 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
} 
+1

ありがとう。 私はあなたのフィードバックを組み込み、エラートラップを追加しました。 元のブロックにコードを追加します。興味深いのは何ですか、カールが同様にタイムアウトことです:から 取得内容http://www.xmlfiles.com/examples/note.xml カールハンドル 失敗カール、理由 初期化:接続が5008ミリ秒後にタイムアウトになりました – user3375601

関連する問題