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

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

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

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

解決済

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

hatsu
hatsu

総合スコア0

PHP

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

1回答

0評価

0クリップ

2322閲覧

投稿2017/08/06 10:19

編集2022/01/12 10:58

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

php

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

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

txt

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

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

php

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <p>将棋ウォーズのツイートを読み込んでいくよ</p> <\?php \$fp = fopen\("http://hoikids\.sakura\.ne\.jp/allwarstw_desplay/index\.php", "r"\); \$pattern = "/https:\\/\\/t\.co\\/\[a-zA-Z0-9\]{10}/"; while\( ! feof\( \$fp \) \){ \$tw_kifu = fgets\( \$fp, 9182 \) \. "<br>"; preg_match_all\(\$pattern, \$tw_kifu , \$matches\); foreach\(\$matches\[0\] as \$value\){ \$twkifu_url = get_headers\(\$value, true\); \$wars_url = \$twkifu_url\["location"\]; if\(strpos\(\$wars_url,'kif-pona\.heroz\.jp'\) !== false\){ if\(\$wars_url == \$pre_wars_url\){ continue; }; file_put_contents\('twkifu_url\.txt', \$wars_url\."<br>"\."\\n", FILE_APPEND\); echo \$wars_url\."<br>"; \$pre_wars_url = \$wars_url; } } } fclose\(\$fp\); \?> </body> </html>

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

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

php

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <p>将棋ウォーズのツイートを読み込んでいくよ</p> <\?php \$url = "http://hoikids\.sakura\.ne\.jp/allwarstw_desplay/index\.php"; \$ch = curl_init\(\); // はじめ //オプション curl_setopt\(\$ch, CURLOPT_URL, \$url\); curl_setopt\(\$ch, CURLOPT_RETURNTRANSFER, true\); \$tw_kifu = curl_exec\(\$ch\); \$pattern = "/https:\\/\\/t\.co\\/\[a-zA-Z0-9\]{10}/"; // while\( ! feof\( \$fp \) \){ // \$tw_kifu = fread\( \$fp, filesize\(\$filename\)\); preg_match_all\(\$pattern, \$tw_kifu , \$matches\); foreach\(\$matches\[0\] as \$value\){ \$twkifu_url = get_headers\(\$value, true\); \$wars_url = \$twkifu_url\["location"\]; if\(strpos\(\$wars_url,'kif-pona\.heroz\.jp'\) !== false\){ if\(\$wars_url == \$pre_wars_url\){ continue; }; file_put_contents\('twkifu_url\.txt', \$wars_url\."<br>"\."\\n", FILE_APPEND\); echo \$wars_url\."<br>"; \$pre_wars_url = \$wars_url; } } // } // var_dump\(\$html\); curl_close\(\$ch\); //終了 \?> </body> </html>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

asahina1979
asahina1979

2017/08/06 10:28

php_curl でいけません?
asahina1979
asahina1979

2017/08/06 10:30

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

2017/08/06 10:32

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

2017/08/06 11:00

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

2017/08/06 11:16

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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