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

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

ただいまの
回答率

90.33%

  • PHP

    21369questions

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

  • CentOS

    2833questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Apache

    1918questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • VMware

    236questions

    VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

エラー表示Call to a member function getRequest() on a non-object inの意味を知りたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 351

publicstatic

score 13

 前提・実現したいこと

vmware上のcentos7のapacheサーバーの中に
owncloudというソフトをインストールしたのですがホスト側からブラウザで管理者画面を表示するときに

Fatal error: Call to a member function getRequest() on a non-object in /var/www/html/owncloud/lib/private/response.php on line 77


と出て表示されませんでした。

エラー表示が示す記述は↓の通りです。

ファイルの場所
vim /var/www/html/owncloud/lib/private/response.php

エラー表示に該当する行
 77行目 $protocol = \OC::$server->getRequest()->getHttpProtocol();

このコードを見たとき

1,このエラー表示がされたときどのようなことが不足していると考えられるのでしょうか?

2.またエラーを調べるときに見といた方がいいというものがあればご指導お願いします。

 該当のソースコード

<?php
 * @author Andreas Fischer <bantu@owncloud.com>
 * @author Bart Visscher <bartv@thisnet.nl>
 * @author Jorn Friedrich Dreyer <jfd@butonic.de>
 * @author Lukas Reschke <lukas@owncloud.com>
 * @author Morris Jobke <hey@morrisjobke.de>
 * @author Robin McCorkell <robin@mccorkell.me.uk>
 * @author Thomas Muller <thomas.mueller@tmit.eu>
 * @author Vincent Petry <pvince81@owncloud.com>
 *
 * @copyright Copyright (c) 2016, ownCloud, Inc.
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
class OC_Response {
        const STATUS_FOUND = 304;
        const STATUS_NOT_MODIFIED = 304;
        const STATUS_NOT_FOUND = 404;
        const STATUS_INTERNAL_SERVER_ERROR = 500;
        const STATUS_SERVICE_UNAVAILABLE = 503;

        /**
        * Enable response caching by sending correct HTTP headers
        * @param integer $cache_time time to cache the response
        *  >0           cache time in seconds
        *  0 and <0     enable default browser caching
        *  null         cache indefinitly
        */
        static public function enableCaching($cache_time = null) {
                if (is_numeric($cache_time)) {
                        header('Pragma: public');// enable caching in IE
                        if ($cache_time > 0) {
                                self::setExpiresHeader('PT'.$cache_time.'S');
                        }
                        else {
                                self::setExpiresHeader(0);
                        }
                }
                else {
                        header('Cache-Control: cache');
                        header('Pragma: cache');
                }

        /**
        * disable browser caching
        * @see enableCaching with cache_time = 0
        */
        static public function disableCaching() {
                self::enableCaching(0);
        }

        /**
        * Set response status
        * @param int $status a HTTP status code, see also the STATUS constants
        */
        static public function setStatus($status) {
77行目 →             $protocol = \OC::$server->getRequest()->getHttpProtocol();
                switch($status) {
                        case self::STATUS_NOT_MODIFIED:
                                $status = $status . ' Not Modified';
                                break;
                        case self::STATUS_TEMPORARY_REDIRECT:
                                if ($protocol == 'HTTP/1.1') {
                                        break;
                                } else {
                                        $status = self::STATUS_FOUND;
                                        // fallthrough
                                }
                        case self::STATUS_FOUND;
                                $status = $status . ' Found';
                                break;
                        case self::STATUS_NOT_FOUND;
                                $status = $status . ' Not Found';
                                break;
                        case self::STATUS_INTERNAL_SERVER_ERROR;
                                $status = $status . ' Internal Server Error';
                                break;
                        case self::STATUS_SERVICE_UNAVAILABLE;
                                $status = $status . ' Service Unavailable';
                                break;
                }
                header($protocol.' '.$status);
        }

        /**
        * Send redirect response
        * @param string $location to redirect to
        */
        static public function redirect($location) {
                self::setStatus(self::STATUS_TEMPORARY_REDIRECT);
                header('Location: '.$location);
        }

        /**
        * Set reponse expire time
        * @param string|DateTime $expires date-time when the response expires
        *  string for DateInterval from now
        *  DateTime object when to expire response
        */
        static public function setExpiresHeader($expires) {
                if (is_string($expires) && $expires[0] == 'P') {
                        $interval = $expires;
                        $expires = new DateTime('now');
                        $expires->add(new DateInterval($interval));
                }
                if ($expires instanceof DateTime) {
                        $expires->setTimezone(new DateTimeZone('GMT'));
                        $expires = $expires->format(DateTime::RFC2822);
                }
                header('Expires: '.$expires);
        /**
        * Checks and set ETag header, when the request matches sends a
        * 'not modified' response
        * @param string $etag token to use for modification check
        */
        static public function setETagHeader($etag) {
                }
                $etag = '"'.$etag.'"';
                        self::setStatus(self::STATUS_NOT_MODIFIED);
                        exit;
                }
                header('ETag: '.$etag);
        }

