分からない事&解決したいこと
自宅サーバーのcentOS6.8 centOS6.9 のPHPのfile_get_contents()処理時間を速くしたいです。
時間計測結果
下記の3つの環境にて、
file_get_conetens()の時間を計測したところ、自宅サーバーのcentOSが遅すぎるという結果が得られました。
場所 | PHP Version | 時間 | 備考 |
---|---|---|---|
自宅サーバー | PHP7.2.0 | 約10秒 | 遅すぎる。。 |
自宅メインPC Windows10 | PHP7.2.0 | 約0.2秒 | |
さくらレンタルサーバー FreeBSD | PHP5.4.45 | 約0.14秒 |
自宅のネット環境
WAN
|
ルーター[192.168.0.1]
└centOS [192.168.0.10]
└windows10 [192.168.0.17]
テストに使用したPHPソース
php
1echo '=========処理開始===========<br>'.PHP_EOL; 2 3//PHPのバージョン表示 4echo sprintf('Current PHP version: %s<br>', phpversion()).PHP_EOL; 5 6//遅いメソッド処理の時間を調べる 7$start = microtime(true); 8$content = file_get_contents("http://google.com"); 9$time = microtime(true) - $start; 10 11//スクレイピング結果からタイトルを取得 12preg_match("~<title>(.+)</title>~", $content, $matches); 13 14//結果表示 15echo sprintf('title: %s<br>', $matches[1]).PHP_EOL; 16echo sprintf('file_get_contentsのtime: %s<br>', $time).PHP_EOL; 17echo '=========処理終了===========<br>'.PHP_EOL; 18
テスト結果
▼自宅サーバーのcentOS [root@localhost ~]# php file_get_contents.php =========処理開始===========<br> Current PHP version: 7.2.0<br> title: Google<br> file_get_contentsのtime: 10.242396831512<br> //10秒。遅すぎる。。。。 =========処理終了===========<br>
▼自宅メインPCのwindows10 # php file_get_contents.php =========処理開始===========<br> Current PHP version: 7.2.0<br> title: Google<br> file_get_contentsのtime: 0.19305801391602<br> //速い。 =========処理終了===========<br>
▼さくらレンタルサーバー(プラン:スタンダード 月額515円) % php file_get_contents.php =========処理開始===========<br> Current PHP version: 5.4.45<br> title: Google<br> file_get_contentsのtime: 0.13969922065735<br> //速い。 =========処理終了===========<br>
質問まとめ
file_get_contents()を早くするために、手始めに何から取り組めばよいでしょうか。
検索しても、「curl()を使うと早くなる」といった情報しか見つからず、
crul()を試したところ、ほとんど速くなりませんでした。
調べるための検索ワードなど、教えていただけると幸いです。
よろしくお願い致します。
追加で行った検証結果
追記(2018/01/04 22:37)
結果概要:
頂いた回答を元に、プロバイダのDNSからパブリックDNSに変更したところ、
物凄く処理時間のかかっていたPHP関数(file_get_contetns(),curl())が、
劇的に早くなりました。
変更前の処理時間:約5~10秒
変更後の処理時間:約0.3秒
作業内容:検証用コマンドの実施(ネットワーク設定変更前)
▼検証前に現在の設定確認
[root@localhost ~]# cat /etc/resolv.conf # Generated by NetworkManager domain tojox1.kt.home.ne.jp search tojox1.kt.home.ne.jp nameserver 220.152.38.233 nameserver 220.152.38.201 [root@localhost ~]# ls -l /etc/sysconfig/network-scripts/ | grep eth -rwxr-xr-x. 1 root root 5891 1月 18 21:10 2017 ifdown-eth -rwxr-xr-x. 1 root root 12084 1月 18 21:10 2017 ifup-eth →"ifcfg-eth0"ファイルが存在しませんでした。 →恐らくサーバー構築時に、私が作っていません。今回の回答内容を元に調べている際にこのファイルも必要ということを学びました。(構築当時、ネットワークが繋がっているようだったため、「ネットワーク設定はきっとOKだ!」と思っていました。) [root@localhost ~]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=localhost.localdomain GATEWAY=192.168.0.1
▼検証用コマンドの結果
実行環境 | 実行したコマンド | 早さ(体感) | 備考 |
---|---|---|---|
自宅サーバー | dig example.com @8.8.8.8 | 0.1秒以下 | |
自宅サーバー | ping -c 1 93.184.216.34 | 約0.1秒 | |
自宅サーバー | dig example.com | 0.1秒以下 | 意外と早かったです |
自宅サーバー | ping -c 1 example.com | 約0.1秒 | 意外と早かったです |
作業内容:検証用コマンドの実施(ネットワーク設定含む)
ネットワーク設定変更作業:
▼ifcfg-eth0を作成
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 #memo: このファイルは20180114に自分で新規作成した(このファイルが存在しなかった為)) #参考: http://www.obenri.com/_minset_cent6/netconfig_cent6.html DEVICE=eth0 NM_CONTROLLED=yes ONBOOT=yes TYPE=Ethernet BOOTPROTO=none IPADDR=192.168.0.10 HWaddr=00:1F:29:4C:86:61 DNS1=8.8.8.8 //パブリックDNSを指定 DNS2=8.8.4.4 //パブリックDNSを指定 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth0"
▼ネットワーク再起動
[root@localhost ~]# service network restart インターフェース eth0 を終了中: デバイスの状態: 3 (切断済み) [ OK ] ループバックインターフェースを終了中 [ OK ] ループバックインターフェイスを呼び込み中 [ OK ] インターフェース eth0 を活性化中: アクティブ接続の状態: アクティベート済み アクティブ接続のパス: /org/freedesktop/NetworkManager/ActiveConnection/3 [ OK ]
▼resolv.confが自動で更新された事を確認しました
[root@localhost ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 8.8.8.8 nameserver 8.8.4.4 //備考: centos6ではifcfg-eth0を作ると自動でresolv.confが設定されるという記事を読み、実際に更新されることを確認しました。
▼(こちらは変更していないので、)変更が無い事を確認
[root@localhost ~]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=localhost.localdomain GATEWAY=192.168.0.1
▼検証用コマンドの結果
実行環境 | 実行したコマンド | 早さ(体感) | 備考 |
---|---|---|---|
自宅サーバー | dig example.com @8.8.8.8 | 0.1秒以下 | 変化無し |
自宅サーバー | ping -c 1 93.184.216.34 | 約0.1秒 | 変化無し |
自宅サーバー | dig example.com | 0.1秒以下 | 変化無し |
自宅サーバー | ping -c 1 example.com | 約0.1秒 | 変化無し |
▼PHP関数の計測結果
実行環境 | 関数名 | ※ネットワーク設定変更前の早さ | ネットワーク設定変更後の早さ | 備考 |
---|---|---|---|---|
自宅サーバー | curl() | 約5秒 | 約0.2秒 | 早くなりました!! |
自宅サーバー | file_get_contents() | 約10秒 | 約0.3秒 | 早くなりました!! |
検証以上

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/14 04:06
2018/01/14 14:39 編集
2018/01/14 14:45