こんにちは。前提としてPHP初心者です。
現在、いろいろなサイトを参照してPHPによりSNSのカウント数をゲットさせるように試みています。
htmlファイル
--------------
~~
<body>
<?php
include_once("./count.php");
$url="http://www.google.co.jp";
$twitter_count=twitter_count($url);
$facebook_count=facebook_count($url);
$google_count=google_count($url);
$hatena_count=hatena_count($url);
?>
Twitterのカウント数:<?php echo $twitter_count ?>
facebookのカウント数:<?php echo $facebook_count ?>
googleのカウント数:<?php echo $google_count ?>
はてブのカウント数:<?php echo $hatena_count ?>
~~~以下、htmlのメインの話題~~~
</hody>
</html>
--------------
PHPのtwitter_count関数、facebook_count関数など全てカウントを取得する関数はcount.phpに記載しています。
count.php の一部twitter_count関数
--------------
<?php
function twitter_count($url){
//JSONデータを取得
$json = @file_get_contents("http://urls.api.twitter.com/1/urls/count.json?ur …
//JSONデータを連想配列に直す
$array = json_decode($json,true);
//カウント
$count = $array["count"];
return $count;
}
?>
--------------
この様にしてSNSカウントを取得して表示しているのですが、PageSpeed Insightsで調べたら”サーバーが遅い”とかなり点数が低くなってしまいました。
検索してみると確かに普通PHPは非同期処理を前提としないと書いてあって、「遅くなるんだなぁ」って思ったのですが、体感はあまり変わらないのですよね…。
ですので、twitter_count関数、facebook_count関数などカウント取得関数を並列で出来ないかなと思案している次第です。
検索するとPHPでも非同期処理をさせるためにいろいろな関数やモジュール(?https://github.com/hironobu-s/parallel-for さんのparallel-for)などもあるみたいですが、どれも配列に入れたものを何か操作する見たくて全くイメージがつかめません。
私のカウント取得関数を配列からどう動作させるの???みたいな感じです。
どうにかして非同期処理を出来ないでしょうか?
そのうちMySQLも使用したいと思っているので非同期処理をマスターしたいです。
よろしくお願いいたします!
(P.S. jqueryのajaxでの取得もいろいろ参照させて頂いて試みました。それぞれ.js外部ファイルを作って、htmlファイルの最後の方で呼び出しているのでPageSpeed Insightsは高いのですがPHPでの取得時より体感的に重いです…それにfeedlyは5月くらいからパイプ?での取得のjqueryでは無理となったみたいで…。)
No.5ベストアンサー
- 回答日時:
仮に1つのスクリプト内で、それぞれを件数取得を非同期で行えたとしても、すべてが取得し終わってから、後続処理を行う必要があると思うので、どれか1つの件数取得が何らかの原因でやたら遅かった場合、結果的にレスポンスが遅いことになると思いますよ。
(今よりは早くなるでしょうが、瞬時ではない)
逆に、件数取得を待たずに画面を表示するならば、そのタイミングで件数を取得する必要性もないと思います。
完全にリアルタイムである必要がないのならば、1スクリプトですべてを担う方法ではなく、サーバ側のcronなどを使って定期的に件数を取得させるようにしておいて、表示側はただ予め取得されている件数を表示するだけ、とかの方がよくないですか?
その上で、まさに今時点での件数が見たいんだ、というアプローチを件数更新画面などを設けて作るとか。
その時にはexec()コマンドで叩きます。
http://se-suganuma.blogspot.jp/2009/02/php_27.html
なので、とりあえずぱっと思いついた方法論は以下の2つ
【方法1】
スクリプトA
予め取得済みの件数を表示するのみ。
cron
exec()を叩くアドレスに対して定期的にリクエストを投げ、
件数を取得・保持する。
【方法2】
スクリプトA
予め取得済みの件数を表示する。
JS(jQuery)でクライアントにAjaxを頑張ってもらって、exec()を
叩くアドレスへリクエストを投げ、定期的に件数を取得・保持
しに行き、JSON形式などで件数をクライアントへ受け取り、
画面に表示されている件数を変更する。
cron
exec()を叩くアドレスに対して定期的にリクエストを投げ、
件数を取得・保持する。
それらの過程でデータベースでも使えばいいんじゃないですかね。
簡単に、
id:bigint, autoincrement
name:varchar(128)
url:varchar(256)
status:int(1) 0:未リクエスト、1:リクエスト中
hit_count:unsigned int
とか定義して、
1.exec()で走行した直後にstatusを確認して、リクエスト中なら
現在保持してる件数を返す。
2.statusをリクエスト中に更新。
3.対象URLへアクセスして件数を取得。
4.hit_countに件数、statusを未リクエストに更新。
とか?
ご回答ありがとうございます。
お返事遅れまして申し訳ございません。とても役に立ちました。
現状、今のサーバーではDBが使えませんので引っ越しします。DBを使える環境になったらまた質問させて下さい。
本当にお優しいですね。感謝しています!!!
No.4
- 回答日時:
>仰るとおりに、巡回処理と結果表示を別にやりました。
ありがとうございます。>ですが、並列処理のやり方が分からなく、150個のURL処理に5分かかってしまいます。
どうも話しのニュアンスがうまく伝わっていないようで
わたしの書き方がわるかったのか申し訳ないです
巡回処理と結果表示を別にやれば
巡回処理がべつに5分かかろうが1時間かかろうがどうでもよい話で
150か所の巡回をしたとして結果を逐次プールしているのですから
結果表示時点で最終巡回したデータは常に一瞬で表示できますよね?
一番単純な並行処理はexecなどでバックグラウンドのコマンドを1処理ずつまわすことです
CLIで処理してもwgetなどで自分自身をhttp経由でゲットしてもどちらでもよいでしょう。
再度のご回答ありがとうございます。
>どうも話しのニュアンスがうまく伝わっていないようで
>わたしの書き方がわるかったのか申し訳ないです
とんでもないです、yambejpさんは何も悪くないです。
私はyambejpさんの仰ることを理解して、そして発展して巡回処理も早くできたら良いと考えたのです。私の方こそ申し訳ございません。
何とかご指摘なさった方法で出来ました。
500程のURLで実行したらPCがかなり重くなりました(汗)
それにSNS側の制限もあるみたいで取得できないカウントも出てきたりしたので、
並列を少なくしたいと思います。これではサーバー側で泊められてしまいます。迷惑はかけられません。
本当にありがとうございました。
No.3
- 回答日時:
ざっとみた感じ今回の命題SNSの巡回処理と結果表示を分けた方がよいでしょう。
SNS巡回は定期処理で行えば、巡回した時点での最新データを表示することができるので
リードタイムはほぼなくなり瞬時に表示されます
yambejpさん、ご回答ありがとうございます。
仰るとおりに、巡回処理と結果表示を別にやりました。ありがとうございます。
ですが、並列処理のやり方が分からなく、150個のURL処理に5分かかってしまいます。
仕組みとしては、urlリストの中からurlを配列に渡してurl1つをゲットして単純に、
$twitter_count=twitter_count($url);
$facebook_count=facebook_count($url);
$pocket_count=pocket_count($url);
と直列に(?)やって1つのurlにつき1つのファイルにまとめて書き出して、それを$urlを変えてwhileで回しています。
希望としては、1つのurlでそれぞれのカウント数を並列に取得して、そのurlにつき全部取得できたと分かったらファイルに書き込み、次のurlに遷るということをしたいです。
MySQLを学ぶためにも並列処理は是非必要です。
原理的には
echo "wow"; //これを10000回表示する関数
echo "465"; //これを10000回表示する関数
を並列にやることと同じと思います。
やり方はありますでしょうか?
よろしくお願いいたします。
No.2
- 回答日時:
>ajaxでやるばあいはどの様にしたらよろしいでしょうか?
ググれ
>PHPでも是非非同期処理をしてみたいので何かありませんでしょうか。
http://www.php.net/manual/ja/book.pthreads.php
このモジュールを使ってマルチスレッド処理を書く。
再度のご回答ありがとうございます。
>>ajaxでやるばあいはどの様にしたらよろしいでしょうか?
>ググれ
すみません。検索をしてもやり方が分かりませんでした。
是非、教えて下さい。
>>PHPでも是非非同期処理をしてみたいので何かありませんでしょうか。
>http://www.php.net/manual/ja/book.pthreads.php
>このモジュールを使ってマルチスレッド処理を書く。
上記のモジュールですが使おうとしたのですが意味が分かりませんでした。
http://qiita.com/rana_kualu/items/02f380f2f3d502 … さんから拝借すると、
<?php
class TestThread extends Thread{
/**
* @Overide
* startしたときに呼ばれる
*/
public function run(){
// 時間のかかる処理
sleep(10);
// このスレッドのIDを確認
print($this->getThreadId());
// これを呼び出したスレッドのIDを確認
print($this->getCreatorId());
}
}
// TestThreadを別スレッドで起動
$testThread1 = new TestThread();
$testThread1->start();
$testThread2 = new TestThread();
$testThread2->start();
~~~
とありますが、run()に私のtwitter_count関数、facebook_count関数を併記しても意味ないと思います。
別スレッドで起動しても"同じ並列処理を非同期処理する"と思うので。
run()内の書き方を是非教えて下さい!これからMySQLでも非同期処理が是非したいのです。
よろしくお願いいたします!
No.1
- 回答日時:
ajaxで処理した方が楽。
ご回答ありがとうございます。
http://nelog.jp/get-feedly-count にあるのですが、
>これを回避するためには、やはりfeedlyから直接PHPで購読者数を取得するしかないようです。
ajaxでやるばあいはどの様にしたらよろしいでしょうか?
あと、PHPでも是非非同期処理をしてみたいので何かありませんでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP PHP ページング データベース 1 2022/06/16 10:30
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
- Visual Basic(VBA) Sheet1の出荷日と品名が並んだ表からSheet2の品名別出荷日別の個数一覧表を作っています。 オ 3 2022/12/01 23:54
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
ページの一部だけリロード
-
PHPで文字列(日本語)の比較
-
phpの処理中に画面表示ををする...
-
プリペアド・ステートメントの...
-
処理の内容を別ページへ出力したい
-
onedrive にexcelファイルをア...
-
CFileDialogの最初のディレクト...
-
VBSの「MsgBox」について
-
3つ以上の論理積は利用可能なの...
-
FTPコマンドでディレクトリごと...
-
.phpと.incファイルの違いはな...
-
エンコーディングについて
-
「クラス関数」「メンバ関数」...
-
Subversionのリポジトリの削除
-
さくらレンタルサーバーでPHPが...
-
Subversionで、ファイルをリネ...
-
PHPからMSSQLへの接続結果の文...
-
SQLiteに画像を格納したい
-
rmdirでフォルダが消せません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
PHPが処理を途中でやめる。原因...
-
Cronで同じ処理を複数同時に実...
-
3の倍数の和
-
phpの処理中に画面表示ををする...
-
インスタンス化に伴うメモリ消...
-
関数の前についている「@」の意...
-
PHPで文字列(日本語)の比較
-
PHPのSmartyについて質問です。...
-
includeしたファイルに変数を持...
-
submitボタンを自動クリック
-
プログラム内で処理中断後も継...
-
web画面から呼び出したphp処理...
-
Smartyにて、文字検索
-
チェックボックスをビット演算...
-
タイムアウト時に次の処理へ移...
-
csvファイルの読込みとソート
-
VBAからPHPを実行(キック)したい
-
PHPの複数関数非同期実行方法を...
-
Linuxサーバに移行とphpexcel出力
おすすめ情報