Розташування файлів сеансів в Apache / PHP


81

Яке розташування файлів сеансів за замовчуванням під час встановлення Apache / PHP на Ubuntu 10.10?


12
просто зробіть сторінку з <?php phpinfo() ?>і шукайте session.save_path.
вундеркіндлі

1
Зазвичай / tmp (IIRC), але перевірте свій php.ini на наявність session.save_path
Mark Baker

Відповіді:


79

За замовчуванням session.save_path встановлено значення, ""яке буде оцінювати тимчасовий каталог вашої системи. Перегляньте цей коментар на https://bugs.php.net/bug.php?id=26757 із зазначенням:

Новим за замовчуванням для save_path у наступних версіях (sic) буде порожній рядок, що спричинить зондування тимчасового каталогу.

Ви можете використовувати sys_get_temp_dirдля повернення шляху до каталогу, який використовується для тимчасових файлів

Щоб знайти поточний шлях збереження сеансу, ви можете використовувати

Зверніться до цієї відповіді, щоб дізнатись, яким є тимчасовий шлях, коли ця функція повертає порожній рядок.


68
А з командного рядка просто виконайте php -r 'echo session_save_path (), "\ n";'
Richard Ayotte

Місце розташування встановлене, а не "за замовчуванням" в Ubuntu 10.10. Чиста збірка PHP може дати вам це, але не під будь-якими збірками Debian / Ubuntu, якими я користувався. Запитання orig стосується Ubuntu 10.10. Отже, просто знайдіть його в командному рядку за останнім коментарем (або моєю відповіддю), оскільки місцезнаходження може відрізнятися від 'default' / blank / tmp залежно від використовуваного дистрибутива Linux.
bshea

4
Увага!! Я думаю, що запустити php -r 'echo session_save_path (), "\ n";' як згадувалося вище, використовуватиметься інший файл php.ini (можливо, /etc/php/7.0/cli/php.ini замість /etc/php/7.0/apache2/php.ini), і тому може мати інше значення " session.save_path "
Магматик

@Magmatic правильний, є ДВА php.iniфайли, php_info()вони скажуть вам, який із них використовується під час поточного огляду, і locate php.iniдопоможуть вам їх знайти
Джонатан,

Зверніть увагу (згідно з останніми 2 коментарями): Використання версії CLI PHP (командний рядок) може дати різні результати залежно від дистрибутива та компіляції. Головне, це НЕ версія Apache. (Хоча файли INI можуть бути однаковими щодо шляхів сеансу). Краще заглянути в / grep належний Apache PHP.INI.
bshea

69

Спочатку перевірте значення session.save_pathвикористання ini_get('session.save_path')або phpinfo(). Якщо це значення не є порожнім, воно покаже, де зберігаються файли сеансу. У багатьох сценаріях він порожній за замовчуванням, і в цьому випадку читайте далі:

На машинах Ubuntu або Debian, якщо session.save_pathце не встановлено, файли сеансів зберігаються в /var/lib/php5.

На системах RHEL та CentOS, якщо session.save_path не встановлено, файли сеансів будуть збережені в/var/lib/php/session

Я думаю, що якщо ви компілюєте PHP із вихідного коду, тоді, коли session.save_pathце не встановлено, файли сеансів будуть збережені в /tmp(хоча я сам це не тестував).


1
Я використовую Ubuntu 12.04.5 LTS, і з якихось причин (я нічого не змінював php.ini) мої сеанси не працюють/var/lib/php5/sessions
Феліпе

"Не встановлено"? Він встановлений - але прокоментований у php.ini. Це не означає, що він не має значення або не встановлений. З командного рядка просто виконайте: php -i | grep session.save_pathдля шляху збереження сеансу CLI (і, можливо, Apache). Крім того, дані php.iniзазвичай відображатимуть шлях за замовчуванням - його просто закоментували.
bshea

І так: якщо нічого не скомпільовано як шлях за замовчуванням (не у випадку з більшістю дистрибутивів), буде використано порожнє значення (компіляція за замовчуванням). Який би потім використовував системну тимчасову область (як правило /tmp) як його резервне значення / значення за замовчуванням. Будь ласка, зверніться до php.net/manual/en/…
bshea

@bshea, під "не встановлено", я мав на увазі встановити порожній рядок
Rich

ЗАВДАННЯ Ubuntu 16.04: /etc/php/7.0/*/php.ini-> ;session.save_path = "/var/lib/php/sessions"- Коментар не означає "не встановлено" - це все, що я мав на увазі. Для нього, очевидно, встановлено щось інше, ніж "порожній" (/ tmp) .. і НЕ є порожнім / нульовим рядком
bshea

16

Якщо ви не впевнені у складеному типовому для session.save_path, перегляньте відповідний php.ini.
Зазвичай, це буде відображати прокоментоване значення за замовчуванням.

Старе / нове php.iniрозташування Ubuntu / Debian :
Старіші php5 з Apache: /etc/php5/apache2/php.ini
Старіші php5 з NGINX + FPM: /etc/php5/fpm/php.ini
Ubuntu 16+ з Apache: /etc/php/*/apache2/php.ini*
Ubuntu 16+ з NGINX + FPM - /etc/php/*/fpm/php.ini*

* /*/= поточна версія (и) PHP, встановлена ​​в системі.

