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

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

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

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

1631閲覧

Codeigniter3でセッションが使えない

alberorana

総合スコア52

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2018/02/04 00:54

編集2018/02/04 03:06

前提・実現したいこと

Codeigntierで作られた既存のシステムをローカルで動くようにしたい
現在の状況としまして、Amazon Linux上で動いているサービスの追加開発をすることになっており、ローカル開発環境を立ち上げたのですが、セッションを使用した部分が動きません。

ローカル環境

Docker for Macを使用して開発環境を構築しています。
・nginx 1.14
・php-fpm 7.21
・MySQL 5.7
をdocker-composeを使って管理しています。

わかっていること

■動作確認済みの物
・通常のPHPセッションは動作している(nginx上のお話で、codeigniterシステム上で書くと動作しない)
・ブラウザのCookieも保存されている
・同じソースコードで本番環境ならば動作する
・nginxの /tmpci_session**** ファイルは存在する

cookieの状態

動作したコード

<?php $_SESSION["_test"]++; echo $_SESSION["_test"]; ?>

こちらを実行すると更新ごとに数字が増えていく

動作しないソースコード

counter.php

1class Counter extends CI_Controller{ 2function index() 3{ 4$this->load->library('session'); 5 6if(! $this->session->userdata('count')){ 7$this->session->set_userdata('count',1); 8}else{ 9$count=$this->session->userdata('count'); 10$count++; 11$this->session->set_userdata('count',$count); 12} 13echo 'アクセス回数は'.$this->session->userdata('count').'です<br>'; 14echo 'セッションID:'.$this->session->userdata('session_id').'<br>'; 15echo 'IPアドレス:'.$this->session->userdata('ip_address').'<br>'; 16echo 'ユーザーエージェント:'.$this->session->userdata('user_agent').'<br>'; 17echo '最終アクセス:'.$this->session->userdata('last_activity'); 18} 19}

こちらのコードを実行してもアクセス回数の表示が1のままです。

試したこと

ブラウザ切り替え(chrome,safari,firefox)
MAMPでの開発環境立ち上げ
どちらも同じ結果だったため、php-fpmか nginxの設定が怪しいのですが、codeigniterを利用するにあたり特殊な設定が必要なのでしょうか?

/etc/nginx/conf.d/default.conf

server { listen 80; index index.php index.html; server_name localhost; include mime.types; root /var/www/html; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ .php$ { root /var/www/html; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param CI_ENV test; } location ~* .(ico|css|js|gif|jpe?g|png)(?[0-9]+)?$ { root /var/www/html; expires 0; access_log off; } }

php.ini(省略)

[Session] ; Handler used to store/retrieve data. ; http://php.net/session.save-handler session.save_handler = files ; Argument passed to save_handler. In the case of files, this is the path ; where data files are stored. Note: Windows users have to change this ; variable in order to use PHP's session functions. ; ; The path can be defined as: ; ; session.save_path = "N;/path" ; ; where N is an integer. Instead of storing all the session files in ; /path, what this will do is use subdirectories N-levels deep, and ; store the session data in those directories. This is useful if ; your OS has problems with many files in one directory, and is ; a more efficient layout for servers that handle many sessions. ; ; NOTE 1: PHP will not create this directory structure automatically. ; You can use the script in the ext/session dir for that purpose. ; NOTE 2: See the section on garbage collection below if you choose to ; use subdirectories for session storage ; ; The file storage module creates files using mode 600 by default. ; You can change that by using ; ; session.save_path = "N;MODE;/path" ; ; where MODE is the octal representation of the mode. Note that this ; does not overwrite the process's umask. ; http://php.net/session.save-path ; RPM note : session directory must be owned by process owner ; for mod_php, see /etc/httpd/conf.d/php.conf ; for php-fpm, see /etc/php-fpm.d/*conf session.save_path = "/tmp" ; Whether to use strict session mode. ; Strict session mode does not accept uninitialized session ID and regenerate ; session ID if browser sends uninitialized session ID. Strict mode protects ; applications from session fixation via session adoption vulnerability. It is ; disabled by default for maximum compatibility, but enabling it is encouraged. ; https://wiki.php.net/rfc/strict_sessions session.use_strict_mode = 0 ; Whether to use cookies. ; http://php.net/session.use-cookies session.use_cookies = 1 ; http://php.net/session.cookie-secure ;session.cookie_secure = ; This option forces PHP to fetch and use a cookie for storing and maintaining ; the session id. We encourage this operation as it's very helpful in combating ; session hijacking when not specifying and managing your own session id. It is ; not the be-all and end-all of session hijacking defense, but it's a good start. ; http://php.net/session.use-only-cookies session.use_only_cookies = 1 ; Name of the session (used as cookie name). ; http://php.net/session.name session.name = PHPSESSID ; Initialize session on request startup. ; http://php.net/session.auto-start session.auto_start = 0 ; Lifetime in seconds of cookie or, if 0, until browser is restarted. ; http://php.net/session.cookie-lifetime session.cookie_lifetime = 360

