を経由して動作しますが、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のは、私がアイデアやオプションの外だコマンドライン
経由 - 実行カールを助けました。 質問があります:
- ブラウザとPostmanで動作する場合、なぜPHP経由で動作しませんか?
- 私のコードを変更して、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が
の作品 -
明らかに、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');
あなたは認証を行わずにデータを取得しようとしていますそのメカニズム。 Twitter用のPHPラッパーを試してみませんか? https://dev.twitter。com/overview/api/twitter-libraries – Nikhil
お返事ありがとうございます。 TwitterのURLは、さまざまなオプションを試してみるためのランダムURLの1つに過ぎません。 file_get_contents($ url)を実行すると、結果は変化しません。$ urlはhttp://www.xmlfiles.com/examples/note.xmlです。 そのURLからわかるように、それは普通のXMLであり、どんな種類の認証も必要なく、タイムアウトエラーで失敗します。 – user3375601
コードはどこで実行されていますか?これを実行しているマシンがインターネットに直接接続されていることを聞いたことがありますか? (サーバーが前向きプロキシの後ろに座っているかもしれません)名前を解決できますか?このアクセスを妨げるファイアウォールがないことを確認しますか?それは別のセキュリティ機構によって制限されていないということですか?ログをチェックしましたか?セキュリティ上の理由から、インターネット上で発信接続をしないようにWebサーバーホストを設定するのが一般的です(RedhatのSELinuxポリシーではデフォルトです)。 – symcbean