質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3300閲覧

phpで大容量のファイル(URL)を読み込みたい

hatsu

総合スコア1809

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/08/06 10:19

編集2017/08/06 11:08

TwitterのAPIを用いてツイートをストリーミングしたものを以下のURLに書いており、
それを元にfile_get_contents($url);
とし、それを次にURLだけ正規表現で抜き取って、
twkifu_url.txtにfile_put_contentsで書き込んでいくプログラムを作成しました。

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<title></title> 6</head> 7<body> 8<p>将棋ウォーズのツイートを読み込んでいくよ</p> 9<?php 10 $tw_kifu = file_get_contents('http://hoikids.sakura.ne.jp/allwarstw_desplay/index.php'); 11 $pattern = "/https:\/\/t.co\/[a-zA-Z0-9]{10}/"; 12 preg_match_all($pattern, $tw_kifu , $matches); 13 foreach($matches[0] as $value){ 14 $twkifu_url = get_headers($value, true); 15 $wars_url = $twkifu_url["location"]; 16 if(strpos($wars_url,'kif-pona.heroz.jp') !== false){ 17 file_put_contents('twkifu_url.txt', $wars_url."<br>"."\n", FILE_APPEND); 18 echo $wars_url."<br>"; 19 } 20 } 21?> 22</body> 23</html>

しかし、読み込めたのは途中までです。

txt

1https://kif-pona.heroz.jp/games/AlArumin-kishikoh-20170723_191414?tw=1<br> 2https://kif-pona.heroz.jp/games/mini2000s-hama71-20170723_192648?tw=1<br> 3https://kif-pona.heroz.jp/games/zzzzzaabbb-kikiram999-20170723_192753?tw=1<br> 4https://kif-pona.heroz.jp/games/imaccho9-Osaka_Hidariuma-20170723_193456?tw=1<br> 5https://kif-pona.heroz.jp/games/tukanao-Keigo3rd-20170723_194324?tw=1<br> 6~~省略 7https://kif-pona.heroz.jp/games/hayabusa-tsuke0411-20170724_043036?tw=1<br> 8https://kif-pona.heroz.jp/games/tsuke0411-Kuwano1111-20170724_044302?tw=1<br>

原因を探していると、
file_get_contents();では読み込めるのに限界があると知り、
別の手法を考えることになり、
fopenやfgetsで書いて見ました。
以下のコードです。

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<title></title> 6</head> 7<body> 8<p>将棋ウォーズのツイートを読み込んでいくよ</p> 9<?php 10 11 $fp = fopen("http://hoikids.sakura.ne.jp/allwarstw_desplay/index.php", "r"); 12 $pattern = "/https:\/\/t.co\/[a-zA-Z0-9]{10}/"; 13 while( ! feof( $fp ) ){ 14 $tw_kifu = fgets( $fp, 9182 ) . "<br>"; 15 preg_match_all($pattern, $tw_kifu , $matches); 16 foreach($matches[0] as $value){ 17 $twkifu_url = get_headers($value, true); 18 $wars_url = $twkifu_url["location"]; 19 if(strpos($wars_url,'kif-pona.heroz.jp') !== false){ 20 if($wars_url == $pre_wars_url){ 21 continue; 22 }; 23 file_put_contents('twkifu_url.txt', $wars_url."<br>"."\n", FILE_APPEND); 24 echo $wars_url."<br>"; 25 $pre_wars_url = $wars_url; 26 } 27 } 28 } 29 fclose($fp); 30?> 31</body> 32</html>

しかしこれでも同じようところまでしか読み込むことができませんでした。
容量の問題なのか、プログラムのエラーによるものなのか、わからず長時間悩んでおります。
心当たりある方、わかる方是非ともご教授いただけますと大変嬉しいです。
どうかよろしくお願いします。

####追記(解決しました)
asahina1979様のご提案によりcurlを使って解決いたしました。
今後ご覧になられる方の一つの方法として解決したコードを載せておきます。

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<title></title> 6</head> 7<body> 8<p>将棋ウォーズのツイートを読み込んでいくよ</p> 9<?php 10$url = "http://hoikids.sakura.ne.jp/allwarstw_desplay/index.php"; 11$ch = curl_init(); // はじめ 12 13//オプション 14curl_setopt($ch, CURLOPT_URL, $url); 15curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 16$tw_kifu = curl_exec($ch); 17$pattern = "/https:\/\/t.co\/[a-zA-Z0-9]{10}/"; 18 // while( ! feof( $fp ) ){ 19 // $tw_kifu = fread( $fp, filesize($filename)); 20 preg_match_all($pattern, $tw_kifu , $matches); 21 foreach($matches[0] as $value){ 22 $twkifu_url = get_headers($value, true); 23 $wars_url = $twkifu_url["location"]; 24 if(strpos($wars_url,'kif-pona.heroz.jp') !== false){ 25 if($wars_url == $pre_wars_url){ 26 continue; 27 }; 28 file_put_contents('twkifu_url.txt', $wars_url."<br>"."\n", FILE_APPEND); 29 echo $wars_url."<br>"; 30 $pre_wars_url = $wars_url; 31 } 32 } 33 // } 34// var_dump($html); 35curl_close($ch); //終了 36?> 37</body> 38</html>

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/06 10:28

php_curl でいけません?
退会済みユーザー

退会済みユーザー

2017/08/06 10:30

あと、サクラのレンタルサーバーは一分をこすプロセスは適宜killされるか制限されます。
退会済みユーザー

退会済みユーザー

2017/08/06 10:32

またWAFも設定できるので機械的アクセスは途中で受け付けなくなる場合もあります。
hatsu

2017/08/06 11:00

ありがとうございます。curlは聞いたことあったけどよくわかっていなかったため使っていませんでした。調べるところ、file_get_contentsの容量制限については、freadなどの回答が多かったですが、いずれも試してもダメでした。asahina1979様のご提案のようにcurlを使ったら行けました!ありがとうございます。
kei344

2017/08/06 11:16

まだ質問が「受付中」になっていますが、いったんご自身の回答をもって「解決済」にされてはいかがでしょうか。
guest

回答1

0

自己解決

asahina1979様のご提案によりcurlを使って解決いたしました。
今後ご覧になられる方の一つの方法として解決したコードを以下に残しておきます。

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<title></title> 6</head> 7<body> 8<p>将棋ウォーズのツイートを読み込んでいくよ</p> 9<?php 10$url = "http://hoikids.sakura.ne.jp/allwarstw_desplay/index.php"; 11$ch = curl_init(); // はじめ 12 13//オプション 14curl_setopt($ch, CURLOPT_URL, $url); 15curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 16$tw_kifu = curl_exec($ch); 17$pattern = "/https:\/\/t.co\/[a-zA-Z0-9]{10}/"; 18 // while( ! feof( $fp ) ){ 19 // $tw_kifu = fread( $fp, filesize($filename)); 20 preg_match_all($pattern, $tw_kifu , $matches); 21 foreach($matches[0] as $value){ 22 $twkifu_url = get_headers($value, true); 23 $wars_url = $twkifu_url["location"]; 24 if(strpos($wars_url,'kif-pona.heroz.jp') !== false){ 25 if($wars_url == $pre_wars_url){ 26 continue; 27 }; 28 file_put_contents('twkifu_url.txt', $wars_url."<br>"."\n", FILE_APPEND); 29 echo $wars_url."<br>"; 30 $pre_wars_url = $wars_url; 31 } 32 } 33 // } 34// var_dump($html); 35curl_close($ch); //終了 36?> 37</body> 38</html>

投稿2017/08/06 11:26

hatsu

総合スコア1809

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問