PHP側は、どのような記述にしたよいのでしょうか?
例えば、こんなファイルなのですが・・・
http://chartpark.net/wti-dow.php
このPHPの内側のプログラムはどんな形になっているのでしょうか?
自分でも同じように画像を呼び込みたいのですが、その記述がどうして良いか分からず困っています^^;
コメント欄に書き込めないので、回答欄にて返信します。
まずは、問題が解決したようで何よりです。
はてなポイント以外のお礼は不要です。解決したことが何よりの報酬ですので。
また、今回は Chunked形式で送られてくるバイナリデータの実例を見ることができたので、私としても勉強になりました。
ただし、お示ししたコードは完全なものではない(たとえば、すべてのChunked形式に対応していない)ので、ご注意下さい。いずれ、自サイトで完全版を紹介しようと思います。
その意味でも、今回は、はてなポイントだけ頂ければ十分です。
それでは、また。
他から既存の画像を読み込む場合の例。
<?php $img_path = 'http://q.hatena.ne.jp/images/logo_hatena.gif' ; $img = file_get_contents($img_path) ; header('Content-type: image/gif') ; echo $img ; ?>
自分で画像を作る場合の例 (要 GD 関数)
<?php $img = imagecreatetruecolor(300, 300) ; imagefill($img, 0, 0, 0xffffff) ; imagefilledrectangle($img, 50, 50, 250, 250, 0xff0000) ; header('Content-type: image/png') ; imagepng($img) ; ?>
ありがとうございます!
私の場合は、外部から画像を読み込むので上の記述の形になりますが
$img_path = 'http://q.hatena.ne.jp/images/logo_hatena.gif' ;
$img = file_get_contents($img_path) ;
header('Content-type: image/gif') ;
echo $img ;
?>
この記述のPHPファイルを生成してサーバーにアップロードしたのですが
うまくいきませんでした^^;
phpプログラムも、HTMLと同じように<body>タグのように前後のタグを生成する必要があるのでしょうか?
全くPHPを利用した事がなくてどうしたら良いかもわからない状態です^^;
おそらくサーバー側でもPHPを利用するならば、パーミッション設定や
PHPのインストールなどをしなければならないような
気がしているのですが・・・
初歩的なことですみません。
コメント欄に書き込めないので、回答欄にて確認することをお許しください。
この記述のPHPファイルを生成してサーバーにアップロードしたのですが
うまくいきませんでした^^;
どのように、うまくいかなかったのでしょうか。
以下の点をお知らせください。
URLはダミーです。 http://q.hatena.ne.jp/
ありがとうございます。
具体的なご質問でとても助かります!
下記のようなエラーメッセージが出ています。
Warning: file_get_contents(http://q.hatena.ne.jp/images/logo_hatena.gif ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 4
Warning: Cannot modify header information - headers already sent by (output started at /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php:4) in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 6
サーバーは、PHPが利用できます。
以下のバージョンが利用可能のようですPHP3/4/5
またサーバーのファイルのパーミッションは
705になっております。
3.PHPを利用できるディレクトリが制限されていませんか?
これについては、どのような意味か良く理解できていないのですが
パーミッションの設定という事でしょうか?
サーバーの利用環境は、このような形となっております。
●ディスクスペース:50~300メガバイト(申請制)・複数アカウント可
●CGI/SSI(Perl・Ruby・Python・C・PHP3/4/5)が利用可能
●データベースが利用可能(MySQL/PostgreSQL)
●SSH(TELNET代替)が使用可能
●安全な通信:SSL対応(当社ドメインの正式証明書使用)
●パスワード制限可能:.htaccess利用可能
●サーバーログ統計が閲覧可能:参照元・アクセス回数などがわかる
エラー情報をありがとうございます。
対策を記します。
以下のスクリプトを実行してください。
<?php phpinfo(); ?>
ブラウザの画面に php の設定情報が表示されます。
Configuration - PHP Core - allow_url_fopen の値が On になっていますか?
もし Off になっているとすると、関数 file_get_contents を使って外部サーバのデータを読み込むことができません。Onにするためにはサーバ管理者権限が必要ですので、サーバ管理者にご相談ください。
次に、そのサーバは自動的に広告を表示したり、アクセス情報収集をしていませんか?
エラーメッセージから推測すると、PHPスクリプトとは別にHTTPヘッダを送信しているようです。
もしそうだとすると、読み込んだ画像をそのまま表示させるのは困難です。
この点についてもサーバ管理者にご確認ください。
以上2点の問題がクリアされない場合の代替案として、単純にHTMLを発生させているだけですが、下記をご紹介します。
<?php $img = 'http://www.hatena.ne.jp/users/pa/pahoo/profile.gif'; //表示させたい画像 echo <<< EOF <html> <body> <img src="$img" /> </body> </html> EOF; ?>
pahooさま
ご丁寧にありがとうございます。
早速、導入してみました。
http://www.w-stock.biz/test.php
どうやらallow_url_fopenはOnになっています。
こちらは、問題ないようです。
また2についてですが・・・
有料のサーバーを利用しておりますので、自動的に広告が出る事はないです。
またアクセス解析は別に忍者ツールを導入しておりますので、アクセス解析のジャバスクリプトの
ソースを貼り付けているだけです。
HTTPヘッダーの送信しているかもしれない点については
どのような事なのかまだ理解できておりませんが
ただ今、状況を学習中です。
ありがとうございます。
サーバー側にも障害や問題がないか確認してみます。
また大体案での画像表示はできたのですが
目的としているチャート図を外部から引っ張ってくる事については
現状のHTMLで直接画像表示させているのと同じ形のようですね^^;
どうやらサイトのURLがチャート提供会社から嫌われているみたいなので
PHPでローカルから引っ張った画像を表示させたいと思っております。
アクセスが多いサイトなので、恐らくHTML上に直接表示させていたのでは
おそらく負荷が多くなっていた為に、URLがチャート提供会社から
嫌われているのではないかと思います。
なんとかphpにして画像を表示させられるようにしたいと考えています。
以下のサイトで同じデータの引き出し先から
HTML直接リンクにより画像が引き出せなくなりました^^;
なんとかこの状況を打開すべくPHPファイルでの画像引き出しが
良いだろうと考えております。
ということは、GoldenDawn さんが示した1番目のスクリプトは、エラーが出ずに実行できているということですか?
下記のスクリプトに何の手も加えず(JavaScriptを追加することなどせずに、$infnameのURLも変更せずに)実行した場合に、エラーは出ますか?
<?php $infname = 'http://www.hatena.ne.jp/users/pa/pahoo/profile.gif'; $infp = fopen($infname, 'rb'); $img = ''; while (($ss = fread($infp, 10000)) != FALSE) { $img .= $ss; } fclose($infp); header('Content-type: image/gif') ; echo $img; ?>
いえ、GoldenDawn さんが示した1番目のスクリプトは、エラーが出ます。
以下のようなエラーメッセージです。
Warning: file_get_contents(http://www.hatena.ne.jp/users/pa/pahoo/profile.gif ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 4
Warning: Cannot modify header information - headers already sent by (output started at /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php:4) in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 6
しかし、pahooさんの提案してくださった
代替案はエラーは出ずに表示されます。
そして、今ご紹介いただいたスクリプトもエラーは出ません。
http://www.w-stock.biz/cmechart3.php
しかしながら・・・
この動作ならばと思って、http://www.hatena.ne.jp/users/pa/pahoo/profile.gif この部分を表示させたいチャート図のURLに変更してみた所、これはエラーが出てしまいます^^;
以下のようなエラーメッセージです。
Warning: fopen(http://charts.quote.com/ifs/ifs?cont=NKD+1%21&period=V&varminute...) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.0 500 Internal Server Error in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 3
Warning: fread(): supplied argument is not a valid stream resource in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 5
Warning: fclose(): supplied argument is not a valid stream resource in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 8
Warning: Cannot modify header information - headers already sent by (output started at /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php:3) in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 10
挿入したいURLになんらかなの問題があるのかもしれませんが直リンクだと表示されるので、なぜ、これで表示できないのか不思議でなりません。
これは参考になるかわかりませんが、同じチャートをうまく表示させる事に成功しています。
pngファイルからの引き出しになっているみたいですが・・・う~ん。
ご親切にご検討くださり本当に感謝しております。
件のサイトを調べてみると、User-Agentを求めることと、画像データ本体がChunked形式で送信されていることが分かりました。
そこで、関数 fsockopen を使って、以下のようなスクリプトを組み立ててみました。
<?php $type = 'Content-type: image/png'; //画像データのMIME-type $host = 'charts.quote.com'; //目的のホスト $path = '/ifs/ifs?cont=NKD+1%21&period=V&varminutes=5&size=560x384&bartype=CANDLE&bardensity=high&headerbackground=9,50,165&headerforeground=255,255,255&headerdatacolor=255,255,255&studyheaderbackground=9,50,165&random=7595'; //目的のパス $fp = fsockopen($host, 80, $errno, $errstr, 30); if (! $fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET $path HTTP/1.1\r\n"; $out .= "Host: $host\r\n"; $out .= "User-Agent: Mozilla/5.0\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); //HTTPヘッダを読み飛ばす while (! feof($fp)) { $headers = fgets($fp, 8192); if (trim($headers) == '') { break; } } //画像を読み込む(chunked形式) $img = ''; while (! feof($fp)) { $ss = fgets($fp); $cnt = intval($ss, 16); while ($cnt > 0) { $bb = fread($fp, $cnt); $cnt -= strlen($bb); $img .= $bb; } fread($fp, 2); //\r\nをスキップ } fclose($fp); header($type) ; echo $img; } ?>
スクリプトを組み立ててくださったのですか(大汗)
試しに導入してみましたが・・・
なんとこれで動作するではないですか!!!!
ばっちり表示されるようになりました。
なんとお礼を良いやら・・・
ただ今、全ての部分にこのPHPスクリプトを導入中です。
本当にありがとうございます。
はてなポイント以外に何か別途お礼をしたいのですが・・・
どのようにしたら良いのでしょうか^^;
本当に助かりました。
ありがとうございます。
コメント欄に書き込めないので、回答欄にて返信します。
まずは、問題が解決したようで何よりです。
はてなポイント以外のお礼は不要です。解決したことが何よりの報酬ですので。
また、今回は Chunked形式で送られてくるバイナリデータの実例を見ることができたので、私としても勉強になりました。
ただし、お示ししたコードは完全なものではない(たとえば、すべてのChunked形式に対応していない)ので、ご注意下さい。いずれ、自サイトで完全版を紹介しようと思います。
その意味でも、今回は、はてなポイントだけ頂ければ十分です。
それでは、また。
そうでしたか^^;
感謝の気持ちとしてお礼したかったのですが了解いたしました^^
またデータが参考なられたという事で何よりです。
また完全でないということは了解いたしました。
本当にありがとうございます。
またご紹介のサイトの方を拝見させて頂きますね。
では、今後とも何とぞ宜しくお願いいたします。
そうでしたか^^;
感謝の気持ちとしてお礼したかったのですが了解いたしました^^
またデータが参考なられたという事で何よりです。
また完全でないということは了解いたしました。
本当にありがとうございます。
またご紹介のサイトの方を拝見させて頂きますね。
では、今後とも何とぞ宜しくお願いいたします。