error message в serialize()

Ganer

Новичок
BUG в serialize()

RHEL3 + php 5.0.4/5.0.5
есть самопальная сесия, по register_shutdown_function запускается serialize() и сохраняется в файлик. перед тем как сохранить смотрю md5 от serailize(), хеш совпадает с тем что потом беру из файлика, но получаю
Notice: unserialize() [function.unserialize]: Error at offset 53771 of 55864 bytes

система паботает пару лет и вот впервые наткнулись на такие данные, которые serialize() неправильно сохраняет. причем интересно что если взять данные (базу) месячной давности то проблема не проявлятся.

что можно сделать в такой ситуации ?
 

svetasmirnova

маленький монстрик
Возможно причина совсем не в этом, но попробуй обновиться до 5.1 со snaps.php.net
 

tony2001

TeaM PHPClub
Ganer
багом это будет тогда, когда я воспроизведу.
до тех пор - это ошибка в твоем коде.

>что можно сделать в такой ситуации ?
сделать короткий reproduce case (20 строк макс.) и выслать его мне/выложить тут.
 

Ganer

Новичок
могу только файлик который уже неправильный выдать. сейчас обнаружили проблему еще в одном месте, там был OCI-CLOB Descriptor убираем его все в порядке. тут файлик поменьше.
щас на майл вышлю проблемный и без цлоба.

ЗЫ. в первой проблеме цлоба нет.

-~{}~ 22.09.05 13:36:

[root@sunv20z ses]# cat ses.php
<?php
error_reporting(E_ALL);
$file = "file2.dmp";
$fp = fopen($file, "r");
if (! $fp) {
return null;
}
$str = fread($fp, filesize($file));
fclose($fp);
$session =& unserialize($str);
var_dump($session) ;

?>
[root@sunv20z ses]# php ses.php

Notice: unserialize(): Error at offset 2466 of 3534 bytes in /tmp/ses/ses.php on line 10
bool(false)

файлик щас вышлю.
ЗЫ. нашли oci-lob и в первой проблеме, щас пробуем без него.
 

tony2001

TeaM PHPClub
internal objects нет смысла сериализовать.
и работать это в принципе не может и не будет, т.к. внутренние объекты обычно ассоциированы с некими ресурсами, которые в тексте не могут быть отражены.
 

Ganer

Новичок
я понимаю запрос в базу идет со * и все пихается в сесию, до этого понедельника это не создавало проблем, ни в пхп4 ни в 5-ом.
с понедельника на clob 2х конкретных записей вылетает, остальные сериализует нормально.
 

tony2001

TeaM PHPClub
еще раз, но более коротко:
не сериализуй OCI-Lob.
даже не пытайся.
 

Ganer

Новичок
у меня там 10мб кода, щас выяснять где * могли затронуть цлобы практически не реально :(
 

kvf77

Red Devil
Ganer

я думаю кода у тебя там стока нет - картинки - может быть :) кода врядли
 

Ganer

Новичок
млин а нельзя его пропускать, раз imposible зачем мне весь объект портить ?? ну на крайняк ошибку выдать, зачем же молча мусор возвращать ?
 

tony2001

TeaM PHPClub
нет, нельзя "пропускать".

-~{}~ 22.09.05 14:48:

"млин", документацию надо было раньше читать.
 

Ganer

Новичок
млин это кривизна
а) документации, что такое imposible - это невозможно, а не мусор по понедельникам.
б) реализации, раз уж нельзя - я должен был получить соответствующее сообщение, а не мусор по понедельникам и объект по вторникам.
 

tony2001

TeaM PHPClub
выстрелить себе в ногу и заявлять потом, что пистолет не должен был стрелять - это оригинально.
 

Ganer

Новичок
может я неверно перевел imposible ?
можно мне тогда подробно объяснить почему воприки заявлению в документации (It is not possible to serialize PHP built-in objects.) команда serialize() сериализует данный объект?
 

tony2001

TeaM PHPClub
объясняю.
потому, что нет никакого способа отличить built-in object от не-built-in(т.е. user defined).
 

Ganer

Новичок
а как отличает var_dump() ?
эта команда вполне коректно преобразовывает oci-lob объект в текст "resource(8) of type (oci8 descriptor)" .
 

tony2001

TeaM PHPClub
Ganer
ага. в одну сторону.
а в обратную как преобразовать?
где взять все те ресурсы, которые стоят за этим конкретным "oci8 descriptor" ?
 

Ganer

Новичок
например тут:
[oracle@sunv20z tmp]$ php clob.php
select KOMMENT, NAME from party_card where card_id=358121
array(2) {
[0]=>
object(OCI-Lob)#1 (1) {
["descriptor"]=>
resource(8) of type (oci8 descriptor)
}
[1]=>
string(15) "BETONS TT , SIA"
}
serialized string: string(77) "a:2:{i:0;O:7:"OCI-Lob":1:{s:10:"descriptor";i:0;}i:1;s:15:"BETONS TT , SIA";}"


unserialize result: bool(false)


[oracle@sunv20z tmp]$ cat clob.php
<?php


$conn = OCILogon("xxx","xxx","xxx");

$sql = "select KOMMENT, NAME from party_card where card_id=358121";
echo $sql ;
$stmt = OCIParse($conn, $sql);
OCIExecute($stmt);

$status = ocifetchinto($stmt, $row);

echo "\n" ;
$x = var_dump($row) ;

$ser = serialize($row) ;
echo "serialized string: ";
var_dump($ser);
echo "\n" ;
$un_ser = unserialize($ser) ;
echo "\n" ;
echo "unserialize result: ";
var_dump($un_ser);
?>

-~{}~ 22.09.05 16:57:

теперь чуть меняем запрс и у нас все получается
[oracle@sunv20z tmp]$ php clob.php
select KOMMENT, NAME from party_card where rownum=1
array(1) {
[1]=>
string(16) "AVERS CENTRS sia"
}
serialized string: string(34) "a:1:{i:1;s:16:"AVERS CENTRS sia";}"


unserialize result: array(1) {
[1]=>
string(16) "AVERS CENTRS sia"
}
 
Сверху