        /**
        * Checks and set Last-Modified header, when the request matches sends a
        * 'not modified' response
        */
        static public function setLastModifiedHeader($lastModified) {
                if (empty($lastModified)) {
                if (is_int($lastModified)) {
                }
                        self::setStatus(self::STATUS_NOT_MODIFIED);

        /**
         * Sets the content disposition header (with possible workarounds)
         * @param string $filename file name
         * @param string $type disposition type, either 'attachment' or 'inline'
         */
                if (\OC::$server->getRequest()->isUserAgent(
                } else {
                }
        }

        /**
         * Sets the content length header (with possible workarounds)
         * @param string|int|float $length Length to be sent
         */
        static public function setContentLengthHeader($length) {
                if (PHP_INT_SIZE === 4) {
                                // bodies from being received incompletely.
                                return;
                        }
                        $lfh = new \OC\LargeFileHelper;
                        $length = $lfh->formatUnsignedInteger($length);
                }
                header('Content-Length: '.$length);
         * @param string $filepath of file to send
         */
                        self::setETagHeader(md5_file($filepath));

                        self::setContentLengthHeader(filesize($filepath));
                        fpassthru($fp);
                }
                else {
                        self::setStatus(self::STATUS_NOT_FOUND);
                }
        }

        /**
         * components (e.g. SabreDAV) also benefit from this headers.
         */
                        . 'img-src * data: blob:; '
                        . 'font-src \'self\' data:; '
                        . 'media-src *; '
                        . 'connect-src *';
                header('Content-Security-Policy:' . $policy);

                // Send fallback headers for installations that don't have the possibility to send
                // custom headers on the webserver side
                if(getenv('modHeadersAvailable') !== 'true') {
                        header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters
                        header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE
                        header('X-Frame-Options: Sameorigin'); // Disallow iFraming from other domains
                        header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag
                        header('X-Download-Options: noopen'); // https://msdn.microsoft.com/en-us/library/jj542450(v=vs.85).aspx
                        header('X-Permitted-Cross-Domain-Policies: none'); // https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html
                }
        }

 試したこと

1.用語の検索

クラスメソッドを実行して「Call to a member function」と表示されるときは、オブジェクト作成前に実行していたり、必要なオブジェクトインスタンスが生成されていないことが考えられます。

ということでしたがどの部分のインスタンスができていないのかよくわかりませんでした。

2.php拡張モジュールの不足

以前真っ白になったときに拡張モジュールが不足していたため表示できなかったことがあったのですが、そのときのエラー表示がphp拡張モジュールを入れてくださいとはっきりと明記されていたので違うと考えています。

 補足情報(FW/ツールのバージョンなど)

VMware(R) Workstation 12 Player 12.5.7 build-5813279
CentOS Linux release 7.5.1804 (Core)
Apache/2.4.6 (CentOS)
PHP 5.4.16 (cli) (built: Apr 12 2018 19:02:01)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

OwnCloudに貢献しようというなら話は別ですが、設定がおかしいのだと思います。

エラーログが出力されているかもしれません(出力されない場合もある)ので、ログを見ると何がおかしいか分かるかも(ログが出てても良く分からないこともある)しれません。

