我正在尝试使用SplFileInfo
命令将一个serialize
实例数组存储在缓存中,但该命令会抛出此异常:
Exception' with message 'Serialization of 'SplFileInfo' is not allowed
为什么不允许?
谢谢!
注意:我只是好奇。问题本身可以解决。
答案 0 :(得分:9)
无法序列化基于Resources
的对象。
我想我不必解释原因(如果你需要解释告诉我,即使这个问题是OT)
对于不相信SplFileInfo不存储/打开新资源的@Charles,我制作了一个小测试脚本。
如果你运行:
new SplFileInfo('index.php');
$link=mysql_connect('localhost','root','');
echo $link;
输出为:资源ID#2
如果你运行:
//new SplFileInfo('index.php');
$link=mysql_connect('localhost','root','');
echo $link;
输出为:资源ID#1。
答案 1 :(得分:4)
如果您正在尝试构建要记住的文件列表,请从文件名构建列表。 如果您尝试在特定时间构建文件及其属性列表,请抓取这些属性并存储那些而不是对象。
*
请记住PHP caches the results of Here is the C file containing the underlying mechanisms for 当使用文件系统上的实体时,还有一些名为 这是 该文件还包含阻止 在PHP交互式提示中进一步揭穿资源问题SplFileInfo
无法序列化,因为PHP团队已将其标记为不可序列化。实际上,这并不奇怪: SplFileInfo
对象包含的唯一实际数据是文件名。类中的每个方法实际上都是非OO标准函数的包装器,它执行相同的操作。这些方法调用在调用时解析,而不是在创建对象时解析,因此序列化对象将不捕获文件的状态,就像它在序列化时一样。 / p>
stat
-based functions,因此不需要添加另一个缓存层。
SplFileInfo
and SplFileObject
。 SPL用于打开文件句柄的方法称为spl_filesystem_file_open
。如果您搜索该文件,您将看到四个对它的引用。一个是功能定义。一个是SplFileObject
的构造函数。一个是SplTempFileObject
的构造函数。SPL_FS_FILE
的定义。将SPL_FS_FILE
作为其中一个条件的switch语句是第四个也是最后一个spl_filesystem_file_open
调用。它位于一个名为spl_filesystem_object_create_type
的函数中,它创建了基于各种基于文件系统的SPL对象工作的实际内部结构。请注意,SPL_FS_FILE
案例正上方是SPL_FS_INFO
案例,处理SplFileInfo
案例,并注意该代码不包含文件句柄的情况。SplFileInfo
不包含文件句柄资源的具体证明。 SplFileInfo
被序列化的代码,将其标记为不可序列化...无需注释。织补。
[charles@duo ~/splfileinfo_test]$ touch a b c d e
[charles@duo ~/splfileinfo_test]$ php -a
Interactive shell
php > $fh_a = fopen('./a', 'r');
php > echo $fh_a; # should be 1
Resource id #2
php > # WHAT.
php > $fh_b = fopen('./b', 'r');
php > echo $fh_b; # should be ... uh ... 3 now?
Resource id #3
php > $fi_c = new SplFileInfo('./c');
php > $fh_d = fopen('./d', 'r');
php > echo $fh_d; # should be 4 if SplFileInfo has no internal resource
Resource id #4
php > exit
[charles@duo ~/splfileinfo_test]$ php -v
PHP 5.3.6 (cli) (built: Mar 19 2011 07:44:03)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans