Php5 için PHP4 gelen geri çağrılarla oturumları göç garip davranışlar

2 Cevap php

I session_set_save_handler() php5 için kullandığı bir php4 uygulama göç etmek zorunda.

PHP4'te her şey iyiydi, ama php5 de arama işlevleri session_set_save_handler() denilen önce sayfadaki kuruldu, hangi artık küresel değişkenler erişemiyor.

Küresel var $ g1 Aşağıdaki örnekte session_writer() (bir geri çağırma işlevi olarak geçirildiği) erişilebilir olamaz

Bu davranışın bir açıklaması var mı yoksa 5 PHP4 gelen geri çağrılarla oturumları geçişle ilgili bir ipucu verebilir misiniz?

Bu sözde kodu:

function session_writer($id,$vars) {
  global $g1;
  echo "g1 not defined here: ".is_object($g1);
}

global $g1;
$g1 = SomeObject(); //which is the DB connection for the session writer

session_set_save_handler($o,$c,$r,"session_writer",$d,$g);
session_start();

2 Cevap

Bu aslında documentation not edilir:

PHP gibi yazma ve kapat eylemcileri nesne imha sonra denir 5.0.5 ve bu nedenle nesneleri kullanmak veya istisnalar atmak olamaz. Ancak nesne yıkıcılar oturumları kullanabilir.

Bu tavuk ve yumurta sorunu çözmek için yıkıcıdan session_write_close() çağırmak mümkündür.

Esasen, sizin SomeObject arasında yıkıcı, veya alternatif olarak, aşağıdakileri yapın gelen session_write_close() aramak gerekir:

<?php register_shutdown_function("session_write_close"); ?>

Bu çözümlerden birini Özgün geri çağırma işlevi tutmak için izin, tüm nesneleri tahrip edilmeden önce oturumun yazma ve kapanmasını zorlamak gerekir.

Molf cevabı sorunu tanımlar. Burada biraz daha bilgi bulunuyor:

session_write_close() bir tanımlayıcı ve onunla ilişkili verilerin girdi olarak alır. Eğer minimal değişiklik için gidiyoruz eğer, muhtemelen veri session_encode() ($ _SESSION dizinin içeriğini kodlayan bir dize olan) tarafından döndürülen ne olduğunu bilmek gerekir. Tanımlayıcı session_id() tarafından döndürülen budur.