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

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

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

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

Q&A

解決済

1回答

3842閲覧

curl_multi_selectの返り値が-1になってしまう

watanabe9434

総合スコア26

PHP

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

0グッド

0クリップ

投稿2016/12/16 07:47

編集2016/12/16 08:13

php.net - curl_multi_exec() の例を参考にしながらPHPの並列処理を考えているのですが、無限ループに陥ってしまっているような感じで、応答が返ってきません。

lang

1<?php 2// cURL リソースを作成します 3$ch1 = curl_init(); 4$ch2 = curl_init(); 5 6// URL およびその他適切なオプションを設定します。 7curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); 8curl_setopt($ch1, CURLOPT_HEADER, 0); 9curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); 10curl_setopt($ch2, CURLOPT_HEADER, 0); 11 12// マルチ cURL ハンドルを作成します 13$mh = curl_multi_init(); 14 15// ふたつのハンドルを追加します 16curl_multi_add_handle($mh,$ch1); 17curl_multi_add_handle($mh,$ch2); 18 19$active = null; 20// ハンドルを実行します 21do { 22 $mrc = curl_multi_exec($mh, $active); 23} while ($mrc == CURLM_CALL_MULTI_PERFORM); 24 25while ($active && $mrc == CURLM_OK) { 26 if (curl_multi_select($mh) != -1) { 27 do { 28 $mrc = curl_multi_exec($mh, $active); 29 } while ($mrc == CURLM_CALL_MULTI_PERFORM); 30 } 31} 32 33// ハンドルを閉じます 34curl_multi_remove_handle($mh, $ch1); 35curl_multi_remove_handle($mh, $ch2); 36curl_multi_close($mh); 37

サンプルコードをそのまま実行すると、26行目の

lang

1if (curl_multi_select($mh) != -1) {

の条件分岐で必ずfalseになってしまい、25行目のwhile文が無限ループになっているようです。

実行環境の問題でしょうか。上記コードを正常に実行するための条件が何かあれば、教えてください。
また、curl_multi_exec関数を使った並列処理はどのように書くのが良いのでしょうか。どこかに良いお手本コードはありませんか?

####検証環境
OS: CentOS7.3.1611
PHP: PHP 5.4.16 (CentOS baseリポジトリからyumでインストール)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

curl_multi_select のコメントで usleep(1); 入れろって書いてますね。
php71 ではそれで動作しました。

php

1 2while ($active && $mrc == CURLM_OK) { 3 if (curl_multi_select($multi) == -1) { 4 usleep(1); 5 } 6 do { 7 $mrc = curl_multi_exec($multi, $active); 8 } while ($mrc == CURLM_CALL_MULTI_PERFORM); 9}

投稿2016/12/16 16:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watanabe9434

2016/12/19 05:31

ありがとうございます。 OSとPHPとlibcurlのバージョンの組み合わせによってはcurl_multi_selectで正常に取得できない場合があるから気をつけろということなんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問