Permalänk
Medlem

PHP - Problem med sessioner

Tjenare,
har kört in i en vägg med ett problem jag aldrig haft förr. Felet finns inte i övriga servrar jag kört apache med php på och det är första gången jag suttit i 7.0 i en Linux-miljö (inte programmerat på väldigt länge).

Eftersom jag sitter och leker runt lite i en mongo-databas och kör diverse queries till den så vill jag inte att allt ska ske på samma sida, så låt oss därför kalla sidorna för... GET och POST för att hålla det så lätt som möjligt.

I min index-php så skickar jag därför mina forms till "GET" eller "POST" beroende på vilken form som används från sidan.

Problemet är att jag vill inte använda URL-parametrar (?id=<#>) utan jag vill lagra det i sessionen ($_SESSION).

När jag kör diverse tester och försöker lagra uppgifter på andra sidor så funkar det på den sidan att lagra det (även efter att sidan laddas om och koden för att göra detta är borta). Men så fort jag gör en redirect så uppstår felet.

Jag har testat något så basic som att lagra en text med ordet "test" i en sida som är helt tom (innehåller en session_start om ingen session finns) och sedan köra en redirect till index.php, men den är då borta igen.

Jag får ett sessions-id, sessionen är startad i alla instanser som behöver det, men variabeln töms mellan sidorna.

Vad kan vara felet?

PHP.ini:

https://www.dropbox.com/s/27v9ajg86033yxo/php.ini?dl=0

[Session] session.save_handler = files ;session.save_path = "/var/lib/php/sessions" session.use_strict_mode = 0 session.use_cookies = 1 ;session.cookie_secure = session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 0 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.referer_check = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

Dold text

Exempelkod

index.php

echo "<div id='debug'>"; if(isset($_COOKIE["PHPSESSID"])) echo "ID => " . session_id() . "<br>Data => "; if(isset($_SESSION['selected'])) echo json_encode($_SESSION['selected']); else echo "no data"; echo "</div>" ;

Output:
ID => u811ll227desdo083jmurds6p6
Data => no data

GET.php

$_SESSION["selected"] = $db->findOne($_POST['search_name']); header("location: http://{$_SERVER[HTTP_HOST]}"); exit();

Output:
$_SESSION["selected"] är tom efter sidan har redirect.
Om man inte kör redirect:
object(MongoDB\Model\BSONDocument)#17 (1) { ["storage":"ArrayObject":private]=> array(7) { ["_id"]=> object(MongoDB\BSON\ObjectID)#14 (1) { ["oid"]=> string(24) "59a6dfcbc07d284f5d67ea91" }

Utan att gå in mer i detalj på vad objektet faktiskt är.

Dold text

FYI:
Ny server uppsatt i VM, finns inget viktigt på den öht. Därför kan php.ini också se lite tunn ut.
Finns inga felmeddelanden alls, all loggning är på.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

session_start(); ?
Jag som läser slarvigt.

Gör ett minimalt test script från grunden och så ser du sen i din stora sida vart felet var.

Permalänk
Medlem
Permalänk
Medlem

ligger dom på samma domännamn? Samma server ja, men se till att du inte skickar ena förfrågan till localhost och den andra till 127.0.0.1 för då kommer dom försvinna. (har jag för mig)

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Medlem

Hur ser det ut i innehållet du får från phpinfo() istället php.ini? Risken finns att just den filen inte används eller att den inte tagit ändringarna eller liknande. Ger mer svart på vitt.

Permalänk
Medlem
Skrivet av Undie:

session_start(); ?
Jag som läser slarvigt.

Gör ett minimalt test script från grunden och så ser du sen i din stora sida vart felet var.

Hehe precis

Home, koden ligger innan all html i detta fall:

<?php ini_set('display_errors',1); error_reporting(E_ALL); if (session_status() == PHP_SESSION_NONE) { session_start(); } ?>

Sida 2 (bara för att testa):

require_once "vendor/autoload.php"; if (session_status() == PHP_SESSION_NONE) { session_start(); } $_SESSION["Sweclockers"] = "freddy";

Resultatet på home när jag printer värdet av sessionsvariabel "Sweclockers" null (objektet finns inte). Också en var_dump av innehållet av $_SESSION är "Noarray(0) { }" . Så det finns helt enkelt inget i den efter redirect.

Har följt flera förslag från SO, inget som har hjälpt dessvärre.

Skrivet av Haptic:

ligger dom på samma domännamn? Samma server ja, men se till att du inte skickar ena förfrågan till localhost och den andra till 127.0.0.1 för då kommer dom försvinna. (har jag för mig)

Nej, inget sådant förekommer. Redirects sker mot exakt IP i alla fallen. Även testat direkt mot filen och felet är ändå kvar. Verkar inte sitta i metoden för redirect iaf.

Skrivet av MrDoggo:

Hur ser det ut i innehållet du får från phpinfo() istället php.ini? Risken finns att just den filen inte används eller att den inte tagit ändringarna eller liknande. Ger mer svart på vitt.

https://pastebin.com/xTVm17Sn
eller för visning: https://www.dropbox.com/s/z16b5zaghr99uvo/phpinfo%28%29.html?...

Jag har förövrigt kontrollerat, då jag antog att det kunde ha med skriv+läs+kör-rättigheter från vart sessioner lagras, men felet är inte där. Det skapas sessioner med rätt id där.

Samtliga fel från "php --info | grep error":
display_errors => Off => Off
display_startup_errors => Off => Off
error_append_string => no value => no value
error_log => no value => no value
error_prepend_string => no value => no value
error_reporting => 22527 => 22527
html_errors => Off => Off
ignore_repeated_errors => Off => Off
log_errors => On => On
log_errors_max_len => 1024 => 1024
track_errors => Off => Off
xmlrpc_error_number => 0 => 0
xmlrpc_errors => Off => Off
opcache.error_log => no value => no value

Har även testat ominstallera PHP, Apache men inget av detta har gett resultat. Detta också med purge och bort med alla tidigare konfigurationer.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

Gjorde en intressant upptäckt att om man utför en session_write_close() innan header-redirect så sparas en variabel, men inte mitt objekt...

Så...

Data-output nu:
ID => 5kndd8k5uvtv0qudhsc3ngfj24
Data => no data
Noarray(2) { ["Action"]=> string(13) "Get by random" ["sel_item_by_mdb"]=> NULL }

Jag avrundar dagen här, en funktion som anropas (som fungerar) ser ut såhär från ett av anropen som görs mot en mongo-databas:

public function maskeratnamn(){ $items = $this->db->find(); $items = $items->toArray(); if(count($items) > 0){ $item = null; while(empty($item)) $item = $items[rand(0, count($items) -1)]; return $item; } return false; }

I exempelvis GET.php skulle man kunna anropa detta genom ett villkor och sedan
$_SESSION['sel_item_by_mdb'] = $db->maskeratnamn();

Data-output blir korrekt (som förväntat) och är av typen MongoDB\Model\BSONDocument, precis som förväntat.
Output kan kontrolleras i detta fall likt:

echo json_encode(var_dump($_SESSION['sel_item_by_mdb'])); //header("location: index.php"); session_write_close(); exit();

Där allt är perfekt, tills man gör redirect.

Jag gissar att någon form av serialisering måste ta plats innan objektet lagras i PHP....

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40