|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #63838 class not found after reinstall pkg with yum
Submitted: 2012-12-23 07:10 UTC Modified: 2016-11-18 21:22 UTC
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: gxd305 at gmail dot com Assigned:
Status: Wont fix Package: APC (PECL)
PHP Version: 5.4.10 OS: CentOS 6.x
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Bug Type:
From: gxd305 at gmail dot com
New email:
PHP Version: OS:


 [2012-12-23 07:10 UTC] gxd305 at gmail dot com
We encountered a problem, after reinstalling a pkg with yum, there will be a lot 
of errors:
[Thu Dec 20 16:37:31 2012] [error] [client xxxxx] PHP Fatal error:  Class 
'YCL_Pay' not found in /xxx.php on line 141 

i found that there are two files have same mtime, and in the same directory.

after reinstalling the pkg, the inode changed while mtime not.

apc use devid + inode as the file cache key in system cache, then check mtime to 
see if the file is changed.

Coincidentally´╝îanother file 's inode after reinstall is same as the YCL_Pay.php 
's inode before, so the apc fetch the wrong cache entry.

so i add the filesize check in apc_cache_find_slot function to avoid this 

Test script:

* file: test.php
* first run: php -S
* then double wget the file.
*  wget '' && wget ''

$A = '<' . '?php class A{}';
$B = '<' . '?php class B{}';

$t = strtotime("2012-12-21 00:00:00");

file_put_contents('A.php', $A);
file_put_contents('B.php', $B);

// make sure the same mtime
touch ('A.php', $t);
touch ('B.php', $t);

include 'B.php';
include 'A.php';

// use a.php 's inode instead of B.php's
copy('A.php', 'A.php.bak');
copy('B.php', 'A.php');
rename('A.php', 'B.php');
rename("A.php.bak", 'A.php');

// make sure the same mtime
touch ('A.php', $t);
touch ('B.php', $t);


apc-3.1.13-st_size (last revision 2012-12-23 07:12 UTC by gxd305 at gmail dot com)

Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2012-12-27 19:01 UTC]
I'm not sure we should make that logic more complicated. The patch covers a very rare situation. But further more - if the file which replaces the inode has the same file size, here is the issue back. I'd say resetting cache is the best solution.
 [2012-12-27 19:01 UTC]
-Status: Open +Status: Analyzed
 [2012-12-27 20:22 UTC]
apc.stat_ctime was put in place to prevent the mtime update problems.

I suggest you try that instead.
 [2013-01-04 08:24 UTC] gxd305 at gmail dot com
to gopalv, unfortunately, both of the ctime are same in our situation.
to ab, yes, but the probability will be lower.
 [2016-11-18 21:22 UTC]
-Status: Analyzed +Status: Wont fix
 [2016-11-18 21:22 UTC]
APC is no longer supported in favor of opcache that comes bundled with PHP, if you wish to use the user cache, then look at PECL/APCu.
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Feb 25 03:01:28 2024 UTC