動いている流れとしては、index.phpが呼ばれて、/lib/base.phpがrequireされ、OC::init()が呼ばれたときに、エラーが出て、catchでsetStatusするときに、該当の77行目でつまづく、という流れではないかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/27 14:54

    回答ありがとうございます。

    >OwnCloudに貢献しようというなら話は別ですが
    owncloudをインストールした理由は参考にしているサーバーの本に載っていたためでした。
    入門書ということで手順もそこまでかかっていなかったのですがはまってしまってます。
    ownCloudの創始者が独立したらしくそちらで作ったnextcloudの方が主流になるかもしれないので
    これからのことを考えるとnextcloudなど別のソフトにしてみようかと思っています。

    >エラーログが出力されているかもしれません
    エラーログに関してはブラウザ上に表示されていたのでそれで全部かなと思っていました。
    phpのエラーログではなくさらに内部のエラーログを探すということですね。

    1.サーバーエラーのログ

    # tail /var/log/httpd/error_log
    [Fri Jul 27 14:01:40.966363 2018] [:error] [pid 1480] [client 192.168.10.100:56515] PHP Fatal error: Call to a member function getRequest() on a non-object in /var/www/html/owncloud/lib/private/response.php on line 77

    サーバーの方は同じログが出ていました。


    2.owncloudのログ
    # locate owncloud.log
    で検索したり
    # /var/www/html/owncloud/data/owncloud.log
    を探しましたが見当たりませんでした。

    >動いている流れとしては
    確認してみたのですが

    # index.php →/lib/base.php

    と飛んで
    base.phpの中を探したところ一番下に 

    # OC::init();

    がありました。

    それを呼び出したときにエラーになったということですね。

    setStatusメゾットをよく見るとstatusにNot Foundを入れるようになってたりしていて
    接続の状態を返す役割なのだというのはわかりました。ただ
    statusをswitch文で判定する前の段階のエラーのためどこが違うのか探すのが難しそうに見えました。

    残念ですが、他のソフトをインストールして経験を積んでからにしたいと思います。
    エラーの大まかな流れは理解できたと思います。ありがとうございました。

    キャンセル

  • 2018/07/27 15:20

    OC::init()の中で、インスタンス化してOC::$serverに代入しているところが失敗しています。
    なので「設定がおかしいのだと思います」
    setStatusまでエラーにならないのは、$serverにアクセスが起こらないからだと思います。
    ログを出すにもログを出すための設定が必要かもしれない。
    あと、最新のソースには"owncloud/lib/private/response.php"が存在しないので(owncloud/lib/private/legacy/response.phpにある)、まあ他のソフトにトライする、という判断は賢明かと思います。

    キャンセル

  • 2018/07/27 18:22

    回答ありがとうございます。
    >$serverにアクセスが起こらないからだと思います
    これはサーバーが落ちているということでいいのでしょうか?
    検証のため

    1アクセスしているHPの確認
    管理者画面を表示するindex.php内にわざとエラーを出させるためにaという文字を入力して保存してアクセス
    しました。その結果

    Parse error: syntax error, unexpected 'if' (T_IF) in /var/www/html/owncloud/index.php on line 30

    と文法が違いますと変化して出たのでこのindex.phpにアクセスしていると思います。

    2.サーバー自体が落ちている可能性
    index2.php
    というファイルを作って中に
    <?php phpinfo()?>
    と打ち込んで

    /var/www/html/owncloud/index2.php

    にアクセスしてみるとPHPのversion情報などが表示されました。
    これによってphpも使える状態だと思っています。

    phpファイルにはアクセスはできるのですが、owncloudのindex.phpだけがserverエラーになってしまっているようでした。

    キャンセル

  • 2018/07/31 17:18

    >$serverにアクセスが起こらないから
    遅レスですみません。これはサーバが落ちているとか、ページにアクセスできないとかではなく、OC::$serverにセットされたはずのオブジェクトを操作していないという意味です。
    `$server->`という構文が動作していない、という意味です。

    キャンセル

  • 2018/07/31 18:42

    回答ありがとうございます。
    オブジェクトを操作していない=サーバーの接続関係
    くらいにしか考えられませんでした。
    よくよく考えたらサーバーが落ちてたらnotfoundとかでるはずですよね..。

    >$serverにアクセスが起こらない
    ここからapacheについて調べることを思いつけばよかったのですが、
    接続関係だという思い込みでなかなかたどり着きませんでした。

    キャンセル

0

他のソフトを入れてみたりいろいろ調べた結果解決しましたので追記します。

原因はapacheのUserとgroup名の設定ミスでした。

apacheの設定ファイルである

/etc/httpd/conf/httpd.conf


内の

User www 
group www

User apache
group apache

にしたところ無事につながりました。
httpdのUser名が他の方と違ってたからowncloudの所有者をapacheにしてもつながらなかったようでした。

1つ疑問になったのは
Userをapacheにしないとなぜだめなのかです。

Userをapacheに修正する前の

User www 
group www

のときに

/var/www/html/owncloud/data


のdataディレクトリの所有者を

chown -R www:www /var/www/html/owncloud/data

と所有者をwwwにするとログイン画面がでてつながったのですが
ユーザー名とパスワードを画面表示後すぐ入れても

you took too long to login ...

とでてログインができませんでした。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/31 17:24

    owncloudの下のdata以外のフォルダであるとか、phpのログ関連・セッション関連のファイル群(wwwのユーザがphp/apacheにアクセス権ではじかれるとは思いにくいですが)にアクセス権限があるかどうかによって、その挙動が起こり得ると思います。

    キャンセル

  • 2018/07/31 18:43

    返答ありがとうございます。
    >owncloudの下のdata以外のフォルダであるとか、phpのログ関連・セッション関連のファイル群
    もしかしたらwwwでも上記の関係するファイルにwwwの権限を与えていれば
    できていたのかもしれませんね。

    >you took too long to login ...
    と出たときsession関係がおかしいのかと思い
    /var/lib/php/session
    の所有者をwwwにしたところ変化がなく他のファイルの見当がつかなかったので
    諦めていました。

    キャンセル

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

  • PHP

    21369questions

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

  • CentOS

    2833questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Apache

    1918questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • VMware

    236questions

    VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。