PHPのエラー『Warning: ini_set(): A Session is Active』の解決方法

  • 作成日 2025.06.30
  • php
PHPのエラー『Warning: ini_set(): A Session is Active』の解決方法

PHPで `ini_set()` を使用してセッション関連の設定を変更しようとした際に、「Warning: ini_set(): A session is active」という警告が発生することがある。このエラーは、セッションがすでに開始されている状態で `ini_set()` を使って設定を変更しようとしたときに発生する。エラーの発生条件と解決方法について詳しく見ていく。

1. エラーの発生条件

このエラーは、以下のような状況で発生する。

  • セッションがすでに開始されている (`session_start()` が実行済み)
  • セッション開始後に `ini_set()` を使用して `session.*` の設定を変更しようとした
  • セッション設定を変更する処理の順序が誤っている
  • 外部ライブラリやフレームワークが自動的に `session_start()` を実行している

2. エラーが発生するコード例

次のコードは、エラーを引き起こす典型的な例。

<?php
session_start(); // セッションを開始
ini_set('session.cookie_lifetime', 3600); // セッション設定を変更しようとする
?>

実行すると、次のような警告が表示される。

Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time in /path/to/script.php on line X

3. 解決策1: `ini_set()` を `session_start()` の前に実行する

セッションの設定変更は、セッションが開始される前に行う必要がある。

<?php
ini_set('session.cookie_lifetime', 3600); // 先に設定を変更
session_start(); // その後にセッションを開始
?>

4. 解決策2: `session_status()` を使ってセッションの状態を確認する

セッションがすでに開始されている場合は `ini_set()` を実行しないようにする。

<?php
if (session_status() === PHP_SESSION_NONE) {
    ini_set('session.cookie_lifetime', 3600);
    session_start();
}
?>

5. 解決策3: `session_start()` の前に `session_destroy()` を実行する

セッションをリセットしてから設定を変更する方法もある。

<?php
session_destroy(); // 既存のセッションを破棄
ini_set('session.cookie_lifetime', 3600);
session_start(); // 新しいセッションを開始
?>

6. 解決策4: `session_set_cookie_params()` を使用する

`ini_set()` の代わりに `session_set_cookie_params()` を使うことで、セッション開始後でも変更可能な設定がある。

<?php
session_set_cookie_params([
    'lifetime' => 3600,
    'path' => '/',
    'domain' => '',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
]);
session_start();
?>

7. 解決策5: `php.ini` で事前に設定を変更する

もし `ini_set()` の使用が問題になる場合、PHPの設定ファイル (`php.ini`) で事前に設定を変更しておくこともできる。

session.cookie_lifetime = 3600

8. 解決策6: フレームワークの影響を確認する

Laravel、Symfony、WordPress などのフレームワークを使用している場合、自動的に `session_start()` が実行されることがある。これを回避するために、フレームワークの設定を見直す必要がある。

9. 解決策7: `session_write_close()` を使ってセッションを一時的に閉じる

セッションを一時的に閉じてから設定を変更し、その後セッションを再開する方法もある。

<?php
session_start();
session_write_close(); // セッションを閉じる
ini_set('session.cookie_lifetime', 3600);
session_start(); // セッションを再開
?>

10. 解決策8: `session_cache_limiter()` を使う

セッションキャッシュの設定を変更する際には `ini_set()` の代わりに `session_cache_limiter()` を使う方法もある。

<?php
session_cache_limiter('private_no_expire');
session_start();
?>

11. 解決策9: セッションの開始タイミングを確認する

スクリプトのどこで `session_start()` が呼ばれているのか確認し、設定変更の前にセッションが開始されていないことを保証する。

<?php
var_dump(session_status());
?>

出力結果:

  • `0` (PHP_SESSION_DISABLED): セッションが無効化されている
  • `1` (PHP_SESSION_NONE): セッションが開始されていない
  • `2` (PHP_SESSION_ACTIVE): セッションが開始されている

12. 解決策10: `error_reporting()` で警告を非表示にする(推奨されない)

開発環境で一時的に警告を非表示にする場合、`error_reporting()` を調整することもできるが、本質的な解決にはならないため推奨されない。

<?php
error_reporting(E_ALL & ~E_WARNING);
?>