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>
回答1件