Щоб показати версію PHP, що використовується в Apache:

$ a2query -m | grep "php" | grep -Eo "[0-9]+\.[0-9]+"

7.3

Оскільки для цього прикладу запущена версія PHP 7.3, ви б використовували її для php.ini:

$ grep "session.save_path" /etc/php/7.3/apache2/php.ini

;session.save_path = "/var/lib/php/sessions"

Або комбінований однокласний:

$ APACHEPHPVER=$(a2query -m | grep "php" | grep -Eo "[0-9]+\.[0-9]+") \ && grep ";session.save_path" /etc/php/${APACHEPHPVER}/apache2/php.ini

Результат:

;session.save_path = "/var/lib/php/sessions"


Або використовуйте сам PHP, щоб захопити значення за допомогою середовища "cli" (див. ПРИМІТКУ нижче):

$ php -r 'echo session_save_path() . "\n";'
/var/lib/php/sessions
$

Вони також будуть працювати:

php -i | grep session.save_path

php -r 'echo phpinfo();' | grep session.save_path

ПРИМІТКА:

Версія 'cli' (командного рядка) php.ini зазвичай має ті самі значення за замовчуванням, що і версії Apache2 / FPM (принаймні, наскільки session.save_path). Ви також можете скористатися подібною командою для відображення поточних налаштувань модуля PHP веб-сервера на веб-сторінці та використання wget / curl для отримання інформації. Є багато публікацій щодо phpinfo()використання в цьому відношенні. Але швидше просто використовувати інтерфейс PHP або grepправильно вказати йогоphp.ini вказав значення за замовчуванням.

РЕДАГУВАТИ: За коментарем @aesede -> Додано php -i. Дякую


8
Просто FYI ви можете зробити php -iв CLI, щоб отримати еквівалент phpinfo ().
aesede

15

Окрім іншого, типовим місцем розташування /tmp/є/var/lib/php5/


Як так / var / lib / php5 / ніколи не можна писати і вимагає chmodding / chowning. Чи не повинен PHP встановити місце сеансу, яке можна записувати за замовчуванням?
CMCDragonkai,

2
Я гадаю, що на спільних хостах інші люди не можуть намагатися викрадати сесії людей. Тобто, напишіть на сесію, сказавши "username: admin" і встановивши довільний ідентифікатор сеансу, а потім встановіть PHPSESSID на це. Було б дуже легко отримати доступ до чогось на кшталт Drupal або Wordpress на спільному хост-середовищі. (Ви просто ввійдете як адміністратор)
Mattisdada

4

У мене були однакові проблеми з пошуком правильного шляху до сеансів на Mac. Загалом, я з'ясував, що CLI PHP має інший тимчасовий каталог, ніж модуль Apache: використовується Apache /var/tmp, тоді як CLI використовує щось на зразок /var/folders/kf/hk_dyn7s2z9bh7y_j59cmb3m0000gn/T. Але в обох напрямках, sys_get_temp_dir()я отримав правильний шлях, коли session.save_pathпорожньо. Використання PHP 5.5.4.


1

Жодне з перерахованого не працювало для мене, використовуючи репозиторій IUS для CentOS 7 з PHP 7.2:

php -v
> PHP 7.2.30 (cli) (built: Apr 19 2020 00:32:29) ( NTS )

php -r 'echo session_save_path(), "\n";
> 

php -r 'echo sys_get_temp_dir(), "\n";'
> /tmp

Однак сеанси зберігались не в /tmpпапці, а в /var/lib/php/mod_php/session/папці:

ls /var/lib/php/mod_php/session/
> sess_3cebqoq314pcnc2jgqiu840h0k  sess_ck5dtaerol28fpctj6nutbn6fn  sess_i24lgt2v2l58op5kfmj1k6qb3h  sess_nek5q1alop8fkt84gliie91703
> sess_9ff74f4q5ihccnv6com2a8409t  sess_dvrt9fmfuolr8bqt9efdpcbj0d  sess_igdaksn26hm1s5nfvtjfb53pl7  sess_tgf5b7gkgno8kuvl966l9ce7nn

0

Я вірю в його / tmp /. Хоча перевірте свою функцію phpinfo, вона повинна там писати session.save_path.


Хоча в документах PHP зазначається, що за замовчуванням використовується "/ tmp", усі дистрибутиви Linux, які я спробував, не поміщають файли сеансу /tmp- чи знаєте ви щось таке? Це так, якщо ви будуєте PHP з джерела? Коли "session.save_path" порожній, може бути складно зрозуміти, куди йдуть файли (отже, це питання, я підозрюю)
Rich

0

Єдиний надійний варіант, щоб знайти поточне session.save_pathзначення, - це завжди перевіритиphpinfo() саме те середовище, де ви хочете дізнатися каталог зберігання сеансів.

Причина: можуть змінюватися всілякі речі session.save_path, або замінюючи php.iniзначення, або встановлюючи його під час виконання за допомогою ini_set('session.save_path','/path/to/folder');. Наприклад, панелі управління веб-серверами, такі як ISPConfig, Plesk тощо, часто адаптують це, щоб надати кожному веб-сайту власний каталог із файлами сеансів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.