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

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

ただいまの
回答率

90.61%

  • FuelPHP

    517questions

    FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

FuelPHPで、curlでリクエストを投げたが、404になってしまう。コマンドでcurlするとリクエストが可能

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,684

usugita_san

score 218

環境はEC2でAmazonLinuxを動作させています。

FuelPHPで以下のようなソースでリクエストを投げました。パラメータについてはダミーだとお考え下さい。


$url = "https://hogehoge.net/hoge/api/login"
$request  = \Request::forge($url, 'curl');
$request->set_option(CURLOPT_SSL_VERIFYPEER, false);
$request->set_method('post');
$request->set_params($params);
$request->add_param($param2);
$request->execute();
$response = $request->response();

その結果h,curlを投げた結果が404で帰ってきました。
FuelPHPのログに以下のようにログがありました。

INFO - 2015-05-26 10:06:34 --> Fuel\Core\Request_Curl::__construct - Creating a new CURL Request with URI = "https://hogehoge.net/hoge/api/login"
INFO - 2015-05-26 10:06:34 --> Fuel\Core\Request::__construct - Creating a new main Request with URI = "error/404"
INFO - 2015-05-26 10:06:34 --> Fuel\Core\Request::execute - Called
INFO - 2015-05-26 10:06:34 --> Fuel\Core\Request::execute - Setting main Request

このリクエスト先は自分自身のサーバです。
httpdのログを見ても、何も表示されておりませんでした。

不思議なのは、linuxのコマンドのcurlを投げた場合、ちゃんとリクエストが届くのです。

このような現象に、どなたか心当たりが無いでしょうか?

curlをコマンドで打つとリクエストが届くので、セキュリティグループの問題ではないと考えています。
FuelPHPの内部的な問題ではないかと思っていますが、configファイルは数週間変更しておりません。

追記です。
Fuel\Core\classes\requestのcurl.phpで、executeメソッドの中を見てみると、
$this->set_response($body, $this->response_info('http_code', 200), $mime, $headers, isset($this->headers['Accept']) ? $this->headers['Accept'] : null);
という処理の後で、

if ($body === false)
{
        $this->set_defaults();
        throw new \RequestException(curl_error($connection), curl_errno($connection));
}

の処理に入ってました。
404エラーとなっていたのは例外処理の結果らしく、根本的にはこのset_responseあたりに問題があるんじゃないかと思っています。
引き続き調べてみます。


さらに追記です。

curl.php の executeメソッドで、

$body = curl_exec($connection);

の結果、$bodyが空になっていました。

その数行手前で、

curl_setopt_array($connection, $this->options);
の時点で、$this->options の内容をログに出力した所、以下のようになりました。

(
    [> 64] => 
    [13] => 30
    [19913] => 1
    [45] => 
    [52] => 1
    [10036] => POST
    [47] => 1
    [10015] => param_name=hogehoge1&param_name2=hogehoge2
> )
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

404 ということは、ウェブサーバでリクエストを受け付け、
ウェブサーバがファイルを探しにいって存在しない場合に返却するレスポンスコードです。

なので、ネットワーク的には問題ないかと思います。

URL(主にファイル名)が正しくない気がしますが、ブラウザからそのURLでアクセスして
画面は表示されますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/27 10:15

    はい。表示されます。
    今、FuelのCoreの
    /fuel/core/classes/request/curl.php
    にログを入れて確認したのですが、
    Request_Curl の
    public function execute(array $additional_params = array())
    というメソッドで、
    $this->set_response($body, $this->response_info('http_code', 200), $mime, $headers, isset($this->headers['Accept']) ? $this->headers['Accept'] : null);

    の後で、
    if ($body === false)
    {
    logger(\Fuel::L_INFO, 'yasuda test body === false', __METHOD__);
    $this->set_defaults();
    throw new \RequestException(curl_error($connection), curl_errno($connection));
    }
    の中に入ってました・・・
    404エラーになったのは、例外処理の結果らしく、根本的には別の問題だったようです。

    キャンセル

  • 2015/05/27 23:33

    なるほど。
    FuelPHPのcURLでエラーとなった場合、404で返却されてしまうんでしょうね。
    (ごめんなさい。FuelPHP詳しくないので余計な返答してしまいました)

    ちなみに
     if ($body === false)
    のすぐ後で、
     curl_error($connection) と  curl_errno($connection)
    をログに出力してみて、
    発生しているエラーコードを下記と照らし合わせてみては如何でしょうか。
    http://curl.haxx.se/libcurl/c/libcurl-errors.html

    また、とんちんかんなこと言っていたらごめんなさい。

    キャンセル

  • 2015/05/28 10:23

    とんでもございません。私がもう少し詳しく調べてから質問すべきでした。
    感謝しております。

    curl_errorについても、これから調べてみます。
    ありがとうございました。

    キャンセル

  • 2015/06/02 09:35

    ごめんなさい、理由は解らないのですが、AWSのインスタンスを再起動したら治りました…。OSがそもそも不安定だったのかな?とか考えています。こんなこと、あるんですね…。現在は一切の修正もいらずに正常に動いています。
    少々腑に落ちませんが、これで解決としたいと思います。

    キャンセル

  • 2015/06/02 20:38

    うぇ〜、、、再起動で解消ってことはさまざまな原因が考えられますね...

    ・Apache再起動で設定が反映された
    ・ネットワークが再起動され設定が反映された
    ・メモリ領域が変わったことで不具合が解消された
     etc...

    私もAWSではありませんが仮想環境でマイグレーションが発生し、
    メモリ破壊した事象も経験しているので、なんとも言えませんね。

    まずは解決したとのこと。再発しないことを祈ります。

    こんなのでベストアンサー頂いて恐縮です。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • FuelPHP

    517questions

    FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

  • トップ
  • FuelPHPに関する質問
  • FuelPHPで、curlでリクエストを投げたが、404になってしまう。コマンドでcurlするとリクエストが可能