はっきりした原因がわからずつまずいているため、よろしくお願いいたします。

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

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

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

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

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

maisumakun

2018/02/04 01:02 編集

すみません、タイトルに「CodeIgniter3」と書いてありましたね。質問は単なるミスです
guest

回答2

0

自己解決

自己解決いたしました。
結論としてはバージョンの問題でした。
さらに調べたところ、Codeigniter3 と PHP7.1の相性が悪くセッションが効いていませんでした。

投稿2018/02/09 11:40

alberorana

総合スコア52

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

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

0

cookie が保存されているということなので、送信されているか確認してみてください。
本番が https 、local が http とかだったりしませんか?

投稿2018/02/04 01:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

alberorana

2018/02/04 01:24

まさしく本番が https 、local が httpになります。 今 set_cookieとget_cookieで試してみましたが、NULLとなりました。 理解が及ばず申し訳ありませんが、https通信になることによってURLが変化してクッキーの送信ができなくなるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/04 02:43

少し言葉が足りなかったようです。 ブラウザに保存されている cookie の状態を確認してほしいのですが、secure フラグが true になってないでしょうか? その場合、http 通信では、対象の cookie(この場合はセッションID)は、サーバに送信されません。 *ただ、この現象が起こるためには、一度以上 https 通信が成立したことがあるのが前提となるので、不思議な現象ではあるのですが^^; CodeIgniter のセッションIDに対する secure 属性がどこで制御できたか思い出せないですが、原因は secure 属性にあるように思えます。
alberorana

2018/02/04 03:05

ご回答ありがとうございます。 secureフラグの項目が見つけられなかったので、スクリーンショットを添付いたします。 一度もhttps通信をしていないので、不思議ですねー。 Codeigniterのcookie送信についてももう少し深掘りして調べてみます。
alberorana

2018/02/04 03:22 編集

失礼しました。 今、プロジェクトメンバーに確認したところ httpでローカル環境を構築して動いているとの事とcodeigniterのセキュア(httpsでのみ実行)も無効に設定されていましたので、SSLは関係が薄そうです。 ご回答していただいたのに申し訳ありません。
退会済みユーザー

退会済みユーザー

2018/02/04 03:39

そうみたいですね。 secure フラグがなければ、ブラウザからのリクエストで送出されるので、問題無さそうです。 *ちなみに送出の確認は、ブラウザの開発ツールのネットワークタブで確認できます。 ci_session ってアクセス毎に変わっています?
alberorana

2018/02/04 04:10 編集

ブラウザのci_sessionは更新しても変わっていません。 サーバーの `/tmp/ci_session*** ` はアクセスごとに1つずつ増えています。 *ちなみに送出の確認は、ブラウザの開発ツールのネットワークタブで確認できます。 ありがとうございます。とても勉強になりますm(_ _ )m
退会済みユーザー

退会済みユーザー

2018/02/04 04:19

> ci_sessionはアクセスごとに1つずつ増えています。 ん?ci_session って、文字列だと思いますが、どのように増えているのでしょうか? ちなみに、スクリプトを以下のように変更し何度かアクセスするとどう変化するでしょうか? class Counter extends CI_Controller{ function index() { $this->load->library('session'); if(! $this->session->userdata('count')){ $this->session->set_userdata('count',1); }else{ $count=$this->session->userdata('count') +1; echo 'アクセス回数は'.$count.'です<br>'; echo 'セッションID:'.$this->session->userdata('session_id').'<br>'; echo 'IPアドレス:'.$this->session->userdata('ip_address').'<br>'; echo 'ユーザーエージェント:'.$this->session->userdata('user_agent').'<br>'; echo '最終アクセス:'.$this->session->userdata('last_activity'); $this->session->set_userdata('count',$count); } echo 'count が無いです。'; } }
alberorana

2018/02/04 04:26

スクリプトの結果は countが無いです。になりました。 te2jiさんのおっしゃるci_sessionはブラウザですよね?ブラウザならば更新しても変わっておりません。 わかりにくくて申し訳ございません。
退会済みユーザー

退会済みユーザー

2018/02/04 04:57

ブラウザに保存されている ci_session の値を聞いていました。 確認ありがとうございます。 では以下ではどうでしょうか? class Counter extends CI_Controller{ function index() { $this->load->library('session'); if(! isset($_SESSION['count'])){ $_SESSION['count'] = 1; echo 'count が無いです。'; }else{ $count=$_SESSION['count'] +1; echo 'アクセス回数は'.$count.'です<br>'; $_SESSION['count'] = $count; } } }
alberorana

2018/02/04 05:11

こちらもcount が無いです。になってしまいます。 やはり事前調査と同じようにサーバーやphpではSESSIONが使えるものの、codeigntierのみセッションが使えないという状況のようです。
退会済みユーザー

退会済みユーザー

2018/02/04 05:16

ちょっとこれ以上は思いつきません^^; 解決するといいのですけど。
alberorana

2018/02/04 05:19

長々とお付き合いいただき、ありがとうございます! もうちょっとがんばってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問