simple_html_domが object を作ってくれない
とある会社に、スクレイピングしてCSVを吐き出す業務システムを提供しています。すこぶる便利なようです。今日も元気にスクレイピングでボロ儲け!と思っていたところ、「コケるんですけど!」とクレームが来ました。正直、無視したいところではありますが、確認してみると、たしかに有難く使わせてもらっていた simple_html_dom がコケています。そんなこんなで原因調査。
Fatal error: Call to a member function find() on a non-object
フェイタルです。致命的だそうです。findが使えないよ!というかオブジェクトですらないよ! というメッセージがでて全滅しています。???ワケわからんですね。正直、無視したいところではあります。がんばって直してみたいと思います。
原因の切り分け
このsimple_html_dom は、処理を何度も繰り返すとそのうちメモリリークを起こしてコケる(一定ごとにclearしてあげる必要がある)ので、「ははぁン、またか」と思ったのですが、初っぱなですでにコケているので、それではない感じ。うーん原因追及がめんどくさいパティーン。
投げているデータの構成が変わった?
→答はNo.だ。想定しているデータの最小構成で投げると、普通に動いてくれました。
投げているデータに動作を阻害する文字が入っている?
→答はNo.だ。生データを2つに分割して、前後2回に分けて切り出して送るとちゃんと処理が進みます。※特定の文字がうまく動作しない阻害する件に関してはそのうち書きます。
だとすると、投げているデータのサイズが関係?
→答は…近い。
検索しちゃう。
参考にしたところ
Weird error using PHP Simple HTML DOM parser – Stack Overflow
「そのエラーはオブジェクトではないというエラーですよ」
「そもそもちゃんと取得出来てるの?w」
「使い方本当にあっていますか?」など、 Y!知恵袋のような的を射ない回答の応酬が繰り広げられている中、サイズ制限に引っ掛かってるんじゃね?というヒントを得る。
だがしかし…今回のは別のフォームからHTMLのソースを投げるという雑なUIのシステムなので、アップロード制限とかは関係ないやろ・・・とは思いつつ、
ini_set(‘memory_limit’, ‘128M’);
ini_set(‘post_max_size’, ’32M’);
ini_set(‘upload_max_filesize’, ’32M’);
…とか、色々書いてみたり、.htaccess 書き加えたり、php.iniいじったりしてみたよ!えいっ実行!
→php – Call to a member function find() on a non-object
orz …そりゃそうでしょうね、関係無いですよね。
先ほどのページを読んでいると、きらりと光る1行を発見
The reason for this error is: the simple HTML DOM does not return the object if the size of the response from url is greater than 600000.
You can void it by changing thesimple_html_dom.php
file. Removestrlen($contents) > MAX_FILE_SIZE
from theif
condition of thefile_get_html
function.
This will solve your issue.
約600kb? いま投げている元データが600kbを超えるか超えないかです。
この600000ってどっから出てきた何なの?
simple_html_dom.php 内に直接書かれている数値でした。データサイズがこれ以上だとfalse返して終了してます。
仕方ないので66行目あたりを直接書き換えます。
define(‘MAX_FILE_SIZE’, 600000);
↓
define(‘MAX_FILE_SIZE’, 1280000);
いざ、実行
→ちゃんと動きました( ´▽`)